【问题标题】:Cuda Change single Value in ArrayCuda 更改数组中的单个值
【发布时间】:2011-11-19 19:28:04
【问题描述】:

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

d_index[columnsA-rowsA]=columnsA;

我怎样才能做到这一点而不必将其复制到系统内存然后再复制回设备内存?

【问题讨论】:

  • 通过启动只有一个线程的内核,传递数组和值,并在内核代码中设置该值。也许你可以详细说明你的问题出在哪里。

标签: arrays vector cuda


【解决方案1】:

主机(CPU)代码不能直接访问设备内存,所以你有两种选择:

  • 启动单线程内核(例如update_array<<<1,1>>>(index, value)
  • 使用cudaMemcpy() 定位
  • 使用thrustdevice_vector

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

【讨论】:

    【解决方案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); 
    

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

    【讨论】:

      【解决方案3】:

      我认为由于d_index数组在设备内存中,所以每个线程都可以直接访问。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-15
        • 1970-01-01
        • 2020-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-26
        相关资源
        最近更新 更多