C++ OpenCL获取错误结果的全局id

C++ OpenCL获取错误结果的全局id,c++,gpu,opencl,C++,Gpu,Opencl,我有一个错误的global\u id()result的问题。我想用维度{35,35,35}和维度{5,5,5}的3D内核来卷积3D体素。因此,我用global_size={35,35,35}和local size={5,5,5}调用“clenqueueendrangekernel” std::vector<size_t> local_nd = { 5, 5, 5 }; std::vector<size_t> global_nd = { 35, 35, 35 }; err

我有一个错误的
global\u id()
result的问题。我想用维度
{35,35,35}
和维度
{5,5,5}
的3D内核来卷积3D体素。因此,我用
global_size={35,35,35}
local size={5,5,5}
调用“clenqueueendrangekernel”

std::vector<size_t> local_nd  = { 5, 5, 5 };
std::vector<size_t> global_nd = { 35, 35, 35 };
err = clEnqueueNDRangeKernel( queue, hello_kernel, work_dim, NULL, global_nd.data(), local_nd.data(), 0, NULL, NULL); 

我的gpu是最大工作组是最大工作组项ND:{1024,1024,64}

我发现了pmdj建议的问题

printf in kernels isn't always reliable - there's often a fixed-size buffer, and if you output too much, some messages may be dropped.
在我用一些条件更改OpenCL代码之后。例:

if( ic2< 10 )
    printf("ic2: %d ", ic2 );
if(ic2<10)
printf(“ic2:%d”,ic2);

输出范围为[0-->34,如我所料]

可能您有竞争条件。显示您的内核代码。
printf
在内核中并不总是可靠的-通常有一个固定大小的缓冲区,如果输出太多,一些消息可能会被丢弃。尝试让每个工作项在3D数组中写入一个元素,并检查该元素,或者限制printfs(
if(ic2<10)printf(…);
)上的范围,以显示较早的元素正在被命中。
if( ic2< 10 )
    printf("ic2: %d ", ic2 );