OpenCL:数组大小和工作项的全局大小之间的关系

时间:2020-10-28 12:20:14

标签: arrays opencl

任何人都知道GPU内核如何访问位于全局内存中的大型数据阵列的详细信息(由于某种原因,我们不能仅复制到共享内存)?假设我们有一个内核类型:

kernel void doSomething(global A* s, global float* result)
{
    uint gidx = get_global_id(0);
   // some code here using the global index of the thread gidx...
}

我的理解-如果我错了,请纠正我-是每个线程访问一个连续元素s[gidx]并对其执行操作。这是否意味着全局数组A * s的大小与工作项的全局大小之间存在直接关系?我之所以这么说是因为我不知道每个内核如何在数组的不同数据点上运行?

1 个答案:

答案 0 :(得分:0)

看看如何通过clEnqueueNDRangeKernel从主机代码启动内核:

cl_int clEnqueueNDRangeKernel(
    cl_command_queue command_queue,
    cl_kernel kernel,
    cl_uint work_dim,
    const size_t* global_work_offset,
    const size_t* global_work_size,   // number of work-items
    const size_t* local_work_size,
    cl_uint num_events_in_wait_list,
    const cl_event* event_wait_list,
    cl_event* event);

在那里指定了工作项的数量,并为维数,偏移量和将工作项显式细分提供了一些附加参数。但是,无论您在此处指定什么内容,都将确定执行了多少个工作项,即内核函数的实例,并且每个工作项都会获得自己的全局索引和局部索引,您现在可以使用它们以任何有意义的方式访问数据适用于您的应用程序(并且不违反OpenCL编程模型的约束)。

一个非常典型的模式是要从某个输入生成的输出数据数组之间具有一对一的关系,并且让每个工作项并行计算一个元素。但是您也可以提出其他模式,例如与数组元素相比,开始的工作项更少,并且让每个工作项计算数组的范围,例如以增加特定硬件目标的每个工作项目的工作量。通常,工作项范围以某种方式与输出数据范围相关联,因为所有工作项都可能并行执行,因此通常应写入不重叠的零件内存中。

希望有帮助。

相关问题