如何从数组中获取总和数组

How to get a sum array from array

我是 openCL 的新手。

我知道如何对一维数组求和。但我的问题是如何从 openCL 中的 1 个一维数组中获取总和数组。

 int a[1000];
 int b[1000];
 ....             //save data to a
 for(int i = 0 ;i < 1000; i ++){
    int sum = 0;
      for(int j = 0 ;j < i; j ++){
        sum += a[j];
      }
      b[i] = sum;
  }

欢迎提出任何建议。

这是一道顺序题。换种方式表达

b[1] = a[0]
b[2] = b[1] + a[1]
b[3] = b[2] + a[2]
...
b[1000] = b[9999] + a[999]

因此,拥有多个线程对您毫无帮助。 最好的方法是使用单个 CPU。而不是 OpenCL/CUDA/OpenMP...

这个问题与归约完全不同,每个步骤都可以分成 2 个较小的步骤,可以 运行 并行。

正如其他人所提到的 - 您想要做的是使用包含并行前缀和。如果你被允许使用 OpenCL 2,they have a workgroup function for it - 他们应该从一开始就把它放在那里,因为它的使用频率很高 - 所以现在我们每个人都自己实现它,通常以某种方式很糟糕.

请参阅 Parallel Prefix Sum (Scan) with CUDA 了解用于教授此内容的典型算法。

在你提到的数字上,使用多个计算单元是没有意义的,这意味着你将用一个计算单元攻击它——所以只需重复循环两次左右——在 64-256,你将拥有这么多元素的总和非常快。构建工作组函数以获得任何大小的通用缩减函数是对 reader.

的练习