如何使用OpenCL内核生成累加器?

时间:2014-01-07 12:03:29

标签: c++ kernel opencl gpu accumulator

    __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 ++中有“全局变量”这样的解决方案吗?

谢谢!

2 个答案:

答案 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 );
       }
    }