任意素数工作项的工作维度

时间:2018-04-30 09:23:47

标签: opencl

我见过很多关于配置工作维度的教程,其中工作项的数量很容易分成3个维度。我有很多工作项,请说164052。配置任意数量的工作项的最佳方法是什么?由于在我的程序中工作项的数量可能会有所不同,我需要一种方法来自动计算它。

当数字为素数时我该怎么办,比如说7879

1 个答案:

答案 0 :(得分:4)

首先,默认情况下,您应该只为内核使用1维。有些任务需要2或3个维度(通常是图像处理),但除非您明确地处理其中一个任务,否则尝试在多个维度之间划分内容可能对您没有好处,因为这些好处主要与代码有关。组织,而不是绩效。

这就留下了如何在当地群体之间划分工作项目的问题。如果任务大小为N个工作项,您可以选择将它们划分为本地组。

最简单的解决方案是简单地指定N个工作项,让司机决定如何在这些工作项之间划分这些工作项。

size_t work_items = 164052;
clEnqueueNDRangeKernel(queue, kernel, 1, nullptr, &work_items, nullptr, 0, nullptr, nullptr);

如果您针对特定环境进行编程,并且事先知道本地工作项的理想数量(对于NVidia / AMD体系结构通常为32或64),则可以通过强制将工作项数量调整为可以获得更好的性能这个数字的倍数。

size_t work_items = 164052;
size_t LOCAL_SIZE = 64;
work_items += LOCAL_SIZE - (work_items % LOCAL_SIZE);
clEnqueueNDRangeKernel(queue, kernel, 1, nullptr, &work_items, &LOCAL_SIZE, 0, nullptr, nullptr);

但是,请注意,这需要您在内核代码中添加一个检查,以防止对实际不存在的工作项进行处理,或者填充缓冲区以包含虚拟项目的空间。

kernel void main(..., int N) {
    if(get_global_id(0) >= N) return;
    ...
}