get_global_id 与 clEnqueueNDRangeKernel 中的维数之间的 OpenCL 关系是什么?

What's the relation in OpenCL between get_global_id and the number of dimensions in clEnqueueNDRangeKernel?

例如,如果我有:

size_t local_dim[2]= [what should I place here?]
size_t global_dim[2]= [what should I place here?]

ret = clEnqueueNDRangeKernel(command_queue, kernel, 1, 
                         NULL, global_dim, local_dim, 0, NULL, NULL)

或者:

ret = clEnqueueNDRangeKernel(command_queue, kernel, 2, 
                          NULL, global_dim, local_dim, 0, NULL, NULL)

如果我在 Cl Kernel 函数中调用 "get_global_id" 函数时有 2 个维度而不是 1 个维度,在实践中有什么区别?如果我这样做:

int i = get_global_id(0);
int j = get_global_id(1);

只有两个维度例如,如果我有:

size_t local_dim[2]= [what should I place here?]
size_t global_dim[2]= [what should I place here?]

ret = clEnqueueNDRangeKernel(command_queue, kernel, 1, 
                              NULL, global_dim, local_dim, 0, NULL, NULL)

或者:

ret = clEnqueueNDRangeKernel(command_queue, kernel, 2, 
                                 NULL, global_dim, local_dim, 0, NULL, NULL)

当我在 Cl Kernel 函数中调用 "get_global_id" 函数时,如果我在 clEnqueueNDRangeKernel 中有 2 个维度而不是 1 个维度,在实践中有什么不同?如果我这样做:

int i = get_global_id(0);
int j = get_global_id(1);

只有两个维度,我会得到哪些值? 谢谢,抱歉弄得一团糟,但我很困惑!

区别很明显。拥有多个维度不是 "needed",您始终可以拥有一个维度。但是,当您编写多维问题(图像过滤器、粒子模拟等...)时,使用多维会变得非常容易。

如果设置 10x10 二维,则将创建 100 个工作项,其 ID 为:

int i = get_global_id(0); int j = get_global_id(1);  // 0,0
int i = get_global_id(0); int j = get_global_id(1);  // 0,1
...
int i = get_global_id(0); int j = get_global_id(1);  // 1,0
int i = get_global_id(0); int j = get_global_id(1);  // 1,1
...
int i = get_global_id(0); int j = get_global_id(1);  // 9,9

如果您将 1 维设置为 10x10,OpenCL 将忽略第二个参数并仅创建 id 为 10x1 的工作项:

int i = get_global_id(0); int j = get_global_id(1);  // 0,0
int i = get_global_id(0); int j = get_global_id(1);  // 1,0
...
int i = get_global_id(0); int j = get_global_id(1);  // 9,0

您仍然可以为任何维度调用 get_global_id(),但是如果它不是维度 0,则 return 值将为 0。