2015-04-04 50 views
0

我在F77中写了一个小测试问题(是的,我知道它已经过时了,不是因为我不打算进入的原因我不能移动到F90),而且我正在尝试将其与MPI并行化。我对SMP(特别是OpenMP)比较熟悉,但是我对MPI如何分配内存缺乏了解。我当前的代码结构在程序开始时捕获了大量内存,然后分割出静态维度的数组(一种避免动态内存分配问题而不动态分配内存的方式)。我的问题是这样的:我在程序开始时分配很多内存(通常是大量的可用RAM)。如果我尝试这样做MPI,它会尝试为每个进程分配相同的大数组吗?FORTRAN 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) 

等...等...让我们说max_mem的是一个值,以使它们的分配分配两个将超过可用的RAM。每个进程都会尝试分配一个维度为MDV的新V数组吗?

回答

2

在MPI程序中,每个进程执行相同的程序。如果您受限于FORTRAN77对于静态分配的影响,那么您在每次程序启动时都会获得相同数量的内存。有时候这不是问题 - 例如,当MPI程序运行在分布式内存机器上,每台进程都可以访问单独的本地内存。有时候这是一个问题 - 例如,当在同一台计算机上运行8个MPI进程(可能是多核桌面)时,每个进程都试图获取所有可用内存。

因此,就您的问题而言 - 是的,每个MPI进程都会尝试抓取整个可用内存,这样会导致不好的事情发生。

+0

谢谢,那就是我一直在寻找的。我正在计划开发混合体系结构(节点上的MPI,节点上的SMP),因此抓取每个节点上的本地内存不应该给我太多问题。 – 2015-04-08 14:18:43