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

谢谢!

4

2 回答 2

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]);
   }
}

您应该尽可能避免使用它们,因为原子操作往往会相当慢,因为它们确保它可以跨线程正常工作。

于 2014-01-07T13:05:09.563 回答
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 );
       }
    }
于 2014-01-07T13:05:43.087 回答