我在F77中写了一个小测试问题(是的,我知道它已经过时了,不能因为我不打算进入F90而转移到F90) ,我试图将其与MPI并行化。我对SMP(特别是OpenMP)比较熟悉,但我对MPI如何分配内存缺乏了解。我当前的代码结构在程序开始时抓取了一大块内存,然后分割出一个静态大小的数组(一种绕过动态内存分配问题而无需动态分配内存的方法)。我的问题是这样的:我在程序开头分配很多的内存(通常是可用内存的大部分)。如果我尝试这样做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数组?
答案 0 :(得分:2)
在MPI程序中,每个进程执行相同的程序。如果您因为对FORTRAN77的喜爱而受限于静态分配,那么在程序启动时,每个进程都会限制占用相同数量的内存。有时这不是问题 - 例如,当MPI程序在分布式内存机器上运行时,每个进程都可以访问单独的本地内存。有时这是一个问题 - 例如,当在同一台计算机(可能是多核桌面)上运行的八个MPI进程都试图获取所有可用内存时。
所以,就你的问题而言 - 是的,每个MPI进程都会尝试获取整个可用内存,随之而来的是坏事。