OpenCL全局_id从1开始计数,而不是从0开始计数。至强融核
我是OpenCL的新手,最近我偶然发现了一些对我来说没有意义的东西 我正在使用Intel驱动程序(在linux机器上工作),该设备是Xeon Phi协处理器 问题是,当我将OpenCL全局_id从1开始计数,而不是从0开始计数。至强融核,opencl,Opencl,我是OpenCL的新手,最近我偶然发现了一些对我来说没有意义的东西 我正在使用Intel驱动程序(在linux机器上工作),该设备是Xeon Phi协处理器 问题是,当我将local\u item\u size作为 clEnqueueNDRangeKernel(commandQueue, forceKernel, 1, &localItemSize, &globalItemSize,
local\u item\u size
作为
clEnqueueNDRangeKernel(commandQueue,
forceKernel, 1,
&localItemSize, &globalItemSize,
NULL, 0, NULL, &kernelDone);
以及在内核中打印全局线程id时
int tid = get_global_id(0);
线程ID从1开始,而不是从0开始
当我没有描述我的本地项目的大小并将NULL
作为参数时,它似乎从0开始正确计数
目前,我正在通过从get\u global\u id(0)
的返回值中减去1来修复代码中的问题,以使代码正常工作
简而言之:当我说我的local\u item\u 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;
//全局项目大小
如果(n您将工作组大小传递给了错误的参数。clEnqueueNDRangeKernel
的第三个参数是全局工作偏移量,这就是全局ID显示为偏移量的原因。工作组大小应转到第六个参数:
clEnqueueNDRangeKernel(commandQueue,
forceKernel, 1, NULL,
&globalItemSize, &localItemSize,
0, NULL, &kernelDone);
您将工作组大小传递给了错误的参数。ClenqueEndRangeKernel
的第三个参数是全局工作偏移量,这就是全局ID显示为偏移量的原因。工作组大小应转到第六个参数:
clEnqueueNDRangeKernel(commandQueue,
forceKernel, 1, NULL,
&globalItemSize, &localItemSize,
0, NULL, &kernelDone);
,而不是本地大小-这是第6个参数。您的呼叫应该是
clEnqueueNDRangeKernel(commandQueue,
forceKernel, 1,
NULL, &globalItemSize,
&localItemSize, 0, NULL, &kernelDone);
这也是IDs从1开始的原因-因为您请求的偏移量是1!,而不是本地大小-这是第6个参数。您的呼叫应该是
clEnqueueNDRangeKernel(commandQueue,
forceKernel, 1,
NULL, &globalItemSize,
&localItemSize, 0, NULL, &kernelDone);
这也是ID从1开始的原因-因为您请求了1的偏移量!localItemSize的值是多少?globalItemSize
/globalItemSize
?您可能应该显示更多的代码。//如果(n我已将代码添加到您的问题中。通常,当所有代码都在问题中并且格式正确时,它会帮助我们帮助您。localItemSize
/globalItemSize
?您可能应该显示更多的代码。//如果(n我已将代码添加到您的问题中。通常,当所有代码都在问题中且格式正确时,它会帮助我们帮助您。