gpt4 book ai didi

CUDA 到 OpenCL : What is the equivalent of (blockIdx. x + blockIdx.y*gridDim.x) * openCL 中的 blockDim.x + threadIdx.x?

转载 作者:行者123 更新时间:2023-12-01 08:13:50 26 4
gpt4 key购买 nike

我是 OpenCL 的初学者,试图将一个简单的 CUDA 函数转换为 OpenCL。在 CUDA 函数中,他们使用以下代码段来获取操作索引,

int id = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x;

get_global_id(0) 是否相当于 OpenCL 中的上述内容?

int id = get_global_id(0);

最佳答案

我不熟悉 CUDA(仅限 OpenCL),但看起来以下是等价的:

  • get_group_id(uint dimindx)blockIdx.[xyz]
  • get_local_size(uint dimindx)blockDim.[xyz]
  • get_local_id(uint dimindx)threadIdx.[xyz]
  • get_num_groups(uint dimindx)gridDim.[xyz]

其中 dimindx 为 0、1 或 2,对应于 .x.y.z分别。

get_global_id(0)get_group_id(0) * get_local_size(0) + get_local_id(0) 相同,所以假设上述等式确实正确,它将与 blockIdx.x * blockDim.x + threadIdx.x 相同。 (对于 .y 的索引 1 和 .z 的索引 2 等效)

要获得相同的 ID 值,我想你可能想要这样的东西:

int id = get_group_id(1) * get_global_size(0) + get_global_id(0);

请注意,原始 CUDA 代码明确不考虑 threadIdx.y。我怀疑这可能是因为您的 blockDim.y 为 1,或者因为您真的想获得 block 中最顶层的项目(而不是与当前线程对应的项目)。

更常见的情况可能是将当前工作项的索引放入包含二维元素数组的缓冲区中的数组中:

int id = get_global_id(1) * get_global_size(0) + get_global_id(0);

如果 get_local_size(1) 为 1,这当然等同于前面的表达式。( block 的高度为 1。)

以上所有内容均假设您已将内核与 CUDA 中的等效工作组( block )和全局维度排入队列。

关于CUDA 到 OpenCL : What is the equivalent of (blockIdx. x + blockIdx.y*gridDim.x) * openCL 中的 blockDim.x + threadIdx.x?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45203444/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com