/************************************************************************** ¿¿/¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ 1. ¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ 2. ¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ 3. ¿¿rc_fun_rec rc_fun_tab¿¿¿¿¿¿¿¿¿¿¿¿¿õ¿¿¿¿ ¿¿¿¿¿õ¿¿¿¿¿¿¿¿¿¿¿¿¿¿õ¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ ***************************************************************************/ /* ¿¿¿¿201209054233 ¿¿¿¿¿¿¿¿¿¿¿¿¿¿ */ #include #include #include "rowcol.h" #include /* ¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ */ /* ¿¿¿¿¿¿¿¿¿¿¿ÿ¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ò¿¿¿¿¿ ¿¿¿¿¿¿¿¿¿¿2¿¿¿¿¿¿¿¿¿¿¿õ¿¿¿¿¿ */ void c_sum(matrix_t M, vector_t rowsum, vector_t colsum) { int i,j; for (j = 0; j < N; j++) { colsum[j] = 0; for (i = 0; i < N; i++) colsum[j] += M[i][j]; } } /* ¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ */ /* ¿¿¿¿¿¿¿¿¿¿¿ÿ¿¿¿¿ÿ¿¿¿¿¿¿ */ void rc_sum(matrix_t M, vector_t rowsum, vector_t colsum) { int i,j; for (i = 0; i < N; i++) { rowsum[i] = colsum[i] = 0; for (j = 0; j < N; j++) { rowsum[i] += M[i][j]; colsum[i] += M[j][i]; } } } /* ¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ÿ¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿, COL/ROWCOL, "¿¿¿¿¿¿¿¿¿"¿¿ COL¿¿¿¿ú¿¿¿¿¿¿¿¿¿¿¿ÿ¿¿¿¿¿ ROWCOL¿¿¿¿ú¿¿¿¿¿¿¿ÿ¿¿¿¿ÿ¿¿¿¿¿ ¿¿¿¿¿¿¿¿¿¿õ¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ ¿¿¿¿ {my_c_sum1, "¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿"}, {my_rc_sum2, "¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿"}, */ rc_fun_rec rc_fun_tab[] = { /* ¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ */ {c_sum, COL, "Best column sum"}, /* ¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ */ {rc_sum, ROWCOL, "Best row and column sum"}, {c_sum, COL, "Column sum, reference implementation"}, {rc_sum, ROWCOL, "Row and column sum, reference implementation"}, /* ¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ */ {NULL,ROWCOL,NULL} }; // /************************************************************************** // ÐÐ/ÁÐÇóºÍº¯Êý¡£°´ÏÂÃæµÄÒªÇó±à¼­´ËÎļþ£º // 1. ½«ÄãµÄѧºÅ¡¢ÐÕÃû£¬ÒÔ×¢Ê͵ķ½Ê½Ð´µ½ÏÂÃæ£» // 2. ʵÏÖ²»Í¬°æ±¾µÄÐÐÁÐÇóºÍº¯Êý£» // 3. ±à¼­rc_fun_rec rc_fun_tabÊý×飬½«ÄãµÄ×îºÃµÄ´ð°¸ // £¨×îºÃµÄÐкÍÁÐÇóºÍ¡¢×îºÃµÄÁÐÇóºÍ£©×÷ΪÊý×éµÄǰÁ½Ïî // ***************************************************************************/ // // /* // ѧºÅ£º202302723005 // ÐÕÃû£º³Ì¾°Óä // */ // // // #include // #include // #include "rowcol.h" // #include // #include // // /* ²Î¿¼µÄÁÐÇóºÍº¯ÊýʵÏÖ */ // /* ¼ÆËã¾ØÕóÖеÄÿһÁеĺ͡£Çë×¢Òâ¶ÔÓÚÐкÍÁÐÇóºÍÀ´Ëµ£¬µ÷ÓòÎÊýÊÇ // Ò»ÑùµÄ£¬Ö»ÊǵÚ2¸ö²ÎÊý²»»áÓõ½¶øÒÑ // */ // // void c_sum(matrix_t M, vector_t rowsum, vector_t colsum) // { // int i,j; // for (j = 0; j < N; j++) { // colsum[j] = 0; // for (i = 0; i < N; i++) // colsum[j] += M[i][j]; // } // } // // // /* ²Î¿¼µÄÁкÍÐÐÇóºÍº¯ÊýʵÏÖ */ // /* ¼ÆËã¾ØÕóÖеÄÿһÐС¢Ã¿Ò»Áеĺ͡£ */ // // void rc_sum(matrix_t M, vector_t rowsum, vector_t colsum) // { // int i,j; // for (i = 0; i < N; i++) { // rowsum[i] = colsum[i] = 0; // for (j = 0; j < N; j++) { // rowsum[i] += M[i][j]; // colsum[i] += M[j][i]; // } // } // } // // /* CUDAÓÅ»¯µÄÁÐÇóºÍº¯Êý */ // void cuda_c_sum(matrix_t M, vector_t rowsum, vector_t colsum) // { // // ·ÖÅäÉ豸ÄÚ´æ // int *d_M, *d_colsum; // cudaMalloc(&d_M, N * N * sizeof(int)); // cudaMalloc(&d_colsum, N * sizeof(int)); // // // ½«Êý¾Ý´ÓÖ÷»ú¸´ÖƵ½É豸 // cudaMemcpy(d_M, M, N * N * sizeof(int), cudaMemcpyHostToDevice); // // // ¶¨ÒåCUDAºËº¯Êý // dim3 blockDim(256); // dim3 gridDim((N + blockDim.x - 1) / blockDim.x); // // // Æô¶¯ºËº¯Êý // cudaColumnSum<<>>(d_M, d_colsum); // // // ½«½á¹û´ÓÉ豸¸´ÖÆ»ØÖ÷»ú // cudaMemcpy(colsum, d_colsum, N * sizeof(int), cudaMemcpyDeviceToHost); // // // ÊÍ·ÅÉ豸ÄÚ´æ // cudaFree(d_M); // cudaFree(d_colsum); // } // // /* CUDAÓÅ»¯µÄÐÐÁÐÇóºÍº¯Êý */ // void cuda_rc_sum(matrix_t M, vector_t rowsum, vector_t colsum) // { // // ·ÖÅäÉ豸ÄÚ´æ // int *d_M, *d_rowsum, *d_colsum; // cudaMalloc(&d_M, N * N * sizeof(int)); // cudaMalloc(&d_rowsum, N * sizeof(int)); // cudaMalloc(&d_colsum, N * sizeof(int)); // // // ½«Êý¾Ý´ÓÖ÷»ú¸´ÖƵ½É豸 // cudaMemcpy(d_M, M, N * N * sizeof(int), cudaMemcpyHostToDevice); // // // ¶¨ÒåCUDAºËº¯Êý // dim3 blockDim(256); // dim3 gridDim((N + blockDim.x - 1) / blockDim.x); // // // Æô¶¯ºËº¯Êý // cudaRowColSum<<>>(d_M, d_rowsum, d_colsum); // // // ½«½á¹û´ÓÉ豸¸´ÖÆ»ØÖ÷»ú // cudaMemcpy(rowsum, d_rowsum, N * sizeof(int), cudaMemcpyDeviceToHost); // cudaMemcpy(colsum, d_colsum, N * sizeof(int), cudaMemcpyDeviceToHost); // // // ÊÍ·ÅÉ豸ÄÚ´æ // cudaFree(d_M); // cudaFree(d_rowsum); // cudaFree(d_colsum); // } // // /* CUDAºËº¯Êý - ÁÐÇóºÍ */ // __global__ void cudaColumnSum(int *M, int *colsum) // { // int col = blockIdx.x * blockDim.x + threadIdx.x; // if (col < N) { // colsum[col] = 0; // for (int row = 0; row < N; row++) { // colsum[col] += M[row * N + col]; // } // } // } // // /* CUDAºËº¯Êý - ÐÐÁÐÇóºÍ */ // __global__ void cudaRowColSum(int *M, int *rowsum, int *colsum) // { // int idx = blockIdx.x * blockDim.x + threadIdx.x; // if (idx < N) { // // ¼ÆËãÐÐºÍ // rowsum[idx] = 0; // for (int j = 0; j < N; j++) { // rowsum[idx] += M[idx * N + j]; // } // // // ¼ÆËãÁÐºÍ // colsum[idx] = 0; // for (int i = 0; i < N; i++) { // colsum[idx] += M[i * N + idx]; // } // } // } // // /* // Õâ¸ö±í¸ñ°üº¬¶à¸öÊý×éÔªËØ£¬Ã¿Ò»×éÔªËØ£¨º¯ÊýÃû×Ö, COL/ROWCOL, "ÃèÊö×Ö·û´®"£© // COL±íʾ¸Ãº¯Êý½ö½ö¼ÆËãÿһÁÐµÄºÍ // ROWCOL±íʾ¸Ãº¯Êý¼ÆËãÿһÐС¢Ã¿Ò»ÁÐµÄºÍ // ½«ÄãÈÏΪ×îºÃµÄÁ½¸öʵÏÖ£¬·ÅÔÚ×îÇ°Ãæ¡£ // ±ÈÈ磺 // {my_c_sum1, "³¬¼¶À¬»øÁÐÇóºÍʵÏÖ"}, // {my_rc_sum2, "ºÃÒ»µãµÄÐÐÁÐÇóºÍʵÏÖ"}, // */ // // rc_fun_rec rc_fun_tab[] = // { // // /* µÚÒ»ÏӦµ±ÊÇÄãдµÄ×îºÃÁÐÇóºÍµÄº¯ÊýʵÏÖ */ // {cuda_c_sum, COL, "CUDA optimized column sum"}, // /* µÚ¶þÏӦµ±ÊÇÄãдµÄ×îºÃÐÐÁÐÇóºÍµÄº¯ÊýʵÏÖ */ // {cuda_rc_sum, ROWCOL, "CUDA optimized row and column sum"}, // // {c_sum, COL, "Column sum, reference implementation"}, // // {rc_sum, ROWCOL, "Row and column sum, reference implementation"}, // // /* ÏÂÃæµÄ´úÂë²»ÄÜÐ޸ĻòÕßɾ³ý£¡£¡±íÃ÷Êý×éÁбí½áÊø */ // {NULL,ROWCOL,NULL} // };