C++ OpenCL获取全局id可能会返回

C++ OpenCL获取全局id可能会返回,c++,kernel,range,opencl,C++,Kernel,Range,Opencl,我怀疑OpenCL内核的多个调用具有相同的get\u global\u id0返回值 从主机呼叫: err = commandQueue.enqueueNDRangeKernel(my_kernel, cl::NullRange, cl::NDRange(1024), cl::NDRange(256), NULL, NULL); 还有我的内核: typedef struct { float x, y; } Point3; __kernel void update_position (

我怀疑OpenCL内核的多个调用具有相同的get\u global\u id0返回值

从主机呼叫:

err = commandQueue.enqueueNDRangeKernel(my_kernel, cl::NullRange, cl::NDRange(1024), cl::NDRange(256), NULL, NULL);
还有我的内核:

typedef struct { float x, y; } Point3;

__kernel void update_position (
    __global Point3* pts,
    __global Point3* speed,
    const unsigned int count,
    const float t)
{ 
    unsigned long i = get_global_id(0);
    if (i < count) { 
        pts[i].x += speed[i].x * t;
        pts[i].y += speed[i].y * t;
    }
}
我想要的是更新1024点的每个项目一次,而且只更新一次。问题是,多次运行程序会得到各种无效的结果。我猜get_global_id0不会返回0到1023之间的唯一数字,所以有时会多次执行此内核体

不幸的是,Khronos的官方web API正在关闭,我还没有找到任何合适的答案/解决方案

我是否应该使用其他函数来确定代码在哪个内核/线程上运行?还是NDrange被称为错误的


感谢您的帮助:

您的内核看起来很好,get_global_id0完全可以满足您的需要。您能给我们一些关于如何创建/初始化缓冲区/参数的更多信息吗?可能的问题、参数计数以及如何初始化pts。