在询问了关于MapReduce算法的另一个问题后,这让我想到如何使用并行处理确定达到n个值的总和的最有效方法。问题可以简化如下:
假设我有n个处理器,每个处理器都有一个整数。我想尽快确定整数的总和。
现在我可以让每个处理器2,...,n将其整数传递给处理器1.处理器1然后依次将每个数字相加以产生结果。这意味着n - 1次数据传递,但这些都可以并行发生。接下来是n - 1次加法操作,按顺序进行。
或者,我可以让每个奇数编号的处理器将其整数传递给下一个偶数编号的处理器(为了参数,我们假设n是偶数)。然后,每个偶数编号的处理器并行地执行一个加法操作,将其自己的编号添加到刚刚通过的编号。然后,我们最终得到1/2 n个整数加在一起。然后我们可以使用前面的方法添加剩余的值。
当然,还有很多其他方法可以做到这一点。我如何确定哪个最有效?我怀疑它取决于加法运算相对于传递整数的相对成本(在现实生活中,考虑CPU与网络速度),也可能取决于n的大小。毕竟,如果n非常大,那么添加额外的网络跃点以使n减半可能是值得的,即使每次添加相对便宜。
答案 0 :(得分:1)
这更像是一个评论而不是一个答案,但这个小盒子是如此局限......
定义最有效的。您是否关注理论效率或实践速度?
我认为你问自己正确的问题,你似乎已经意识到,如果你有100,000个处理器,每个处理器有1个整数,那么关键资源是通信速度而不是计算速度。对于您设计为N
整数的任何方案,以N
处理器开头,请记住通信时间不是由带宽(发送1整数的时间)而是由延迟(发送时间)决定0大小的消息)。对于大多数实际目的,我希望这个问题能够杀死你的花哨计划。
还有一个问题:整数起源于哪里?如果它们起源于一个过程(或)并且分发给另一个过程N-1
,那么几乎肯定会浪费更多时间将它们发送出去,而不是第一个过程(或)计算总和。如果整数起源可能是每个处理器上运行的进程的结果,那么无论效率如何,您都必须进行某种减少并支付通信费用。
在实践中,当N
远大于p
时,在计算N
个处理器上的p
整数之和时,您的速度只会提高}。要想在你的并行计算机上找到你的数字,就不能替代实验。