2014-01-24 79 views
1

所以我正在学习并行编程,并正在编写一个程序来计算一个数字列表的全局总和。该列表被拆分为几个子列表(取决于我拥有多少个核心),并且列表单独并列。在每个核心拥有自己的总和后,我使用MPI_Reduce将值发送回其他核心,直到它们最终回到根目录。我们将它们的值直接发送回根(O(n)),我们将它们并行发送给其他内核(O(log(n)),如图所示:http://imgur.com/rL2O3TrMPI发送消息与MPI_Send和MPI_Reduce

所以,一切都是我认为我可能误解了MPI_Reduce,我的印象是MPI_Reduce只是在一个线程中取了一个值,在另一个线程(目标线程)中取了一个值,然后对该值执行了一个操作,然后存储它是在第二个线程中的同一个地方,这是我至少想要的,我想从发送线程中取出my_sum,并将它添加到接收线程中的my_sum。你可以在不同线程的相同地址上使用MPI_Reduce ?它们都有相同的名称

此外,我想生成这样的二叉树表示:http://imgur.com/cz6iFxl

其中S02表示总和已发送到线程2,而R03表示总和已由线程3接收。为此,我为每个步骤创建一个结构数组总和(log(n)步)。每一步都发生在第59-95行,while循环的每次迭代都是一步。第64-74行是线程将它的总和发送到目标线程的地方,并将信息记录在结构数组中。

我想我可能会用错误的方式使用MPI_Send。我使用这样的:

MPI_Send(srInfo, 1, MPI_INT, root, 0, MPI_COMM_WORLD); 

哪里srInfo是结构的数组,所以只是一个指向第一个结构(右?)。这会不会工作,因为内存不共享?

对不起,我对并行编程非常新,只是需要帮助理解这一点,谢谢。

回答

2

你可能会误解MPI_REDUCE应该在更高层次上做什么。是否有一个原因,你真的需要手动分割你的减少?通常情况下,MPI集体将会更好地优化大型沟通者,您可以自己做。我建议只使用MPI_REDUCE函数来降低所有等级。

所以你的代码会做这样的事情:

  1. 瓜分中所有的行列莫名其妙的工作(可以从文件中读取,从一些“根”过程中被发送到所有其他等)。
  2. 每个等级总结自己的价值。
  3. 每个等级都以其自己的价值进入MPI_REDUCE。这看起来是这样的: MPI_Reduce(&myval, &sum, 1, MPI_INT, MPI_SUM, root, MPI_COMM_WORLD);

这应该自动完成所有的总和,为你的东西通常是某种树的时尚。

+0

啊,好吧,我一定误解了MPI_Reduce的作用。所以这将负责总结部分,但是我能够确定树结构打印出来吗?谢谢。 – robins35

+0

不是。在后台完成缩减的方式是MPI的内部。我不知道有任何公开此信息的实现。如果对你真的很重要,你可以随时深入研究代码(假设你正在使用开源实现)。您可能还能够追踪一些调试标志或环境变量,以便提供更多信息。 –

+0

该死的,这是针对一本书的练习,它明确告诉我要生成一个树图,所以我猜MPI_Reduce是不合适的。我只是修改了我的代码,并且它正在用MPI_Reduce正确求和,但是因为我需要树,所以使用Send/Recv编写程序是明智的做法。 – robins35