FORTRAN MPI 内存分配

FORTRAN MPI Memory allocation

我正在 F77 中编写一个小测试问题(是的,我知道它已经过时了,不,我不能转移到 F90,因为我不打算进入),我正在尝试并行化它与 MPI。我对 SMP(特别是 OpenMP)比较熟悉,但是我 运行 对 MPI 如何分配内存缺乏了解。我当前的代码结构在程序开始时会占用一大块内存,然后划分出静态维度数组的片段(一种无需动态分配内存即可解决动态内存分配问题的方法)。我的问题是:我在程序开始时分配了 很多 内存(通常是可用 RAM 的大部分)。如果我尝试这样做,MPI 会尝试为每个进程分配相同的大数组吗?

例如

Program MPI_SUM
Implicit Real*8(A-H,O-Z)
Include '/usr/include/mpi/mpif.h'
Parameter (MDV = MAX_MEM) ! Let's say I have MAX_MEM defined here
Dimension V(MDV)

Call MPI_Init(IErr)
Call MPI_WORLD_RANK(MPI_COMM_WORLD,myID,IErr)
Call MPI_WORLD_SIZE(MPI_COMM_WORLD,nProc,IErr)

Ect...Ect... 假设 MAX_Mem 是一个值,分配其中两个将超过可用 RAM。每个进程都会尝试分配一个新的 MDV 维度的 V 数组吗?

在 MPI 程序中,每个进程执行相同的程序。如果您因为对 FORTRAN77 的喜爱而被限制为静态分配,那么您将被限制为每个进程在程序启动时获取相同数量的内存。有时这不是问题——例如,当 MPI 程序 运行 在分布式内存机器上时,每个进程都可以访问单独的本地内存。有时这是一个问题——例如,当同一台计算机(可能是多核台式机)上的八个 MPI 进程 运行 每个都尝试获取所有可用内存时。

因此,就您的问题而言——是的,每个 MPI 进程都会尝试获取整个可用内存,糟糕的事情会接踵而至。