2016-04-27 249 views
1

cudaMemcpy2D不会复制我期望的内容。在阅读有关cudaMallocPitch的手册后,我尝试编写一些代码来了解发生了什么。但是,我遇到了问题。CUDA使用cudaMemcpy2D将数组从设备复制到主机

我做了简单的程序是这样的:

int main() 
{ 
    double *d_A; 
    size_t d_pitch; 

    cudaMallocPitch((void**)&d_A, &d_pitch, sizeof(double) * SIZE, SIZE); 

    dim3 blocks(4, 4); 
    dim3 threads(16, 16); 

    doStuff<<<blocks, threads>>>(d_A, d_pitch); 

    double *A; 
    size_t pitch = sizeof(double) * SIZE; 

    A = (double*)malloc(sizeof(double) * SIZE * SIZE); 

    cudaMemcpy2D(A, pitch, d_A, d_pitch, sizeof(double) * SIZE, SIZE, cudaMemcpyDeviceToHost); 

    for (int i = 0; i < SIZE; i++) { 
     for (int j = 0; j < SIZE; j++) printf("%f ", A[sizeof(double) * i + j]); 
     printf("\n"); 
    } 
} 

doStuff是:

__global__ void doStuff(double *d_A, size_t d_pitch) 
{ 
    unsigned int i = blockIdx.x * blockDim.x + threadIdx.x; 
    unsigned int j = blockIdx.y * blockDim.y + threadIdx.y; 
    double *target = ((double*)(((char*)d_A) + (d_pitch * i))) + j; 

    if (i < SIZE && j < SIZE) 
     *target = (i + 1) * (j + 1) + 0.0; 
} 

所以doStuff是一样d_A[i][j] = (i+1)*(j+1)。如果SIZE是5,我期望的是:

1 2 3 4 5 
2 4 6 8 10 
3 6 9 12 15 
4 8 12 16 20 
5 10 15 20 25 

双精度。然而,当我编译和运行,我得到:

1 2 3 4 5 
8 10 3 6 9 
8 12 16 20 5 
25 0 0 0 0 
0 0 0 0 0 

看来,对于每一行,cudaMemcpy2D覆盖以前的数据。我试图找到改变音高和宽度的问题,但我不能。

那么我的代码是怎么回事?

回答

2

的错误是在这一行:

for (int j = 0; j < SIZE; j++) printf("%f ", A[sizeof(double) * i + j]); 

它应该是:

for (int j = 0; j < SIZE; j++) printf("%f ", A[SIZE * i + j]); 

要缩放行索引(i)由一排中的元素大小(而非以字节为单位的元素大小)。

这与CUDA当然无关。

+0

哇......真的很尴尬:(你说得对,其实我还有一个问题,但它不关心这个问题,所以我宁愿再问一次,谢谢你注意我的错误:D – kasty

相关问题