所以我正在学习并行编程,并正在编写一个程序来计算一个数字列表的全局总和。该列表被拆分为几个子列表(取决于我拥有多少个核心),并且列表单独并列。在每个核心拥有自己的总和后,我使用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是结构的数组,所以只是一个指向第一个结构(右?)。这会不会工作,因为内存不共享?
对不起,我对并行编程非常新,只是需要帮助理解这一点,谢谢。
啊,好吧,我一定误解了MPI_Reduce的作用。所以这将负责总结部分,但是我能够确定树结构打印出来吗?谢谢。 – robins35
不是。在后台完成缩减的方式是MPI的内部。我不知道有任何公开此信息的实现。如果对你真的很重要,你可以随时深入研究代码(假设你正在使用开源实现)。您可能还能够追踪一些调试标志或环境变量,以便提供更多信息。 –
该死的,这是针对一本书的练习,它明确告诉我要生成一个树图,所以我猜MPI_Reduce是不合适的。我只是修改了我的代码,并且它正在用MPI_Reduce正确求和,但是因为我需要树,所以使用Send/Recv编写程序是明智的做法。 – robins35