【发布时间】:2011-11-19 19:28:04
【问题描述】:
我在 CUDA 设备内存中计算了一个名为 d_index 的向量,我只想更改一个值,就像这样...
d_index[columnsA-rowsA]=columnsA;
我怎样才能做到这一点而不必将其复制到系统内存然后再复制回设备内存?
【问题讨论】:
-
通过启动只有一个线程的内核,传递数组和值,并在内核代码中设置该值。也许你可以详细说明你的问题出在哪里。
我在 CUDA 设备内存中计算了一个名为 d_index 的向量,我只想更改一个值,就像这样...
d_index[columnsA-rowsA]=columnsA;
我怎样才能做到这一点而不必将其复制到系统内存然后再复制回设备内存?
【问题讨论】:
主机(CPU)代码不能直接访问设备内存,所以你有两种选择:
update_array<<<1,1>>>(index, value))cudaMemcpy() 定位当然,更新数组中的单个值是非常低效的,希望您已经考虑过这是必要的还是可以避免的?例如,您能否将数组作为 GPU 代码的一部分进行更新?
【讨论】:
您可以在<<<1,1>>> 网格上调用内核,这只会更改所需的元素:
__global__ void change_elem(int *arr, int idx, int val) {
arr[idx] = val;
}
// ....
// Somewhere in CPU code
change_elem<<<1,1>>>(d_index, columnsA-rowsA, columnsA);
,或者使用类似的东西:
int tmp = columnsA;
cudaMemcpy(&d_index[columnsA-rowsA], &tmp, sizeof(int), cudaMemcpyHostToDevice);
如果你只这样做一次,我认为使用哪个版本没有太大区别。如果您经常调用此代码,您最好考虑将此数组修改包含到其他内核中以避免调用开销。
【讨论】:
我认为由于d_index数组在设备内存中,所以每个线程都可以直接访问。
【讨论】: