2016-04-26 74 views
0

我的示例代碼FORTRAN是這樣的:MPI設計循環代碼

call MPI_INIT(ierr) 
call MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr) 
call MPI_COMM_SIZE(MPI_COMM_WORLD, ntasks, ierr) 

if (myid==0) then 
10 serial_subroutine1 
end if 

parallel_function (myid, ntasks) 

if (myid==0) then 
    serial_subroutine2 
    if (some requirements meet) go to 10 
end if 

call MPI_FINALIZE(IERR) 
end 

這似乎是一些在serial_subroutine1輸出晚於parallel_function輸出。程序不會在serial_subroutine2中輸出任何內容,就像停止一樣。

我想知道是什麼原因導致這個問題,以及如何解決這個問題? MPI應該如何設計這種代碼?

你的回答將不勝感激!

謝謝!

+1

你能或許可以將例如有效的Fortran?我可以推斷出可能通過你'10 serial_subroutine1'的意思,但'去10'以後(跳躍_into_的構建是否?)... – francescalus

+0

我知道,跳進一個if結構是無效的。如果我想在MPI中實現這個示例代碼,該怎麼做? –

回答

0

我相信你要像下面這樣一個循環。我假設你想通過並行通話,只要你的條件得到滿足。

logical :: keep_going 
... 

keep_going=.true. 
do 

    if(myid==0) call serial1() 

    call parallel(myid,tasks) 

! Do more serial work and test on root pe 
    if(myid==0) then 
    call serial2() 
    keep_going=some_test_on_root_pe() 
    endif 

    ! let everyone know if we are continuing 
    call mpi_bcast(keep_going,1,mpi_logical,0,mpi_comm_world,ierr) 

    ! Do we bail out? 
    if(.not. keep_going) exit 
enddo