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

Opencl 如何从数组中获取和数组,opencl,Opencl,我是openCL的新人 我知道如何对一维数组求和。但我的问题是如何从openCL中的1 1D数组中获取和数组 inta[1000]; int b[1000]; .... //将数据保存到 对于(int i=0;i

我是openCL的新人

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

inta[1000];
int b[1000];
....             //将数据保存到
对于(int i=0;i<1000;i++){
整数和=0;
对于(int j=0;j

欢迎任何建议。

这是一个顺序问题。用另一种方式表达

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


这个问题与缩减完全不同,因为每个步骤都可以分为两个较小的步骤,可以并行运行。

正如其他人所提到的,您要做的是使用包含并行前缀和。如果你被允许使用OpenCL2,-他们从一开始就应该有它,因为它的使用频率很高-所以现在我们让每个人自己实现它,通常以这样或那样的方式实现得很差

请参阅,以了解用于教授此内容的典型算法


在你提到的数字上,使用多个计算单元是没有意义的,这意味着你将用一个计算单元来攻击它-所以只要重复循环两次左右-在64-256,你将很快得到这么多元素的总和。构建工作组函数以获得任意大小的通用缩减函数对读者来说都是一个练习。

您可以在ArrayFire中查看OpenCL sum函数的源代码,这是一个开源的函数:我想您说的是“前缀和”或“扫描”。很抱歉,现在还没有答案,但是像“prefix sum opencl”这样的网络搜索会带来一些结果,也许这已经有点帮助了。你的代码就是prefix sum。这相当于(
for(inti=0;我认为你的答案应该是针对OPs代码的。他的代码即使效率很低,也很难并行化。他确实
O(n^2)
reads(实际上
(n-1)*n/2
reads)而
n
写。而你的建议只做
n
读。这显然更好,但并行化并不容易(它可以通过两个过程完成)。