如何使用CUDA C进行矩阵加法

Fed*_*ile 5 c cuda nvidia matrix

我正在写一个简单的代码,关于添加2个矩阵A和B的元素; 代码非常简单,它的灵感来自于CUDA C编程指南第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;
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我一直得到初始矩阵C = [0 0; 0 0]而不是添加2个矩阵A和B的元素(i,j); 我以前做了另一个关于添加两个数组的元素的例子,它似乎工作得很好; 但这次我不知道为什么它不起作用.

我相信cudaMalloc命令有问题,我真的不知道它还能做什么.

有任何想法吗?

fra*_*cis 7

MatAdd<<<numBlocks,threadsPerBlock>>>(pA,pB,pC);而不是MatAdd<<<numBlocks,threadsPerBlock>>>(A,B,C);解决问题.

其原因是A,BCCPU上分配,而pA,pBpC分配GPU的使用CudaMalloc().一旦pA,pBpC分配,该值是从CPU通过发送至GPUcudaMemcpy(pA, A, (N*N)*sizeof(int), cudaMemcpyHostToDevice);

然后,在GPU上执行添加,即使用pA,pBpC.要使用printf,结果pC将通过GPU发送到CPUcudaMemcpy(C, pC, (N*N)*sizeof(int), cudaMemcpyDeviceToHost);

认为好像CPU看不到pA,GPU看不到A.