我對於2D陣列使用cudaMallocPitch
和cudaMemcpy2D
。即使無法正確輸出,我也不確定是否編碼正確。任何人都可以幫忙嗎?任何一個可以調試我的錯誤?提前致謝。CUDA 2D陣列nvidia
#include<stdio.h>
#include<cuda.h>
#define siz 4*sizeof(int)
__global__ void addmatrix(int *m1,int *m2,size_t pitch)
{
int r=threadIdx.x;
int *r1=m1+r*pitch;
int *r2=m2+r*pitch;
int c;
for(c=1;c<=4;c++)
{
r1[c]+=r2[c];
}
}
int main()
{
int i,j;
int **m1_c,**m2_c;
int *m1_d,*m2_d;
size_t pitch;
cudaError_t err;
m1_c=(int **)malloc(4*sizeof(int *));
for(i=1;i<=4;i++)
{
m1_c[i]=(int *)malloc(siz);
}
m2_c=(int **)malloc(4*sizeof(int *));
for(i=1;i<=4;i++)
{
m2_c[i]=(int *)malloc(siz);
}
for(i=1;i<=4;i++)
{
for(j=1;j<=4;j++)
{
m1_c[i][j]=rand()%10;
m2_c[i][j]=rand()%10;
}
}
for(i=1;i<=4;i++)
{
for(j=1;j<=4;j++)
{
printf("%d\t",m1_c[i][j]);
}
printf("\n");
}
printf("\n\n");
for(i=1;i<=4;i++)
{
for(j=1;j<=4;j++)
{
printf("%d\t",m2_c[i][j]);
}
printf("\n");
}
err=cudaMallocPitch((void **)&m1_d,&pitch,siz,siz);
err=cudaMallocPitch((void **)&m2_d,&pitch,siz,siz);
err=cudaMemcpy2D(m1_d,pitch,m1_c,siz,siz,4,cudaMemcpyHostToDevice);
err=cudaMemcpy2D(m2_d,pitch,m2_c,siz,siz,4,cudaMemcpyHostToDevice);
dim3 grid(1);
dim3 block(16);
addmatrix<<<grid,block>>>(m1_d,m2_d,siz);
cudaMemcpy2D(m1_c,siz,m1_d,pitch,siz,4,cudaMemcpyDeviceToHost);
for(i=1;i<=4;i++)
{
for(j=1;j<=4;j++)
{
printf("%d\t",m1_c[i][j]);
}
printf("\n");
}
err=cudaFree(m1_d);
err=cudaFree(m2_d);
err=cudaDeviceReset();
}
你可以包括你所得到的錯誤? – Ren 2013-04-04 08:43:13
如果你需要幫助解決你的問題,你將不得不提供一個更好的描述你的問題。 「無法正確地獲得輸出」幾乎沒有足夠的信息來幫助你。究竟發生了什麼?你認爲應該發生什麼?爲什麼不檢查每個CUDA API函數的返回值?您使用的是CUDA版本,GPU和操作系統?這些是某些人在回答您的問題之前需要知道的最佳答案的種類 – talonmies 2013-04-04 11:00:07
您的代碼至少有兩個問題。您無法將指向2D數組的指針傳遞給cudaMemcpy2D。你應該閱讀[它做了什麼](http://docs.nvidia.com/cuda/cuda-runtime-api/index.html#group__CUDART__MEMORY_1g17f3a55e8c9aef5f90b67cdf22851375)以及它期望的參數類型。對於cudaMemcpy2D,兩個指針都是指向內存的指針,但是您將一個指針傳遞給內存,並將一個指針傳遞給指向內存的指針。第二個問題是你所有的數組索引都是從1開始而不是從0開始。也許你不明白C數組索引的基本知識。 – 2013-04-04 17:20:09