整数数组前缀扫描算法解析与实现
1. 串行前缀扫描算法
串行前缀扫描算法的代码如下:
prefixScan[0] = A[0];
for (int i = 1; i < N; i++)
prefixScan[i] = prefixScan[i-1] + A[i];
该代码首先将 A[0] 的值存储到 prefixScan[0] 中,以此初始化结果数组。后续的循环迭代会使用结果数组的第 (i - 1) 个值加上 A[i] 的值,来计算要存储在 prefixScan[i] 元素中的值。
如果想要实现串行包含前缀扫描的原地版本,只需将 prefixScan 数组替换为 A 即可。而排他前缀扫描的实现则相对复杂一些。
通过分析这段串行代码,可以发现循环体中使用了归纳变量。与并行求和代码不同,该算法在每次迭代中使用不同的归纳变量,并且该归纳变量的值依赖于之前所有计算出的归纳变量的值。因此,为前缀扫描创建并发解决方案似乎比并行求和更具挑战性。
2. TBB 库的使用
如果你熟悉 TBB 库,就会知道其中包含的并行算法之一是 parallel_scan 。该算法可以使用多个线程计算数组值的前缀扫描。所以,根据简单规则 4,如果你可以使用 TBB 并且需要进行前缀扫描操作,那么可以利用已经编写和优化
超级会员免费看
订阅专栏 解锁全文
1267

被折叠的 条评论
为什么被折叠?



