[問題] 使用CUDA來擷取矩陣中部分值

看板C_and_CPP (C/C++)作者 (aada)時間16年前 (2010/02/21 17:43), 編輯推噓3(307)
留言10則, 2人參與, 最新討論串1/10 (看更多)
請問一下, 我想使用CUDA來執行取矩陣中某一個範圍的值作為心的矩陣來運算, 例如, 有一個矩陣A, 取出矩陣A的部分作為矩陣B, 以及矩陣C 矩陣 A 矩陣 B 矩陣 c 0 1 2 3 1 2 3 0 1 2 4 5 6 7 5 6 7 4 5 6 8 9 10 11 9 10 11 8 9 10 12 13 14 15 13 14 15 12 13 14 我把C大致上功能是寫好了, 想要改成CUDA, 一直沒成功, 想請教板上大大, CUDA是否能這樣做 float *B; B = (float*) malloc( sizeof(float)*3*4 ); for( int i=1; i<3; i++ ) { for( int j=0; j<4; j++ ) { kk = i-1; B[ kk*NNy+j ] = A[ i*NNy+j ]; } } float C C= (float*) malloc( sizeof(float)*3*4); for( int i=0; i<3; i++ ) { for( int j=0; j<4; j++ ) { C[ i*NNy+j ] = A[ i*NNy+j ]; } } ---------------------------------- __global__ void movaIM11(float *input1, float *output1) { int col = blockIdx.x*blockDim.x+threadIdx.x; // x 表示 column int row = blockIdx.y*blockDim.y+threadIdx.y; // y 表示 row output1[row*NNx+col] = input1[row*NNx+col]; } float *d_A; cudaMalloc((void**)&d_A, sizeof(float)*NNx*NNy); cudaMemcpy( d_A, A, sizeof(float)*NNx*NNy, cudaMemcpyHostToDevice ); float* d_B; cudaMalloc((void**)&d_B, sizeof(float)*(NNx-1)*NNy); movaIM11<<<1, 12>>>( d_A, d_B); float *B; B = (float*) malloc( sizeof(float)*(NNx-1)*NNy ); cudaMemcpy( B, d_B, sizeof(float)*(NNx-1)*NNy, cudaMemcpyDeviceToHost ); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.122.192.147

02/21 19:04, , 1F
device上的code是不能用malloc的
02/21 19:04, 1F

02/21 19:25, , 2F
嗯嗯, 我是想說是否有辦法使用CUDA來完成上面的程式
02/21 19:25, 2F

02/21 20:09, , 3F
先在host把空間malloc好 再呼叫CUDA搬移矩陣
02/21 20:09, 3F

02/21 20:12, , 4F
我目前是在host上molloc好矩陣A,然後由CUDA來處理矩陣B
02/21 20:12, 4F

02/21 20:14, , 5F
我要如何在kernel中來表示搬移的寫法
02/21 20:14, 5F

02/21 20:20, , 6F
因為device不能使用malloc 所以A,B,C都由host做malloc
02/21 20:20, 6F

02/21 20:20, , 7F
之後的矩陣搬移才交給CDUA處理
02/21 20:20, 7F
※ 編輯: aada 來自: 140.122.192.147 (02/21 20:24)

02/21 20:25, , 8F
嗯嗯,我都是在host上malloc,搬移給CUDA處理
02/21 20:25, 8F

02/21 20:26, , 9F
至於搬移的動作, kernel應該要怎麼來寫, 目前上面的kernel
02/21 20:26, 9F

02/21 20:26, , 10F
是把全部都般鍋去
02/21 20:26, 10F
文章代碼(AID): #1BWG1PZA (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1BWG1PZA (C_and_CPP)