我是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;
答案 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!