如何从数组中获取总和数组
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.
的练习
我是 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.
的练习