我遇到了实现并行计算前缀和算法的问题。即使这个算法有3个步骤,我也无法编写代码,因为没有给出伪代码。
我浏览了网上的各种资料以及堆栈溢出,但我没有得到wiki上给出的算法的确切实现。维基提到以下内容:
前缀和可以通过以下步骤并行计算::
- 计算该对中第一项具有偶数索引的连续项对的总和:z0 = x0 + x1,z1 = x2 + x3等
- 递归计算序列z0,z1,z2,...的前缀sum w0,w1,w2,...
- 将序列w0,w1,w2,...的每个项扩展为总前缀和的两个项:y0 = x0,y1 = w0,y2 = w0 + x2,y3 = w1等。值,每个连续数字yi要么从w序列的一半位置复制,要么是前一个值加到x序列中的一个值
醇>
有人可以为我建议一个伪代码实现来检查和实现吗?
答案 0 :(得分:5)
我认为提供的答案还不足以理解算法,所以我在这里提供了一个更全面的伪代码的实际答案:https://stackoverflow.com/a/12874227/697862基于http://http.developer.nvidia.com/GPUGems3/gpugems3_ch39.html这是一篇描述最佳并行算法的完整文章根据:
Blelloch,Guy E. 1990.“前缀和及其应用。”技术 报告CMU-CS-90-190,计算机科学学院,卡内基梅隆大学 大学。
答案 1 :(得分:1)
你所写的内容本身就是伪代码,但我希望这会有所帮助。
prefix_sum(List x):List
begin
//This step is split in multiple tasks that are running in paralell
//build z, be careful around the end
w = prefix_sum(z)
//This step should also be split in multiple tasks
//build y, using w and x
return y
end
编辑:y i 是我们想要的总和,y i = w i / 2 ,如果i%2 == 1,w i / 2-1 + x ,否则。这里我们假设w -1 = 0