2012-11-18 38 views
0

更新:我有一個問題,我不知道它是什麼。我有一個MPI_INIT和MPI_FINALIZE的測試程序。我有一個包含5個子例程的模塊:3個子例程是相關的,獨立於2個其他子例程。我想將測試程序中的MPI代碼放入此模塊中。我將MPI_INIT放入聲明變量的模塊中,並放在子例程之前。我得到一個具有相同錯誤消息的一系列錯誤:更新:我應該把MPI放在模塊還是模塊的子程序中?

This statement must not appear in the specification part of a module 

如何「MPI_INIT和MPI_FINALIZE應該被稱爲一次」影響Fortran程序,模塊和子程序?如果有多個獨立程序,我應該在哪裏放置MPI函數和變量,每個程序都調用這個模塊的子程序多次?

~~~~~~~~~ 我有一個模塊,其中包含一系列子例程,其中包含我希望並行化的do循環。其他程序使用的子例程是公共的。我應該定義子程序外MPI:

module ... 
call MPI_INIT 
subroutine 1 
... (MPI code) 
subroutine 2 
subroutine 3 
MPI_GATHERV 
call MPI_FINALIZE 
module 

或每個子程序裏面?

module ... 
subroutine 1 
call MPI_INIT 
... (MPI code) 
MPI_GATHERV 
call MPI_FINALIZE 
subroutine 2 
call MPI_INIT 
... (MPI code) 
MPI_GATHERV 
call MPI_FINALIZE 
subroutine 3 
call MPI_INIT 
... (MPI code) 
MPI_GATHERV 
call MPI_FINALIZE 
module 

我看到下面的粗糧原則的解決方案1的優勢,如果一個程序調用子程序1,它是否也會執行子程序外MPI代碼?

+2

是的,在主程序開始時初始化MPI,並在最後完成。 – milancurcic

+0

謝謝大家的回覆! – Pippi

回答

6

你應該初始化並且在程序完成MPI一次。調用MPI_Finalize之後,您不能再執行MPI操作。該標準說:

一旦MPI_FINALIZE回報,沒有MPI程序(甚至沒有MPI_INIT)可以被調用,除了MPI_GET_VERSION,MPI_GET_LIBRARY_VERSION,MPI_INITIALIZED,MPI_FINALIZED,並帶有前綴MPI_T_(在限制範圍內的功能與任何功能這個前綴在14.3.4節中列出)。

(MPI3,P361,L25)MPI3 PDF

回覆更新: 你不允許把可執行語句到你的代碼的聲明部分。關鍵是,在執行過程中應該只有一個對MPI_Init和MPI_Finalize的調用意味着這一點。您的應用程序可以讀取類似的東西:如果您想要在程序的開始做各種初始化的東西

program mini 
    use mpi 
    implicit none 
    integer :: iError 
    call mpi_init(iError) 
    call do_some_stuff() 
    call mpi_finalize(iError) 
end program mini 

,當然你也可以在模塊子程序結合起來,並呼籲MPI_INIT在那裏。如果您爲模塊使用測試程序,請在此處使用mpi_init和mpi_finalize。 一種用於在一些子程序MPI_INIT和mpi_finalize的調用示例可在例如我們用它來設置很一般的東西env_module of the treelm library被發現。

如果有多個獨立的程序,每個調用該模塊的子程序多次,我應該在哪裏放置MPI函數和變量?

你能不能改一下嗎?我不明白。 MPI函數和變量應該在mpi模塊中,如果你有多個獨立程序調用它們,它們都必須「使用」mpi模塊。獨立程序本身也可以使用MPI_Init和MPI_Finalize。也許你可以發佈一個簡短的代碼示例,你想實現什麼以及你的問題是什麼。

+0

MPI-3.0僅有兩個月的歷史,目前沒有MPI實現支持它。你應該更好地引用MPI-2.2而不是下一年:) –

+0

我需要一些幫助! – Pippi

+0

更新我的答案,試圖涵蓋您更新的問題。 – haraldkl

相關問題