2014-03-05 43 views
0

我有一個大的Fortran90應用程序,我試圖進行調試。我試圖讓所有的處理器在程序給定的位置拋售他們的特定變量的值,但我只得到了處理器的子集,有時反覆處理器行列使用下面的代碼:使用MPI_Barrier在所有處理器上打印變量的值

call mpi_barrier(mpi_comm_world, imstat) 
do i = 0, nprocs 
    if (rank == i) print*, rank, ! ... hopefully useful stuff 
    call mpi_barrier(mpi_comm_world, imstat) 
end do 

我以前在這個特定的應用程序中遇到了堆棧損壞的問題,所以我懷疑我的問題是這樣的錯誤。但是我很難弄清楚我在所有處理器上看不到該值的原因是該錯誤還是我的傾銷代碼有問題。

輸出我第一次調用程序(用於nprocs = 30)是

rank, ntiltin =   29   1 m rank, ntiltin =   24   14 
rank, ntiltin =   24   14 
rank, ntiltin =   24   14 
rank, ntiltin =   24   14 
rank, ntiltin =   24   14 
rank, ntiltin =   24   14 
rank, ntiltin =   24   14 
rank, ntiltin =   24   14 
rank, ntiltin =   24   14 
rank, ntiltin =   24   14 
rank, ntiltin =   24   14 
rank, ntiltin =   24   14 
rank, ntiltin =   24   14 
rank, ntiltin =   24   14 
rank, ntiltin =   24   14 
rank, ntiltin =   24   14 
rank, ntiltin =   24   14 
rank, ntiltin =   24   14 
rank, ntiltin =   24   14 
rank, ntiltin =   24   14 
rank, ntiltin =   24   14 
rank, ntiltin =   24   14 
rank, ntiltin =   26   14 
rank, ntiltin =   26   14 
rank, ntiltin =   26   14 
rank, ntiltin =   26   14 
rank, ntiltin =   26   14 
rank, ntiltin =   26   14 
rank, ntiltin =   26   14 
rank, ntiltin =   26   14 
rank, ntiltin =   26   14 
rank, ntiltin =   26   14 
rank, ntiltin =   26   14 
rank, ntiltin =   26   14 
rank, ntiltin =   26   14 
rank, ntiltin =   26   14 
rank, ntiltin =   26   14 
rank, ntiltin =   26   14 
rank, ntiltin =   26   14 
rank, ntiltin =   26   14 
rank, ntiltin =   26   14 
rank, ntiltin =   26   14 
rank, ntiltin =   26   14 
rank, ntiltin =   26   14 
rank, ntiltin =   26   14 
rank, ntiltin =   26   14 
rank, ntiltin =   26   14 

而另一位,下一次我打電話同常規:

rank, ntiltin =   20   5 
rank, ntiltin =   28   5 
rank, ntiltin =   20   5 
rank, ntiltin =   20   5 
rank, ntiltin =   20   5 

它也像我有輸出緩衝的問題,但我編譯使用ifort,谷歌搜索產生了一個結果(Enable buffered I/O to stdout with Intel ifort compiler),似乎表明緩衝到標準輸出不是什麼ifort會做的。我將輸出重定向到一個文件,所以也許有一些系統緩衝,那是我的問題?

所以我的問題是,這看起來像是一個合理的代碼片段來轉儲出所有處理器上的變量的值,或者是我缺乏睡眠趕上我?

在此先感謝!

+0

添喜禁用它們 - 以最快的方式來解決這類問題是使用一個調試器 - 因爲這些報告完全正在發生,沒有輸出緩衝的霧。見:http://stackoverflow.com/questions/5985424/parallel-debuggers一些意見和建議。 – David

回答

1

如果您懷疑存在堆棧損壞問題,那麼不打印到標準輸出是一個普遍的想法。對於MPI來說,這更重要,其中stdout本身重新路由到執行實際寫入的任務0。

作爲一般性建議,在這種情況下,讓每個任務打開一個文件,使用其任務ID進行參數化,並讓每個任務寫入文件,並在每次寫入後執行刷新。

爲了正確對齊文件,只需打印更多的內容,如迭代數字,以便在分離的輸出文件中重新生成正確的順序。

我知道,這很煩人,但有時需要發現......惱人的問題!一旦你解決了它,就把它全部清除掉。

如果你正在處理一個大的項目,你可以評估使用#ifdef的以及C預處理器以參數啓用/編譯時

+0

對於每個進程,將調試內容寫入不同的文件是我認爲最好的方法,至少對於少量的進程。無論如何,其他兩個選項可能是:使用mpi_gather收集數據並讓一個進程一起打印它們。使用並行調試器查看特定值。 – haraldkl