Cuda 更改数组中的单个值

发布于 2024-12-05 08:40:21 字数 159 浏览 0 评论 0原文

我在 CUDA 设备内存中计算了一个名为 d_index 的向量,我只想更改一个值,如下所示...

d_index[columnsA-rowsA]=columnsA;

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

I have a vector called d_index calculated in the CUDA device memory and I want to change just one value, like this...

d_index[columnsA-rowsA]=columnsA;

How can I do this without having to copy it to the system memory and then back to the device memory?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

清眉祭 2024-12-12 08:40:21

您可以在 <<<1,1>>> 网格上调用 kernel,仅更改所需的元素:

__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); 

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

You could either call kernel on <<<1,1>>> grid, that changes only the desired element:

__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);

, or use something like:

int tmp = columnsA;
cudaMemcpy(&d_index[columnsA-rowsA], &tmp, sizeof(int), cudaMemcpyHostToDevice); 

If you only do this once, I think there is no big difference which version to use. If you call this code often, you better consider including this array modification into some other kernel to avoid invocation overhead.

瀞厅☆埖开 2024-12-12 08:40:21

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

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

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

Host (CPU) code cannot directly access device memory, so you have two choices:

  • Launch a single thread kernel (e.g. update_array<<<1,1>>>(index, value))
  • Use cudaMemcpy() to the location
  • Use thrust device_vector

Of course updating a single value in an array is very inefficient, hopefully you've considered whether this is necessary or perhaps it could be avoided? For example, could you update the array as part of the GPU code?

ヅ她的身影、若隐若现 2024-12-12 08:40:21

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

I think since the d_index array is in the device memory, it can be directly accessed by every thread.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文