2014-11-03 62 views
5

我正在寫一個關於添加2個矩陣A和B的元素的簡單代碼;代碼非常簡單,它的啓發來自CUDA C Programming Guide第2章給出的例子。如何使用CUDA C添加矩陣C

#include <stdio.h> 
#include <stdlib.h> 

#define N 2 

__global__ void MatAdd(int A[][N], int B[][N], int C[][N]){ 
      int i = threadIdx.x; 
      int j = threadIdx.y; 

      C[i][j] = A[i][j] + B[i][j]; 
     } 


int main(){ 

int A[N][N] = {{1,2},{3,4}}; 
int B[N][N] = {{5,6},{7,8}}; 
int C[N][N] = {{0,0},{0,0}};  

int (*pA)[N], (*pB)[N], (*pC)[N]; 

cudaMalloc((void**)&pA, (N*N)*sizeof(int)); 
cudaMalloc((void**)&pB, (N*N)*sizeof(int)); 
cudaMalloc((void**)&pC, (N*N)*sizeof(int)); 

cudaMemcpy(pA, A, (N*N)*sizeof(int), cudaMemcpyHostToDevice); 
cudaMemcpy(pB, B, (N*N)*sizeof(int), cudaMemcpyHostToDevice); 
cudaMemcpy(pC, C, (N*N)*sizeof(int), cudaMemcpyHostToDevice); 

int numBlocks = 1; 
dim3 threadsPerBlock(N,N); 
MatAdd<<<numBlocks,threadsPerBlock>>>(A,B,C); 

cudaMemcpy(C, pC, (N*N)*sizeof(int), cudaMemcpyDeviceToHost); 

int i, j; printf("C = \n"); 
for(i=0;i<N;i++){ 
    for(j=0;j<N;j++){ 
     printf("%d ", C[i][j]); 
    } 
    printf("\n"); 
} 

cudaFree(pA); 
cudaFree(pB); 
cudaFree(pC); 

printf("\n"); 

return 0; 
} 

當我運行它,我不斷收到初始矩陣C = [0 0; 0 0]而不是添加2個矩陣A和B的元素(i,j);我以前做過關於添加兩個數組元素的另一個例子,它似乎工作正常;然而這次我不知道爲什麼它不起作用。

我相信cudaMalloc命令出了問題,我真的不知道還有什麼可能。

任何想法?

+4

首先添加[適當的cuda錯誤檢查](http://stackoverflow.com/questions/14038589/what-is-the-canonical-way-to-check-for-errors-using-the-cuda-runtime -api)到您的代碼。您在設備上創建2D矩陣的方法不會按原樣運行。由於在設備上創建2D矩陣時遇到困難,因此經常建議您避免此問題,並將矩陣平鋪爲1D,並使用索引/指針算術來模擬2D訪問。 (你的指針分配「pA」等等,目前基本上都是一維的。) – 2014-11-03 16:09:31

+2

你可以試試'MatAdd <<< numBlocks,threadsPerBlock >>>(pA,pB,pC);'? – francis 2014-11-03 17:10:51

回答

4

MatAdd<<<numBlocks,threadsPerBlock>>>(pA,pB,pC);而不是MatAdd<<<numBlocks,threadsPerBlock>>>(A,B,C);解決了這個問題。

的原因是A,BC被分配在CPU上,而pA,pBpC分配GPU的使用CudaMalloc()。一旦pA,pBpC被分配,該值由cudaMemcpy(pA, A, (N*N)*sizeof(int), cudaMemcpyHostToDevice);

然後從CPU到GPU發送時,相加在GPU上執行的,也就是與pA,pBpC。要使用printf,結果pC從GPU到CPU通過cudaMemcpy(C, pC, (N*N)*sizeof(int), cudaMemcpyDeviceToHost);

發想的那樣,如果CPU不能看到pA和GPU無法看到A

+0

現在,我讀到這是非常清楚的...非常感謝你幫助我! – 2014-11-03 17:43:14