OpenCL全局_id从1开始计数,而不是从0开始计数。至强融核

OpenCL全局_id从1开始计数,而不是从0开始计数。至强融核,opencl,Opencl,我是OpenCL的新手,最近我偶然发现了一些对我来说没有意义的东西 我正在使用Intel驱动程序(在linux机器上工作),该设备是Xeon Phi协处理器 问题是,当我将local\u item\u size作为 clEnqueueNDRangeKernel(commandQueue, forceKernel, 1, &localItemSize, &globalItemSize,

我是OpenCL的新手,最近我偶然发现了一些对我来说没有意义的东西

我正在使用Intel驱动程序(在linux机器上工作),该设备是Xeon Phi协处理器

问题是,当我将
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我已将代码添加到您的问题中。通常,当所有代码都在问题中且格式正确时,它会帮助我们帮助您。