簡體   English   中英

使用cudaMemcpy2D從設備到主機的CUDA復制陣列

[英]CUDA copying array from device to host using cudaMemcpy2D

cudaMemcpy2D不復制我期望的cudaMemcpy2D 閱讀有關cudaMallocPitch的手冊后,我嘗試編寫一些代碼以了解發生了什么。 但是,嗯,我遇到了問題。

我做了這樣的簡單程序:

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;
}

所以doStuffd_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覆蓋先前的數據。 我嘗試查找更改間距和寬度的問題,但不能。

那我的代碼怎么了?

錯誤在這一行:

    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無關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM