__kernel void cl_test(__global int* Number)
{
int id = get_global_id(0);
if (id%5==0)
{
Number[0]++;
}
if (id%10==0)
{
Number[1]++;
}
}
如您所见,这是一个非常简单的OpenCL内核测试代码,我想要的是收集在一个范围内被5和10整除的数字。
所以这是问题所在:
由于每个工作项的计算都不是完全并行的,因此不同项中的Number [0]或[1]是相关的。
我无法通过读取Number [0]或Number [1]来获得正确的结果。
有没有像C ++中的“全局变量”这样的解决方案?
谢谢!
最佳答案
您需要使用原子操作。
__kernel void cl_test(__global int* Number)
{
int id = get_global_id(0);
if (id%5==0)
{
atomic_inc(Number);
}
if (id%10==0)
{
atomic_inc(&Number[1]);
}
}
您应该避免尽可能多地使用原子操作,因为原子操作往往会相当慢,因为原子操作会确保原子操作在线程之间正确运行。
关于c++ - 如何使用OpenCL内核来做累加器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20971145/