cudaMemcpy之后的数组值

时间:2012-03-29 15:42:28

标签: c++ c cuda

我想知道,当我调用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中的值是不是?我尝试在内核后打印出来,我注意到所有数组都是空的!真的我无法理解如何将值保留在其中,然后使用内核函数更改它们的值。

4 个答案:

答案 0 :(得分:4)

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

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

然后您可以打印array_host_2

的值

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

// 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 :(得分:0)

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

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

希望有帮助。