2017-03-03 62 views
2

我正在學習C語言並行編程的MPI,我正在使用一個4核處理器。我正嘗試從輸出應該是教程做一個例子:MPI只識別C中的一個進程?

Hello world! I'm process 0 out of 4 processes 
Hello world! I'm process 2 out of 4 processes 
Hello world! I'm process 1 out of 4 processes 
Hello world! I'm process 3 out of 4 processes 

以任何順序。

這裏是我的代碼:

#include <stdio.h> 
#include <mpi.h> 

int main(int argc, char** argv) 
{ 
    int ierr, num_procs, my_id; 
    ierr = MPI_Init(&argc, &argv); 

    ierr = MPI_Comm_rank(MPI_COMM_WORLD, &my_id); 
    ierr = MPI_Comm_size(MPI_COMM_WORLD, &num_procs); 

    printf("Hello world! I'm process %i out of %i processes\n", my_id, num_procs); 
    ierr = MPI_Finalize(); 
} 

我編譯它使用:

mpicc helloworld.c -o helloworld 

我使用運行它:

mpirun -np 4 helloworld 

這就是輸出:

Hello world! I'm process 0 out of 1 processes 
Hello world! I'm process 0 out of 1 processes 
Hello world! I'm process 0 out of 1 processes 
Hello world! I'm process 0 out of 1 processes 

它輸出4次這是比較好的消息,我猜測但程序沒有識別線程數和每個線程ID。

它甚至是平行運行還是隻是連續運行4次? 如何讓程序正確識別線程數量和線程ID?

提前致謝!

+2

您正在使用哪個MPI庫? – Arash

+0

mpich。我通過sudo apt-get mpich獲得的庫。除此之外,我還沒有做過任何事情。 @arash –

+1

請檢查您使用的mpirun是否來自相同的MPI庫mpich(它提供了mpicc),而不是來自openmpi。 (mpich有'mpiexec',openmpi有'mpirun';腳本使用的一組環境變量是不同的,所以mpirun不能保證程序並行啓動)。 – osgx

回答

0
mpicc helloworld.c -o helloworld 

mpirun -np 4 helloworld 

Hello world! I'm process 0 out of 1 processes 
Hello world! I'm process 0 out of 1 processes 
Hello world! I'm process 0 out of 1 processes 
Hello world! I'm process 0 out of 1 processes 

這個順序清楚地告訴我們,你的MPI運行時無法檢測並行開始,它可能從配置錯誤:您mpicc是從一個MPI實現和您的mpirun是從其他。例如,MPICH和OpenMPI都有用於編譯MPI程序的mpicc腳本,但它們的mpiexec/mpirun程序不兼容。使用MPICH進行編譯,從OpenMPI啓動程序開始,MPICH運行時將不會收到所需的環境變量以找出並行運行及其參數。

您應該重新安裝的軟件包(dpkg -l|egrep 'mpich|openmpi')的清單,並檢查該文件是從哪個庫(dpkg -L mpichdpkg -L openmpi-bin; dpkg -L libmpich-devdpkg -L libopenmpi-dev)。 Ubuntu/debian也有「替代品」系統,它將符號鏈接mpiccmpirun安裝到實際腳本中(請參閱ls -l /usr/bin/mpicc /usr/bin/mpirun查看鏈接的當前狀態)。檢查update-alternatives工具,其man pagedocs以瞭解如何將所有mpi命名的腳本重置爲一個實現(並且存在galternatives GUI)。

據包,MPICH文件列表和的openmpi具有的mpirun/mpiexec的帶有後綴的http://packages.ubuntu.com/yakkety/amd64/openmpi-bin/filelisthttp://packages.ubuntu.com/yakkety/amd64/mpich/filelist變型:用於mpicc腳本

/usr/bin/mpiexec.openmpi 
/usr/bin/mpirun.openmpi 
/usr/bin/mpiexec.hydra 
/usr/bin/mpiexec.mpich 
/usr/bin/mpirun.mpich 

同樣的情況:http://packages.ubuntu.com/yakkety/amd64/libopenmpi-dev/filelisthttp://packages.ubuntu.com/yakkety/amd64/libmpich-dev/filelist

/usr/bin/mpicc.openmpi 
/usr/bin/mpicc.mpich 

始終使用mpicc和mpirun(或mpiexec)。您也可以使用帶後綴的變體來確保:mpicc.openmpi & mpiexec.openmpi pair或mpicc.mpich & mpiexec.mpich pair。

爲了使用一些MPI實現,您應該已經完全安裝了bin,lib和dev軟件包。