cudaMemcpy之后数组的值



我想知道,当我调用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中的值是不是?我试着在内核之后打印出来,我注意到所有的数组都是空的!真的,我不明白我怎么能把这些值保存在里面,然后用内核函数改变它们的值。

是的,它们有自己的值。但是你不能在主机上打印出来。为此,您需要使用将数据复制回

cudaMemcpy((void *) array_host_2, (void *) array_device_2, SIZE_INT*size, cudaMemcpyDeviceToHost);

然后可以打印array_host_2的值。

更多的解释:你的array_device_*生活在GPU上,从你的CPU(打印你的输出)你不能直接访问这些数据。因此,在打印出来之前,您需要先将其复制回CPU内存。

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

// 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: %dn", i,h_arr[i]);
    cudaFree(d_arr);
    free(h_arr);
    return 0;
}

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

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

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

希望能有所帮助。

最新更新