【问题标题】:Values of array after cudaMemcpycudaMemcpy 后数组的值
【发布时间】:2012-04-13 07:15:49
【问题描述】:

我想知道,当我调用 cudaMemcpy(...) 来获取 GPU 上的内存时,数组内的值是否也被复制。我会更好地解释:我将值从一个数组复制到另一个数组,然后调用 cudaMalloc 和 cudaMemcpy。

// Copying values of the arrays
for(int i = 0; i<16; i++){
    array_device_1[i] = array_host_1[i];
    array_device_2[i] = array_host_2[i];
}

// Memory allocation of array_device_1 and array_device_2
cudaMalloc((void**) &array_device_1, SIZE_INT*size);
cudaMalloc((void**) &array_device_2, SIZE_INT*size);

// Transfer array_device_1 and array_device_2
cudaMemcpy(array_device_1, array_host_1, SIZE_INT*size, cudaMemcpyHostToDevice);
cudaMemcpy(array_device_2, array_host_2, SIZE_INT*size, cudaMemcpyHostToDevice);

kernel<<<N, N>>>(array_device_1, array_device_2);

cudaMemcpy(array_host_1, array_device_1, SIZE_INT*size, cudaMemcpyDeviceToHost);
cudaMemcpy(array_host_2, array_device_2, SIZE_INT*size, cudaMemcpyDeviceToHost);

cudaFree(array_device_1);
cudaFree(array_device_2);

那么,当我执行所有这些指令并且我使用内核中的所有数组时,array_device_1 和 array_device_2 中的值是不是?我试图在内核之后打印出来,我注意到所有的数组都是空的!真的我无法理解如何将值保留在其中,然后使用内核函数更改它们的值。

【问题讨论】:

  • 您的// Copying values of the arrays 部分没有任何意义。您不能以这种方式将数据从主机复制到设备内存,这就是 cudaMemcpy 的用途!

标签: c++ c cuda


【解决方案1】:

是的,他们有自己的价值观。但是你不能在主机上打印出来。为此,您需要使用

复制您的数据
cudaMemcpy((void *) array_host_2, (void *) array_device_2, SIZE_INT*size, cudaMemcpyDeviceToHost);

然后你可以打印array_host_2的值。

更多解释:您的array_device_* 位于 GPU 上,而您的 CPU(即打印输出)无法直接访问此数据。因此,您需要先将其复制回您的 CPU 内存,然后再将其打印出来。

【讨论】:

  • 我在没有利用 GPU 部分的情况下测试了我的内核,我的意思是我测试了算法并且它运行良好。我真的无法解释我错过了什么
【解决方案2】:

将带有数据的数组复制到设备、更改内核中的值、复制回主机并打印新值的示例:

// Function to run on device by many threads
__global__ void myKernel(int *d_arr) {
    int idx = blockIdx.x * blockDim.x + threadIdx.x;
    d_arr[idx] = d_arr[idx]*2;
}

int main(void) {
    int *h_arr, *d_arr;
    h_arr = (int *)malloc(10*sizeof(int));
    for (int i=0; i<10; ++i)
        h_arr[i] = i; // Or other values

    // Sends data to device
    cudaMalloc((void**) &d_arr, 10*sizeof(int));
    cudaMemcpy(d_arr, h_arr, 10*sizeof(int), cudaMemcpyHostToDevice);

    // Runs kernel on device
    myKernel<<< 2, 5 >>>(d_arr);

    // Retrieves data from device 
    cudaMemcpy(h_arr, d_arr, 10*sizeof(int), cudaMemcpyDeviceToHost);

    for (int i = 0; i<10; ++i)
        printf("Post kernel value in h_arr[%d] is: %d\n", i,h_arr[i]);

    cudaFree(d_arr);
    free(h_arr);
    return 0;
}

【讨论】:

    【解决方案3】:

    您提供的代码 sn-p 似乎是正确的,除了 leftaroundabout 指出的前几行。你确定内核是正确的吗?也许您没有将修改后的值写回全局内存。如果您在运行内核之前制作另一组主机阵列并将 GPU 阵列复制回来,它们是否正确?根据您所拥有的, array_host_* 中的值应该已正确复制到 array_device_* 。

    【讨论】:

      【解决方案4】:

      您可以使用核函数直接在 GPU 内存上打印值。使用可以使用类似的东西:

      __global__ void printFunc(int *devArray){
            printf("%d", devArray[0]);
      } 
      

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 2015-10-14
        • 1970-01-01
        • 2014-11-07
        • 2011-08-02
        • 2013-05-12
        • 1970-01-01
        • 2013-07-20
        • 1970-01-01
        相关资源
        最近更新 更多