2013-05-02 71 views
1

我正在向Fortran程序添加選項以使用多處理器使用MPI運行它。如果用戶要並行運行它,用戶需要指定不同的輸入文件---針對問題的每個域(處理器)的一個文件。該程序將默認查找特定的文件名(一個名爲「serial.inp」的文件)。因此,我需要程序知道它何時並行運行,以便它可以改爲查找其他文件名(例如「parallel_1.inp」,「parallel_2.inp」,「parallel_3.inp」等)。我首先想到的是讓用戶將參數傳遞給程序,當他們執行它,例如:使用mpiexec開始的程序是否知道它是以mpiexec開始的?

程序mpiexec -n 4 myprogram.exe -parallel

通過這種方式,它會尋找並行文件時辯論是存在的。但它似乎有點多餘。如果使用mpiexec調用該程序,毫無疑問用戶正試圖並行運行它。有什麼方法可以讓我的程序知道它是用mpiexec開始的?或者命令行參數是我最好的選擇?

回答

2

Alex Leach是正確的,你可以使用MPI實現特定的環境變量查找來實現這一點,但是沒有可行的方法來實現這一點。

但據我所知,我不認爲你真的需要;你可以得到你最想要什麼,只需檢查,看它是否與一個等級上運行:

program filenames 
    use mpi 
    implicit none 

    integer :: comsize, rank, ierr 
    character(len=128) :: inputfilename 

    call MPI_Init(ierr) 

    call MPI_Comm_size(MPI_COMM_WORLD,comsize,ierr) 
    call MPI_Comm_rank(MPI_COMM_WORLD,rank,ierr) 

    if (comsize == 1) then 
     inputfilename = 'serial.inp' 
    else 
     write(inputfilename, '(A,I0,A)'), 'parallel_',rank,'.imp' 
    endif 

    write(*,'(I,1X,A)'), rank, trim(inputfilename) 

    call MPI_Finalize(ierr) 
end program filenames 

運行提供了

$ mpirun -np 4 ./filenames 
      0 parallel_0.imp 
      1 parallel_1.imp 
      2 parallel_2.imp 
      3 parallel_3.imp 
$ ./filenames 
      0 serial.inp 

這不是完美的;如果使用mpirun -np 1 filenames運行,它會給出連續的結果,但根據您的使用情況,這可能不是一件可怕的事情,以換取便攜式的東西。

+0

這正是我正在尋找的。我對這段代碼的並行化非常嚴格。用戶需要使用與其模型中的域相同數量的特效。如果他們只有一個域,它將是一個串行運行,所以「-np 1」問題對我來說並不是一個問題。換句話說,不可能只有一個並行文件「parallel_1.inp」。他們必須有「serial.inp」或多個「parallel _ *。inp」文件。否則,他們會收到錯誤消息。 – rks171 2013-05-03 18:51:00

2

運行於mpiexec的進程將設置各種環境變量,向子進程指示它們是主進程還是從進程等等。

查看您的mpiexec的文檔以瞭解具體細節。微軟也有some documentation online

2

爲什麼不以編程方式執行它?這就是我要做的事在我的計劃:

#ifdef MPI 
    CALL MPI_Init(ierr)     ! Initialize MPI 
    CALL MPI_Comm_rank(mpicomm,nproc,ierr) ! Who am I? 
    CALL MPI_Comm_size(mpicomm,size,ierr) ! How many processes? 
#else 
    nproc = 0 
    size = 1 
#endif 

在節目中這一點後,你可以查詢程序是否是通過查詢的size值串行或並行。

+0

這是有些不同的問題。據我所知,rks知道他用-DMPI編譯了他的程序,但他希望運行時檢測執行方式。 – 2013-05-03 09:10:33

+0

如果我錯了,請糾正我,但是ifdef語句(MPI調用)的第一部分不會執行,只有在源代碼使用MPI支持(mpif90)構建時纔會執行,如果代碼使用第二部分(else)沒有編譯這樣的支持?如果是這樣,即使代碼在沒有mpirun的情況下執行(只要它是使用MPI支持構建的),該解決方案仍然會查找並行文件。我希望它通過輸入./myprogram.exe來查找serial.inp,無論它是否使用MPI支持構建。 – rks171 2013-05-03 17:28:42

+0

你是對的。看看Jonathan Dursi的答案,這是我的例子的延伸。檢查它是單個還是多個進程程序並決定使用哪些輸入文件需要由您執行的代碼部分。所以,我的觀點是,對於您的問題,您無需擔心程序是否由'mpiexec'運行,或者代碼是否用'-DMPI'編譯。你關心有多少進程,這個信息由上面例子中變量'size'提供。 – milancurcic 2013-05-03 18:27:10