這是一個棘手的問題。我會盡力準確地描述它。我繼承了一個Fortran程序,它包含幾千行Fortran代碼(在一個子例程中),它使用mpi來並行化計算。幸運的是隻使用很少的MPI命令,在這裏他們當節點僅被部分保留時,MPI通信停止
call mpi_gather(workdr(ipntr(2)),int(icount/total),mpi_double_precision,&
& workdr(ipntr(2)),int(icount/total),mpi_double_precision,0,mpi_comm_world,mpierr)
call mpi_gather(workdi(ipntr(2)),int(icount/total),mpi_double_precision,&
& workdi(ipntr(2)),int(icount/total),mpi_double_precision,0,mpi_comm_world,mpierr)
一對夫婦的十幾行後此之後
call mpi_bcast(workdr(istart),j,mpi_double_precision,total-1,&
& mpi_comm_world,mpiierr)
call mpi_bcast(workdi(istart),j,mpi_double_precision,total-1,&
& mpi_comm_world,mpiierr)
call mpi_bcast(workdr(ipntr(2)),icount,mpi_double_precision,0,mpi_comm_world,mpiierr)
call mpi_bcast(workdi(ipntr(2)),icount,mpi_double_precision,0,mpi_comm_world,mpiierr)
兩個例程和周圍的代碼包含在if語句,即每個秩
call znaupd (ido, bmat, n, which, nev, tol, resid, ncv,&
& v, ldv, iparam, ipntr, workd, workl, lworkl,&
& rworkl,info)
if (ido .eq. -1 .or. ido .eq. 1) then
[...code here...]
[...mpi code here...]
[...couple of dozen lines...]
[...mpi code here...]
[...code here...]
end if
此代碼編譯和編譯併產生合理的結果進行評估(它是一個物理仿真)
- 它運行的單個節點,從4到64個CPU與任何測試的細
- 如果一個人使用多個節點,完全預留節點,即
- 使用節點1 24的24個CPU它運行細
- 24 24使用的CPU節點2
- 但是,當一個被保留的節點僅部分
- 節點1使用24℃的12檔它使用12 24的CPU的
爲了更精確膿
因此,您可能認爲如果沒有看到完整的代碼就無法回答這個問題,因爲肯定會有某些事情導致if語句在0級節點上錯誤地評估。
然而,考慮到只要預留節點上的所有處理器,它就可以在單個節點和任意數量的節點上運行任意數量的處理器。
我對這個問題的看法到目前爲止,我的問題:
是上述MPI調用攔截?我的理解是,上述mpi命令被緩衝,因此雖然某些進程可能會繼續執行,但它們的消息會保存在接收器的緩衝區中。所以消息不會丟失。那是對的嗎?
有沒有人遇到類似這樣的問題?如果不是所有的處理器都被保留,是否失速?我不得不承認我有點失落。我真的不知道從哪裏開始調試。任何提示和指針非常感謝。
此問題已在具有不同編譯器和不同mpi實現的不同羣集上重現。這似乎是代碼中的一個問題。
非常感謝您的幫助。任何想法,不勝感激。
編輯:這裏是我們的系統的更多細節:
MPI Environenment:MVAPICH2 V1.6
編譯器:英特爾ifort 13.2
使用的ARPACK庫是標準ARPACK,不p_arpack。該代碼負責並行化(優化內存使用)
這是p_arpack?在20年之後出現的一個顯示停止錯誤將是非常奇怪的。它被修改了嗎?除此之外,是的,收集和廣播是集體阻止操作,並且不存在通信被跳過或不按順序的機會。我認爲你將不得不把它縮小到一個[最小的例子](http://stackoverflow.com/help/mcve)。 – 2014-12-05 01:50:58
還描述您的系統和MPI實施。當計算機駐留在不同的子網上時,我遇到了OpenMPI 1.8.0的懷疑停頓。 – 2014-12-05 08:20:41
感謝您的意見,我在問題中添加了所需的詳細信息。 – ftiaronsem 2014-12-05 14:40:30