Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading OpenCL:如果我有比可用工作项更多的任务怎么办?_Multithreading_Opencl_Add_Workitem_Workgroup - Fatal编程技术网

Multithreading OpenCL:如果我有比可用工作项更多的任务怎么办?

Multithreading OpenCL:如果我有比可用工作项更多的任务怎么办?,multithreading,opencl,add,workitem,workgroup,Multithreading,Opencl,Add,Workitem,Workgroup,让我们举个例子: 我想要同时生成向量点积(这不是我的情况,这只是一个例子),所以我有两个大的输入向量和一个大小相同的大输出向量。可保存的工作项小于这些向量的大小。如果工作项小于向量的大小,如何在opencl中生成此点积?这可能吗?还是我要耍点小把戏 比如: for(i = 0; i < n; i++){ output[i] = input1[i]*input2[i]; } (i=0;i可用工作项如果“可用工作项”的意思是您正在运行CL\u设备\u MAX\u工作项\u大小给定

让我们举个例子:

我想要同时生成向量点积(这不是我的情况,这只是一个例子),所以我有两个大的输入向量和一个大小相同的大输出向量。可保存的工作项小于这些向量的大小。如果工作项小于向量的大小,如何在opencl中生成此点积?这可能吗?还是我要耍点小把戏

比如:

for(i = 0; i < n; i++){  
    output[i] = input1[i]*input2[i];
}
(i=0;i 输出[i]=input1[i]*input2[i]; } 使用n>可用工作项

如果“可用工作项”的意思是您正在运行
CL\u设备\u MAX\u工作项\u大小
给定的最大值,那么您始终可以针对阵列的不同范围多次将内核排队


根据您的实际工作负载,让每个工作项执行更多的工作可能更明智。在最简单的情况下,您可以使用SIMD类型,如
float4
float8
float16
等,并一次性对大数据块进行操作。与以往一样,尝试不同的方法并衡量每种方法的性能是无可替代的。

分而治之的数据。如果您将工作组大小保持为全局工作大小的整数divident,那么您可以在每次内核启动时一次启动N个工作组,可能是k个工作组。因此,您应该只启动N/k个内核,每个内核都有k*工作组大小的工作项和内核中缓冲区的正确地址


当您拥有每个工作组的部分点积的部分和(具有多个组内缩减步骤)时,您只需在CPU上或数据将要使用的任何设备上对其进行求和。

请注意,您的示例不是点积,而是元素乘法。像这样的宽点积需要一个缩减阶段,我想这不是你要问的。是的,对不起,我指的是元素乘法是的,我指的是最大工作项,但如果我需要每个工作项必须计算元素乘法和n>工作项,gpu如何响应?到底能不能做到?我知道每个工作项可以比单个工作项计算更多的计算量,但是在这个示例中,gpu是如何工作的呢?如果有效