__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整除的数字。
所以这是问题所在: 由于每个工作项的计算不是纯粹的并行,因此不同项中的数字[0]或[1]是相关的。 通过读取数字[0]或数字[1],我无法得到正确的结果。
C ++中有“全局变量”这样的解决方案吗?
谢谢!
答案 0 :(得分:4)
您需要使用原子操作。
__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]);
}
}
你应该避免尽可能多地使用它们,因为原子操作往往相当缓慢,因为它们确保它在线程之间正常工作。
答案 1 :(得分:2)
原子添加将解决求和问题
__kernel void cl_test(__global int* Number)
{
int id = get_global_id(0);
if (id%5==0)
{
atomic_add( Number, 1 );
}
if (id%10==0)
{
atomic_add( Number +1, 1 );
}
}