OpenCL数据并行内核,没有足够的工作项?

时间:2016-02-01 21:51:56

标签: c++ parallel-processing opencl

在c ++上完成后,我一直在努力用OpenCL实现粒子群优化器(PSO)。但是我现在卡住了,并且不知道内核为什么不按我的意愿进行计算。在我继续之前,我将通过运行第一个示例来向您展示我的规范:https://github.com/HandsOnOpenCL/Exercises-Solutions

OpenCL平台数量:1

平台:Apple     供应商:Apple     版本:OpenCL 1.2(2015年9月21日19:24:11)

Number of devices: 2
-------------------------
    Name: Intel(R) Core(TM) i5-4278U CPU @ 2.60GHz
    Version: OpenCL C 1.2 
    Max. Compute Units: 4
    Local Memory Size: 32 KB
    Global Memory Size: 8192 MB
    Max Alloc Size: 2048 MB
    Max Work-group Total Size: 1024
    Max Work-group Dims: (1024 1 1)
-------------------------
-------------------------
    Name: Iris
    Version: OpenCL C 1.2 
    Max. Compute Units: 40
    Local Memory Size: 64 KB
    Global Memory Size: 1536 MB
    Max Alloc Size: 384 MB
    Max Work-group Total Size: 512
    Max Work-group Dims: (512 512 512)
-------------------------

现在我想要对PSO做的是评估每个粒子,我想用以下内核来做:

__kernel void EvaluateParticles(__global float* particlePositions,__global int* numberOfVariables,__global int* numberOfParticles,__global float* fitness)
{

    int idx = get_global_id(0);
    int nVar = numberOfVariables;

    fitness[idx] = idx;//Optimized function goes here later

}

现在内核正在工作和编译,但问题是我目前有20个要评估的粒子。当我运行代码时,适应数组只从元素0到15初始化,这意味着内核中只运行了16个并行线程?

我使用以下命令从主机端对内核进行排队:

size_t global_item_size = 20;
size_t local_item_size = 1;

ret = clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL, 
                             &global_item_size, &local_item_size, 0, NULL, &event);

问题1:为什么只有16个线程运行?即使我更改了global_item_size变量,也没有任何变化。根据帖子开头的规格,它说我应该有40个并行计算单元?我显然没有抓住什么。

问题2:如果你只有N个可能的工作项/计算单位可以使用,但得到M(假设M> N并且可以通过N:M / N =整数均匀分割)你想要运行的线程,或者在这个例如,M粒子要评估。有没有简单的方法让线程工作两次?有了更新的索引吗?

感谢您的时间,我希望我的问题已经明确制定!

0 个答案:

没有答案