1 想法
整体求和和前缀求和很不一样:
- 输出:一个是单个数字,一个是和原来同尺寸的数组;
- 依赖关系一个是多对一,一个是多对多;
- 如果使用多个block,对全局内存,一个只要操作block个数次(grid内求和),一个你不用共享内存。。。你操作的次数就非常多。
本文前缀和将实现:
- Kogge-Stone并行前缀和;
- Brent-Kung并行前缀和;
- 扇出对多block汇总。
注意:本篇前缀求和不包括0,同时不进行《GPU编程与优化》书中的warp内操作,因为架构变化会带来不同的结果,咱是在新架构上实验。循环展开,对warp的利用本质是减少同步操作的想法。
2 代码
2.1 CPU
不用解释
ELEM_TYPE* prefixSum_cpu(ELEM_TYPE* data, int n) {
ELEM_TYPE* ret = new ELEM_TYPE[n];
ELEM_TYPE tmp=0;
for (int i=0; i<n; i++) {
tmp += data[i];
ret[i] = tmp;
}
return ret;
}
2.2 Kogge-Stone并行
很有意思(吐血),书上的和网上的都是错的,循环那里,