我正在编写一个关于添加2个矩阵A和B的元素的简单代码;代码非常简单,它受到CUDA C Programming Guide第2章中给出的示例的启发。
#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命令有问题,我真的不知道它还能做什么。
有什么想法吗?
答案 0 :(得分:7)
MatAdd<<<numBlocks,threadsPerBlock>>>(pA,pB,pC);
代替MatAdd<<<numBlocks,threadsPerBlock>>>(A,B,C);
解决问题。
原因是A,B
和C
在CPU上分配,pA,pB
和pC
分配给GPU,使用CudaMalloc()
。分配pA,pB
和pC
后,值将通过cudaMemcpy(pA, A, (N*N)*sizeof(int), cudaMemcpyHostToDevice);
然后,在GPU上执行添加,即pA,pB
和pC
。要使用printf
,结果pC
将通过cudaMemcpy(C, pC, (N*N)*sizeof(int), cudaMemcpyDeviceToHost);
认为CPU无法看到pA
并且GPU无法看到A
。