C++ OpenCL获取全局id可能会返回
我怀疑OpenCL内核的多个调用具有相同的get\u global\u id0返回值 从主机呼叫: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 (
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。