OpenCL:如果我还有更多任务而不是可用工作项怎么办?

时间:2018-11-30 12:16:28

标签: multithreading opencl add workitem workgroup

让我们举个例子:

我想同时制作矢量点积(这不是我的情况,这只是一个例子),所以我有2个较大的输入矢量和一个具有相同大小的较大的输出矢量。可用的工作项小于这些向量的大小。如果工作项小于向量的大小,如何在opencl中制作此点积?这可能吗?还是我只是想招些花招?

类似的东西:

for(i = 0; i < n; i++){  
    output[i] = input1[i]*input2[i];
}

带有n>可用工作项

2 个答案:

答案 0 :(得分:0)

如果通过“可用工作项”表示您正在使用CL_DEVICE_MAX_WORK_ITEM_SIZES给定的最大值,则始终可以为阵列的不同范围多次排队内核。

根据您的实际工作量,使每个工作项执行更多工作可能更为明智。在最简单的情况下,您可以使用SIMD类型,例如float4float8float16等,并一次性处理类似的大块数据。一如既往,尝试其他方法并评估每种方法的性能是无可替代的。

答案 1 :(得分:0)

划分和征服数据。如果将工作组大小保留为全局工作大小的整数除法,则每次内核启动时,您可以让N个工作组启动一次,也许有k个启动。因此,您应该仅使用k * workgroup_size个工作项启动N / k个内核,并对内核中的缓冲区进行适当的寻址。

当您具有每个工作组的部分点积的部分总和(具有多个组内缩减步骤)时,您可以将其简单地累加到CPU或数据将要到达的任何设备上。