如何使用MPI在不同的处理器上使用相同的阵列

时间:2012-04-11 21:45:45

标签: c++ c fortran fortran90 openmpi

我希望在使用OpenMPI的不同处理器上使用相同的数组hist(1:1000),这样当一个处理器修改hist时,此修改将在其余处理器中更新。

我编写了一个代码并声明hist(1:1000),但问题是hist在每个处理器上独立更新,然后我做的是将数据发送到“主节点”以便根据奴隶的信息更新另一个直方图,但这是我不想要的。我想在每个处理器上更新相同的直方图。

是否可以使用OpenMPI执行此操作?

3 个答案:

答案 0 :(得分:6)

据我所知,MPI无法做到这一点。 MPI的目的是实现从一个进程到另一个进程的消息传递(因此名称 - 消息传递接口)。如果你想使用共享内存,最好的办法就是使用像OpenMP这样的东西(我认为它可能在那里?),至少gcc / gfortran以及其他许多编译器都支持它。你可以使用线程...但是,最终,这些都没有扩展到像MPI这样的1000个处理器。根据你正在做的事情,你可以尝试MPI的集体操作 - 正如你所提到的,hist存储了一个直方图,所以你可能只想要你正在使用的所有组合的总和,而你的计算实际上并不依赖于HIST。 MPI可以在更改后为您汇总所有数组......

见例如

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您可以借助one-sided通信与其他进程共享一个进程上的数组。然而,许多人认为这是次优解决方案。也许你会更好,重新考虑你的算法,并尝试在消息传递范例中更多地制定它。