2017-06-28 42 views
0

我有一個基本程序,我試圖運行以確定MPI將放置任務的位置,因爲任務數量大於可用處理器的數量(超額訂閱)。如果我運行,例如,mpirun -np <program name>結果會給:如何確定本地節點在MPI中的任務位置

processor   0 of   4 
processor   1 of   4 
processor   2 of   4 
processor   3 of   4 

但是,如果我在「8」的處理器上運行相同的命令,我得到:

processor   1 of   8 
processor   2 of   8 
processor   5 of   8 
processor   6 of   8 
processor   4 of   8 
processor   3 of   8 
processor   7 of   8 
processor   0 of   8 

據我所知,有沒有8實際的核心運行我的程序,而是我有多個任務在相同的處理器上運行,我想知道它們是如何分佈的。提前致謝。

編輯:

program test 

    ! Similar to "Hello World" example- trying to determine rank/ node placement 
    use mpi 
    implicit none 

    integer :: procid, ierr, numprocs, name_len 
    integer:: local 

    local= 'OMPI_COMM_WORLD_LOCAL_RANK' 

    !character* (MPI_max_processor_name) name 


    call MPI_INIT(ierr) 
    call MPI_COMM_SIZE(MPI_COMM_World, numprocs, ierr) 
    call MPI_COMM_RANK(MPI_COMM_World, procid, ierr) 
    !call Mpi_Get_Processor_Name(name,name_len, ierr) 

    print*, 'processor', procid, 'of', numprocs, 'On Local Node:',' ', local 

    call mpi_finalize(ierr) 
end program test 
+1

您正在使用哪種MPI實現? – francescalus

+1

您正在使用哪種CPU架構?你是什​​麼意思的字*「處理器」*?你是指一個插座中的物理CPU嗎?還是一個CPU內核?還是超線程虛擬內核?你只有一臺電腦或一個集羣? –

回答

0

您可以發佈您的測試計劃? 是來自MPI_Comm_rank()MPI_Comm_size()的「y的處理器x」?在這種情況下,這些數字是MPI等級,並且與綁定無關。 你寧願閱讀你的MPI文檔,弄清楚綁定是如何完成的。

的另一種選擇我有時用的是(與Open MPI)

mpirun --tag-output grep Cpus_allowed_list /proc/self/status 

注意,當你超額認購您的節點不進行結合的可能性。

+0

我會說處理器是直接來自'MPI_Comm_rank()'和'MPI_Comm_size()' –

+0

,所以這些不是'處理器',而是'隊伍' –

+0

是的,這是正確的。我想說一個更好的方式來說明我正在尋找的是找出mpi如何在超額認購的場景中分配等級。我認爲默認情況下,它會輪流通過,但我想提供一個結果顯示這一點的輸出。 例如,我在我的雙核筆記本電腦上運行代碼。我知道只有2個可用的處理器。但是,我可以通過選擇使用'mpirun -n 8 myprogram'運行來超額訂購處理器...我想通過本地等級值 –

0

不幸的是,在MPI中,對於不同的含義使用相同的單詞是很常見的。

例如,工作經理傾向於混合處理器處理器並將其用於不同的含義。在這種情況下,我將使用以下內容:

這也適用於MPI_Get_processor_name。該標準實際上並不要求返回唯一標識處理器的名稱。名稱留給實現,通常傾向於報告主機的名稱。這不是我假設你正在尋找的。

我將使用單詞處理器來標識CPU內核,或者在支持超線程的情況下,使用硬件線程(儘管硬件線程不完全是CPU內核)。

通常允許在不同的處理器上執行常規進程(無論是否爲MPI)。這並不一定意味着該進程將使用所有這些處理器,而是如果前者現在被不同進程佔用(通常由於操作系統調度器),則能夠從一個跳轉到另一個。

要獲得進程關聯(進程可以使用的處理器列表),您應該使用不同的接口。例如,您可以使用類似sched_getaffinity(但這是C)。某些MPI實現(如Intel MPI)允許您在MPI_Init上打印進程關聯性,並設置環境變量。

我會考慮使用報告親和力的現有程序。檢查this page in the MPICH documentation

還包括在MPICH源中的是用於根據OS打印過程(src/pm/hydra/examples/print_cpus_allowed.c)的親和性的程序。這可以在Linux系統上使用,以測試綁定是否正常工作。

shell$ mpiexec -n 8 -bind-to socket ./print_cpus_allowed | sort 
crush[0]: Cpus_allowed_list: 0,2,4,6 
crush[1]: Cpus_allowed_list: 1,3,5,7 
crush[2]: Cpus_allowed_list: 0,2,4,6 
crush[3]: Cpus_allowed_list: 1,3,5,7 
crush[4]: Cpus_allowed_list: 0,2,4,6 
crush[5]: Cpus_allowed_list: 1,3,5,7 
crush[6]: Cpus_allowed_list: 0,2,4,6 
crush[7]: Cpus_allowed_list: 1,3,5,7 
相關問題