Algorithm 如何确定并行加法的最有效算法?

Algorithm 如何确定并行加法的最有效算法?,algorithm,parallel-processing,Algorithm,Parallel Processing,在问了关于MapReduce算法的另一个问题之后,我开始思考如何使用并行处理确定获得n个值的总和的最有效方法。问题可以简化如下: 假设我有n个处理器,每个处理器都有一个整数。我想尽快确定整数的和 现在我可以让每个处理器2,…,n将其整数传递给处理器1。处理器1然后依次将每个数字相加以产生结果。这意味着n-1次数据传递,但这些都可以并行进行。然后是n-1加法操作,按顺序进行 或者,我可以让每个奇数处理器将其整数传递给下一个偶数处理器(为了参数起见,假设n是偶数)。然后,每个偶数处理器并行执行一个加

在问了关于MapReduce算法的另一个问题之后,我开始思考如何使用并行处理确定获得n个值的总和的最有效方法。问题可以简化如下:

假设我有n个处理器,每个处理器都有一个整数。我想尽快确定整数的和

现在我可以让每个处理器2,…,n将其整数传递给处理器1。处理器1然后依次将每个数字相加以产生结果。这意味着n-1次数据传递,但这些都可以并行进行。然后是n-1加法操作,按顺序进行

或者,我可以让每个奇数处理器将其整数传递给下一个偶数处理器(为了参数起见,假设n是偶数)。然后,每个偶数处理器并行执行一个加法操作,将自己的编号添加到刚刚传递的编号上。然后我们用1/2n个整数相加。然后,我们可以使用前面的方法添加剩余的值


当然,还有很多其他方法可以做到这一点。我如何确定哪一个是最有效的?我怀疑这取决于加法运算与传递整数的相对成本(在现实生活中,想想CPU与网络速度),也可能取决于n的大小。毕竟,如果n非常大,那么增加一个额外的网络跃点以将n减半可能是值得的,即使每次增加都相对便宜

这与其说是一个答案,不如说是一个评论,但这个小盒子太狭窄了

定义最有效的。你关心的是理论上的效率还是实践中的速度

我认为你问的问题是对的,你似乎已经意识到,如果你有100000个处理器,每个处理器都有一个整数,那么关键的资源是通信速度,而不是计算速度。对于您设计的以
N
处理器开始的
N
整数求和的任何方案,请记住,通信时间不是由带宽(发送1个整数的时间)决定的,而是由延迟(发送0大小消息的时间)决定的。出于最实际的目的,我希望这个问题会扼杀你的幻想

还有一个问题:整数是从哪里来的?如果它们起源于一个进程(或),并被分配到另一个进程
N-1
,那么发送它们所浪费的时间几乎肯定比第一个进程(或)计算总和所花费的时间还要多。如果整数可能是每个处理器上运行的进程的结果,那么无论效率如何,您都必须进行某种程度的减少,并支付通信成本


实际上,当
N
远大于
p
时,在
p
处理器上计算
N
整数之和时,只会加快速度。要在并行计算机上计算出您的数字,实验是无法替代的。

非常感谢您的回复。我主要对练习中的速度感兴趣。实际上,我正在为我们的应用程序编写一些聚合,我们正在使用Hazelcast分布式数据存储,而不是数据库。Hazelcast现在提供了MapReduce模型的一个实现,聚合是使用该模型编写的。我发现内置聚合(如count、sum等)效率低下,因为它们不进行任何中间排序,所以我写了自己的。因此,为了回答您的另一个问题,数据确实源自并行处理器,因为它是分布式数据存储中自己部分的部分聚合。实际上,我们只使用少量节点(可能是12个),所以我想在这种情况下,我们总是希望使用第一种方法。但是我想写我的算法,这样它们的效率就不依赖于节点的数量。我计划把所有的整数都放到一个进程中,然后在那里做加法,比从
N
N/2
N/4
等进行某种基于树的聚合要容易得多。但是,如果你特别关心的话,没有什么可以替代设置一些实验并获得一些数据。X+Y+Z=(xxor Y xor Z)+(X&Y)|(X&Z)|(Z&Y))*2在某些情况下,同时将几个数字相加比成对相加更有效。考虑公式:x+y+z=(x xor y xor z)+((x y)”((x)z)(z和y)* 2,它显示了如何将三个数的加法转换为两个数的加法,而不必将“进位”位全部通过该数。