2015-04-04 91 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