2012-04-11 52 views
0

我希望在使用OpenMPI的不同处理器上拥有相同的阵列hist(1:1000),以便当一个处理器修改hist时,此修改在其余处理器中得到更新。如何在使用MPI的不同处理器上使用相同阵列

我已经写了一个代码并宣布为hist(1:1000),但问题是hist在每个处理器上独立更新,那么我所做的就是将数据发送到“主节点”以基于信息更新另一个直方图的奴隶,但这是我不想要的。我想要在每个处理器上更新相同的直方图。

是否可以使用OpenMPI做到这一点?

+0

您是否尝试将hist声明为共享变量? – Neo 2012-04-11 22:44:56

+0

我怎么能这样做?问候。 – armando 2012-04-11 22:55:45

+0

哎呀..我的错误..我误解为OpenMP ..只是注意到它是openmpI ..就像mgilson在下面的答案中所述,如果你可以使用OpenMP,你可以有一个共享变量。但是,OpenMP影响可伸缩性。所以如果你打算继续使用MPI,你必须使用像MPI_Gather这样的收集操作。没有其他方法! – Neo 2012-04-11 23:44:50

回答

6

据我所知,MPI不可能做到这样的事情。 MPI的目的是实现从一个进程到另一个进程的消息传递(因此名称为Message Passing Interface)。如果你想使用共享内存,最好的办法是使用像OpenMP(我认为它可能在那里?),至少由gcc/gfortran支持,可能还有其他一些编译器。你可以使用线程......但最终,这些都不能像MPI那样扩展到1000个处理器。根据你在做什么,你可以尝试MPI的集体操作 - 正如你所提到的,hist是存储一个直方图,所以你可能只想要你使用的所有hists的总和,而你的计算实际上并不依赖于HIST。 MPI可以总结为你所有的阵列,他们已经改变了之后......

看到这个例如

http://mpi.deino.net/mpi_functions/MPI_Allreduce.html

(你想要的操作可能是MPI_SUM)

1

我不t完全了解您的应用程序,但您可能对MPI_Bcast函数感兴趣,它会将数组广播到您的所有处理器。但是,使用大量的MPI_Bcast通常不是一个好主意,因为长时间用于通信而不是处理。

+0

MPI_Allreduce可以被认为是一个MPI_Reduce后跟一个MPI_Bcast(尽管我希望它可以更高效地实现) – mgilson 2012-04-12 00:05:46

0

您可以通过one-sided通信与其他人共享一个进程上的阵列。然而,这被许多人认为是次优解决方案。也许你会变得更好,重新思考你的算法,并尝试在消息传递范式中进行更多的阐述。

+0

断开链接“单向”。 – 2015-11-29 12:02:35

+0

@ bogdan.rusu谢谢,修复它。 – haraldkl 2015-11-29 21:49:27

相关问题