让我们举个例子:
我想同时制作矢量点积(这不是我的情况,这只是一个例子),所以我有2个较大的输入矢量和一个具有相同大小的较大的输出矢量。可用的工作项小于这些向量的大小。如果工作项小于向量的大小,如何在opencl中制作此点积?这可能吗?还是我只是想招些花招?类似的东西:
for(i = 0; i < n; i++){
output[i] = input1[i]*input2[i];
}
带有n>可用工作项
答案 0 :(得分:0)
如果通过“可用工作项”表示您正在使用CL_DEVICE_MAX_WORK_ITEM_SIZES
给定的最大值,则始终可以为阵列的不同范围多次排队内核。
根据您的实际工作量,使每个工作项执行更多工作可能更为明智。在最简单的情况下,您可以使用SIMD类型,例如float4
,float8
,float16
等,并一次性处理类似的大块数据。一如既往,尝试其他方法并评估每种方法的性能是无可替代的。
答案 1 :(得分:0)
划分和征服数据。如果将工作组大小保留为全局工作大小的整数除法,则每次内核启动时,您可以让N个工作组启动一次,也许有k个启动。因此,您应该仅使用k * workgroup_size个工作项启动N / k个内核,并对内核中的缓冲区进行适当的寻址。
当您具有每个工作组的部分点积的部分总和(具有多个组内缩减步骤)时,您可以将其简单地累加到CPU或数据将要到达的任何设备上。