我希望在使用OpenMPI的不同处理器上拥有相同的阵列hist(1:1000)
,以便当一个处理器修改hist
时,此修改在其余处理器中得到更新。如何在使用MPI的不同处理器上使用相同阵列
我已经写了一个代码并宣布为hist(1:1000)
,但问题是hist
在每个处理器上独立更新,那么我所做的就是将数据发送到“主节点”以基于信息更新另一个直方图的奴隶,但这是我不想要的。我想要在每个处理器上更新相同的直方图。
是否可以使用OpenMPI做到这一点?
我希望在使用OpenMPI的不同处理器上拥有相同的阵列hist(1:1000)
,以便当一个处理器修改hist
时,此修改在其余处理器中得到更新。如何在使用MPI的不同处理器上使用相同阵列
我已经写了一个代码并宣布为hist(1:1000)
,但问题是hist
在每个处理器上独立更新,那么我所做的就是将数据发送到“主节点”以基于信息更新另一个直方图的奴隶,但这是我不想要的。我想要在每个处理器上更新相同的直方图。
是否可以使用OpenMPI做到这一点?
据我所知,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)
我不t完全了解您的应用程序,但您可能对MPI_Bcast函数感兴趣,它会将数组广播到您的所有处理器。但是,使用大量的MPI_Bcast通常不是一个好主意,因为长时间用于通信而不是处理。
MPI_Allreduce可以被认为是一个MPI_Reduce后跟一个MPI_Bcast(尽管我希望它可以更高效地实现) – mgilson 2012-04-12 00:05:46
您是否尝试将hist声明为共享变量? – Neo 2012-04-11 22:44:56
我怎么能这样做?问候。 – armando 2012-04-11 22:55:45
哎呀..我的错误..我误解为OpenMP ..只是注意到它是openmpI ..就像mgilson在下面的答案中所述,如果你可以使用OpenMP,你可以有一个共享变量。但是,OpenMP影响可伸缩性。所以如果你打算继续使用MPI,你必须使用像MPI_Gather这样的收集操作。没有其他方法! – Neo 2012-04-11 23:44:50