OpenCL global_id从1开始计数而不是0. Xeon Phi

时间:2015-07-30 20:06:25

标签: opencl

我是OpenCL的新手,最近我偶然发现了一些对我没有意义的事情。

我正在使用英特尔驱动程序(在Linux机器上工作),该设备是Xeon Phi协处理器。

问题是当我将local_item_size作为参数提供给

clEnqueueNDRangeKernel(commandQueue,
                       forceKernel, 1, 
                       &localItemSize, &globalItemSize,
                       NULL, 0, NULL, &kernelDone); 

并在内核中打印全局线程ID

int tid = get_global_id(0); 

线程ID从1开始而不是从0开始。

当我没有描述我的local_item_size并将NULL作为参数时,它似乎从0开始正确计数。

目前我在代码中通过从get_global_id(0)的返回值中减去1来解决此问题,以使我的代码正常工作..

很快:当我说出local_item_size时,tid从1开始。当我给出NULL时,它从0开始。

尺寸设定代码:

// Global item size 
if (n <= NUM_THREADS) { 
  globalItemSize = NUM_THREADS; 
  localItemSize = 16; 
} else if (n % NUM_THREADS != 0) { 
  globalItemSize = (n / NUM_THREADS + 1) * NUM_THREADS; 
} else { 
  globalItemSize = n; 
} 

// Local item size 
localItemSize = globalItemSize / NUM_THREADS;

2 个答案:

答案 0 :(得分:3)

您将工作组大小传递给错误的参数。 clEnqueueNDRangeKernel的第三个参数是全局工作偏移量,这就是您的全局ID出现偏移量的原因。工作组大小应该是第六个参数:

clEnqueueNDRangeKernel(commandQueue,
                       forceKernel, 1, NULL,
                       &globalItemSize, &localItemSize,
                       0, NULL, &kernelDone); 

答案 1 :(得分:3)

The 4th parameter to clEnqueueNDRangeKernel is an array of the offsets,而不是本地大小 - 这是第6个参数。你的电话应该是

value

这也是ID从1开始的原因 - 因为您要求偏移量为1!