看板 C_and_CPP 關於我們 聯絡資訊
請問一下L大, 我試著將矩陣A(2M*2N)的第一行與第一列加入0值獲得矩陣B, 我直接宣告出一個(2M+1*2N+1)大小的0矩陣, 接著將矩陣A貼到矩陣B上, 以及試著將它參數化(想要做512x512矩陣), 但我寫的kernel function好像沒辦法, 謝謝 矩陣A 矩陣B 1 2 3 4 0 0 0 0 0 5 6 7 8 0 1 2 3 4 9 10 11 12 0 5 6 7 8 13 14 15 16 0 9 10 11 12 0 13 14 15 16 // Code #include <stdio.h> #include <stdlib.h> #include <string.h> #include <cuda_runtime.h> #include <cutil.h> #include <math.h> #define NNx 6 #define NNy 6 #define BLOCK_SIZE 16 #define ALIGN 3 // 對齊printf用 __global__ void cu_b1( float *input1, float *input2 ) { int col = blockIdx.x*blockDim.x+threadIdx.x; int row = blockIdx.y*blockDim.y+threadIdx.y; input1[row*(NNx*2+1)+col] = 0; if( col < NNx*2 && row < NNy*2 ) { input1[ (NNx*2+1)*(row+1)+col+1 ] = input2[ row*(NNx*2)+col ]; //input1[ (NNx*2+1)*(row+1)+col+1 ] = row*(NNx*2)+col; //^^^^^^^^^^^^^^^^ // 如果我寫這樣的話他會把row*(NNx*2)+col所有數值貼上去,代表之後input2的位置 但如果加上input2[row*(NNx*2)+col]的話,而無法將input2的值貼上去, 我這樣寫應該沒有錯吧,想不太通.. } } // ===================== 主程式 ===================== // int main(int argc, char* argv[]) { //____ input ____ // float *input; input = (float*) malloc( sizeof(float)*(NNx*2)*(NNy*2) ); for(int i = 0; i < (NNx*2)*(NNy*2); i++) { input[i] = i; } float *d_input; cudaMalloc( (void**)&d_input, sizeof(float)*(NNx*2)*(NNy*2) ); cudaMemcpy( d_input, input, sizeof(float)*(NNx*2)*(NNy*2), cudaMemcpyHostToDevice ); // _________ 補零 _________ // int bx_b1 = ((NNx*2) + BLOCK_SIZE - 1) / BLOCK_SIZE; int by_b1 = ((NNy*2) + BLOCK_SIZE - 1) / BLOCK_SIZE; dim3 blocks_b1(bx_b1,by_b1); dim3 threads(BLOCK_SIZE,BLOCK_SIZE); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 我這邊設定的thread數量與處理矩陣 是一樣的 float *d_b1; cudaMalloc( (void**)&d_b1, sizeof(float)*(NNx*2+1)*(NNy*2+1) ); cu_b1<<<blocks_b1, threads>>>( d_b1, d_input ); float *b1; b1 = (float*) malloc( sizeof(float)*(NNx*2+1)*(NNy*2+1) ); cudaMemcpy( b1, d_b1, sizeof(float)*(NNx*2+1)*(NNy*2+1), cudaMemcpyDeviceToHost ); // ____ input ____// printf("input"); for(int i = 0; i < (NNx*2)*(NNy*2); i++) { if(i % (NNx*2) == 0) printf("\n"); else printf(" "); printf("%3.0f", input[i]); } printf("\n\n"); // ____ b1 ____// printf("b1"); for(int i = 0; i < (NNx*2+1)*(NNy*2+1); i++) { if(i % (NNx*2+1) == 0) printf("\n"); else printf(" "); printf("%3.0f", b1[i]); } printf("\n"); system("pause"); return 0; } 請問一下L大, 我試著將矩陣A(2M*2N)的第一行與第一列加入0值獲得矩陣B, 我直接宣告出一個(2M+1*2N+1)大小的0矩陣, 接著將矩陣A貼到矩陣B上, 以及試著將它參數化(想要做512x512矩陣), 但我寫的kernel function好像沒辦法, 謝謝 矩陣A 矩陣B 1 2 3 4 0 0 0 0 0 5 6 7 8 0 1 2 3 4 9 10 11 12 0 5 6 7 8 13 14 15 16 0 9 10 11 12 0 13 14 15 16 // Code #include <stdio.h> #include <stdlib.h> #include <string.h> #include <cuda_runtime.h> #include <cutil.h> #include <math.h> #define NNx 6 #define NNy 6 #define BLOCK_SIZE 16 #define ALIGN 3 // 對齊printf用 __global__ void cu_b1( float *input1, float *input2 ) { int col = blockIdx.x*blockDim.x+threadIdx.x; int row = blockIdx.y*blockDim.y+threadIdx.y; input1[row*(NNx*2+1)+col] = 0; if( col < NNx*2 && row < NNy*2 ) { input1[ (NNx*2+1)*(row+1)+col+1 ] = input2[ row*(NNx*2)+col ]; //input1[ (NNx*2+1)*(row+1)+col+1 ] = row*(NNx*2)+col; //^^^^^^^^^^^^^^^^ // 如果我寫這樣的話他會把row*(NNx*2)+col所有數值貼上去(代表input2將會列印 的位置),但如果加上input2[row*(NNx*2)+col]的話,而無法將input2的值貼上去 // 我這樣寫應該沒有錯吧,想不通.. } } // ===================== 主程式 ===================== // int main(int argc, char* argv[]) { //____ input ____ // float *input; input = (float*) malloc( sizeof(float)*(NNx*2)*(NNy*2) ); for(int i = 0; i < (NNx*2)*(NNy*2); i++) { input[i] = i; } float *d_input; cudaMalloc( (void**)&d_input, sizeof(float)*NNx*NNy ); cudaMemcpy( d_input, input, sizeof(float)*NNx*NNy, cudaMemcpyHostToDevice ); // _________ 補零 _________ // int bx_b1 = ((NNx*2) + BLOCK_SIZE - 1) / BLOCK_SIZE; int by_b1 = ((NNy*2) + BLOCK_SIZE - 1) / BLOCK_SIZE; dim3 blocks_b1(bx_b1,by_b1); float *d_b1; cudaMalloc( (void**)&d_b1, sizeof(float)*(NNx*2+1)*(NNy*2+1) ); cu_b1<<<blocks_b1, threads>>>( d_b1, d_input ); float *b1; b1 = (float*) malloc( sizeof(float)*(NNx*2+1)*(NNy*2+1) ); cudaMemcpy( b1, d_b1, sizeof(float)*(NNx*2+1)*(NNy*2+1), cudaMemcpyDeviceToHost ); // ____ input ____// printf("input"); for(int i = 0; i < (NNx*2)*(NNy*2); i++) { if(i % (NNx*2) == 0) printf("\n"); else printf(" "); printf("%3.0f", input[i]); } printf("\n\n"); // ____ b1 ____// printf("b1"); for(int i = 0; i < (NNx*2+1)*(NNy*2+1); i++) { if(i % (NNx*2+1) == 0) printf("\n"); else printf(" "); printf("%3.0f", b1[i]); } printf("\n"); system("pause"); return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.122.192.147 ※ 編輯: aada 來自: 140.122.192.147 (03/01 20:07) ※ 編輯: aada 來自: 140.122.192.147 (03/01 20:16)