2014-12-04 58 views
0

這是一個棘手的問題。我會盡力準確地描述它。我繼承了一個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的

爲了更精確膿

  • 節點2,它是被拖延秩= 0的節點。上面的代碼在循環中運行,直到if語句的計算結果爲false。輸出顯示代碼已經運行好幾次了,但之後就發生了。有幾個進程正在評估if語句爲false並退出循環。但是0級節點評估它爲真,並在它調用mpi_gather時停止。

    因此,您可能認爲如果沒有看到完整的代碼就無法回答這個問題,因爲肯定會有某些事情導致if語句在0級節點上錯誤地評估。

    然而,考慮到只要預留節點上的所有處理器,它就可以在單個節點和任意數量的節點上運行任意數量的處理器。

    我對這個問題的看法到目前爲止,我的問題:

    1. 是上述MPI調用攔截?我的理解是,上述mpi命令被緩衝,因此雖然某些進程可能會繼續執行,但它們的消息會保存在接收器的緩衝區中。所以消息不會丟失。那是對的嗎?

    2. 有沒有人遇到類似這樣的問題?如果不是所有的處理器都被保留,是否失速?我不得不承認我有點失落。我真的不知道從哪裏開始調試。任何提示和指針非常感謝。

    此問題已在具有不同編譯器和不同mpi實現的不同羣集上重現。這似乎是代碼中的一個問題。

    非常感謝您的幫助。任何想法,不勝感激。

    編輯:這裏是我們的系統的更多細節:

    MPI Environenment:MVAPICH2 V1.6
    編譯器:英特爾ifort 13.2
    使用的ARPACK庫是標準ARPACK,不p_arpack。該代碼負責並行化(優化內存使用)

  • +1

    這是p_arpack?在20年之後出現的一個顯示停止錯誤將是非常奇怪的。它被修改了嗎?除此之外,是的,收集和廣播是集體阻止操作,並且不存在通信被跳過或不按順序的機會。我認爲你將不得不把它縮小到一個[最小的例子](http://stackoverflow.com/help/mcve)。 – 2014-12-05 01:50:58

    +0

    還描述您的系統和MPI實施。當計算機駐留在不同的子網上時,我遇到了OpenMPI 1.8.0的懷疑停頓。 – 2014-12-05 08:20:41

    +0

    感謝您的意見,我在問題中添加了所需的詳細信息。 – ftiaronsem 2014-12-05 14:40:30

    回答

    0

    原來的問題不在代碼中。這是mpi的實現!起初我沒有想到這一點,因爲我在兩個不同的集羣上運行程序,使用不同的mpi實現(mvapich和intel mpi)。然而,事實證明,兩者都來自同一個8歲的mpich實施。升級到更新版本的mvapich(從mpich的更新版本派生)後,奇怪行爲停止並且代碼按預期運行。

    再次感謝所有提供意見的人。