【发布时间】: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的用途!