MPI和全局变量

时间:2013-12-11 18:39:36

标签: mpi

我必须实施MPI计划。有一些全局变量(4个浮点数数组和其他6个单浮点变量),这些变量首先由主进程从文件中读取数据进行初始化。然后我调用MPI_Init,当等级0的进程等待结果时,其他进程(等级1,2,3,4)在数组等上工作... 问题是那些数组似乎不再被初始化,所有都设置为0.我试图在主函数内移动全局变量,但结果是相同的。当调用MPI_Init()时,所有进程都是由fork创建的吗?所以每个人都有父亲的记忆副本,为什么他们看不到初始化的数组?

3 个答案:

答案 0 :(得分:8)

我担心你被误解了。

最好将每个MPI流程视为一个独立的程序,尽管它与计算中的每个其他流程具有相同的源代码。处理0的操作在其地址空间中执行变量对其他进程的地址空间的内容没有影响。

我不确定MPI标准是否要求进程0具有在调用mpi_init之前声明和初始化的变量的值,即在进程0确实存在之前。

无论是否,您都必须编写代码以将值传递到其他进程的地址空间中的变量中。执行此操作的一种方法是让进程0将值一个接一个地发送到其他进程或使用广播。另一种方法是让所有进程从输入文件中读取值;如果您选择此选项,请注意对i / o资源的争用。

顺便说一句,我认为MPI实现通过在调用mpi_init时分叉来创建进程是不常见的,forking更常用于创建线程。我认为大多数MPI实现实际上是在调用mpiexec时创建进程,对mpi_init的调用是宣告程序正在开始并行计算的形式。

答案 1 :(得分:8)

  

当调用MPI_Init()时,所有进程都是由fork右创建的吗?

<强>错误。

MPI会生成程序的多个实例。这些实例是单独的进程,每个进程都有自己的内存空间。每个进程都有自己的每个变量的副本,包括全局变量。 MPI_Init()仅初始化MPI环境,以便可以调用其他MPI函数。

答案 2 :(得分:3)

正如其他答案所说,这不是MPI的工作方式。数据对于每个流程都是唯一的,必须使用MPI规范中提供的API在流程之间明确传输。

但是,有一些编程模型允许这种行为。如果,当您说并行计算时,您指的是一个处理器上有多个内核,那么使用OpenMP之类的内容在线程之间共享数据可能会更好。

或者,如果您确实需要使用多个处理器(因为您的数据太大而无法放入一个处理器的内存或其他原因),您可以查看其中一个并行全局地址空间( PGAS)语言。在这些模型中,您拥有全局可用于执行中所有进程的内存。

最后,有一部分MPI允许您将内存从一个进程暴露给其他进程。它是远程内存访问(RMA)或单面章节。它可能很复杂,但如果那是你需要的那种计算模型就很强大。

所有这些模型都需要更改应用程序的工作方式,但听起来它们可能会更好地映射到您的问题。