在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粒子要评估。有没有简单的方法让线程工作两次?有了更新的索引吗?
感谢您的时间,我希望我的问题已经明确制定!