并行算法中的数据处理与 MapReduce 框架解析
1. 并行选择算法中的数据打包
在并行选择算法里,可在 ArrayPack() 函数中借助 PackingMove 类与 parallel_for 算法调用。借助前缀扫描的结果,能明确要移动的元素以及将这些元素复制到打包数组的位置。在相关操作代码中,会把扫描数组( scanIdx )里每个元素的值和前一个元素的值进行比较。若这两个元素不同,就用该元素的值减 1 来索引打包数组( sPack )中接收复制值(来自数组 S )的位置。由于每个目标位置仅对应数组 S 中的一个元素,所以不会出现冲突或数据竞争。
当合适分区的元素完成打包后, ArrayPack() 函数返回,接着会对 ParallelSelect() 进行递归调用,传入新的分区和按需调整后的 k 值。
2. 算法设计要点
简单的并行求和与前缀扫描算法是选择算法所需步骤的基础。 CountAndMark 类并非进行单一求和,而是同时进行三个独立的求和操作。并且,扫描操作需要解读数据值,依据每个元素的值用逻辑二进制等价物进行计算。这种算法的变形并不新鲜,程序员常对算法概念进行重塑,以契合当前应用的需求。关键在于能确定哪个基础算法最适合修改。
3. 关于 PRAM 算法的思考
不打算将 PRAM 算
超级会员免费看
订阅专栏 解锁全文

1034

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



