Cuda更改数组中的单个值

时间:2011-09-18 19:48:56

标签: arrays vector cuda

我在CUDA设备内存中计算了一个名为d_index的向量,我只想更改一个值,就像这样......

d_index[columnsA-rowsA]=columnsA;

如何在不必将其复制到系统内存然后再返回设备内存的情况下执行此操作?

3 个答案:

答案 0 :(得分:2)

您可以在<<<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); 

如果您只执行一次,我认为使用哪个版本没有太大区别。如果经常调用此代码,最好考虑将此数组修改包含在其他内核中以避免调用开销。

答案 1 :(得分:1)

主机(CPU)代码无法直接访问设备内存,因此您有两种选择:

  • 启动单线程内核(例如update_array<<<1,1>>>(index, value)
  • 使用cudaMemcpy()到位置
  • 使用thrust device_vector

当然,更新数组中的单个值效率非常低,希望您已经考虑过这是否有必要或者是否可以避免?例如,您可以将数组更新为GPU代码的一部分吗?

答案 2 :(得分:0)

我认为既然d_index数组在设备内存中,它可以被每个线程直接访问。