Algorithm 并行求和

Algorithm 并行求和,algorithm,parallel-processing,Algorithm,Parallel Processing,这是一个面试问题 N个节点,每个节点由一对字段和方法组成。这些是: // Every node has an ID. All of these IDs are sequential, and begin with 0. // i.e. all ids are uniquely in the range of 0 t N-1 int id; int val; // Every node has a value int max; // max = N. Every node knows how

这是一个面试问题

N个节点,每个节点由一对字段和方法组成。这些是:

// Every node has an ID. All of these IDs are sequential, and begin with 0.
//   i.e. all ids are uniquely in the range of 0 t N-1
int id;
int val; // Every node has a value
int max; // max = N. Every node knows how many nodes are in the system. 

void send(int idTo, int payload)
int recv(int idFrom) 
编写一段同时在每个节点上运行的代码,以便在完成运行后,系统中的每个节点都知道系统中所有节点的值之和。

一种解决方案:

每个节点都将接收到的总和发送到系统中的下一个节点。当每个节点第一次收到来自前一个节点的号码时,它会注意到该号码是向下的。下次它收到一个数字->它从上一个数字中减去该数字,这就是总和

receive将从系统中的上一个节点接收一个号码,并将其自身的号码添加到该号码中 send将把它发送到系统中的下一个节点 然后,receive将等待来自上一个节点的另一个输入

一个解决方案:

每个节点都将接收到的总和发送到系统中的下一个节点。当每个节点第一次收到来自前一个节点的号码时,它会注意到该号码是向下的。下次它收到一个数字->它从上一个数字中减去该数字,这就是总和

receive将从系统中的上一个节点接收一个号码,并将其自身的号码添加到该号码中 send将把它发送到系统中的下一个节点
然后receive将等待来自上一个节点的另一个输入

您可以向每个节点广播您的值,并从每个其他节点接收值。 这样,每个节点都将进行加法并知道结果。不过,我认为这可能是非常低效的

我更喜欢前面答案中的想法,即从上一个节点接收部分和,添加您自己的值并将新的和传递给下一个节点。然后,您必须将最终结果传输到另一个方向,以便每个节点最终都知道答案


但是如果你想利用所有节点同时运行的事实,你可以从两端开始第一次传播,并在中间得到最终结果,然后从第二个方向在第二个方向上进行第二次遍历。这将节省你一半的时间。更好的是,按照同样的思路,可以成对求和,并将部分结果发送到第四个节点,然后发送到第四个节点,依此类推。此策略只需Olg n即可到达中间位置。

您可以向每个节点广播您的值,并从每个其他节点接收值。 这样,每个节点都将进行加法并知道结果。不过,我认为这可能是非常低效的

我更喜欢前面答案中的想法,即从上一个节点接收部分和,添加您自己的值并将新的和传递给下一个节点。然后,您必须将最终结果传输到另一个方向,以便每个节点最终都知道答案


但是如果你想利用所有节点同时运行的事实,你可以从两端开始第一次传播,并在中间得到最终结果,然后从第二个方向在第二个方向上进行第二次遍历。这将节省你一半的时间。更好的是,按照同样的思路,可以成对求和,并将部分结果发送到第四个节点,然后发送到第四个节点,依此类推。这个策略只需要Olg n就可以到达中间位置。

我认为解决方案是,在每个节点上,从所有其他节点获取值,然后添加。这样,我们将同时使用send和recv函数。搜索的关键字是并行前缀扫描算法递归加倍,也考虑所有减少或全局约简的解决方案,我可以想到的是,在每个节点上,从所有其他节点得到值,然后添加。这样,我们将同时使用send和recv函数。搜索的关键字是并行前缀扫描算法递归加倍,也考虑所有的约简或全局约简,这是在时间上的,当它可以在OLG N时间中求解时,如EESSUCU所描述的。至少你的解决方案,如果它是我认为它只发送消息,不像@Damien_The_The_unsivert的解决方案,当它可以在Olg N时间内解决时,如ees_cu所述。至少你的解决方案,如果它是我认为它只发送消息,不像@Damien_的不信者