2017-03-03 4 views
2

私はCで並列プログラミングのためにMPIを学習しています。私は4つのコアを持つプロセッサを使用しています。MPIはC言語で1つのプロセスしか認識しませんか?

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'が実際には同じmp1ライブラリ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は1つの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には "alternatives"のシステムもあり、シンボリックリンクmpiccmpirunを実際のスクリプトにインストールします(リンクの現在の状態を確認するにはls -l /usr/bin/mpicc /usr/bin/mpirunを実行してください)。 man pagedocsをチェックして、すべてのmpi名前付きスクリプトを1つの実装にリセットする方法を学びます(GUI用にはgalternatives GUIがあります)。パッケージ内のファイルのリストによると

、MPICHと接尾辞http://packages.ubuntu.com/yakkety/amd64/openmpi-bin/filelisthttp://packages.ubuntu.com/yakkety/amd64/mpich/filelistとのmpirun /のmpiexecのバリアントを持っているOpenMPIの: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ペアまたはmpicc.mpich & mpiexec.mpichペアを使用することもできます。

そして、いくつかのMPI実装を使用するには、binパッケージ、libパッケージ、およびdevパッケージの両方に完全にインストールする必要があります。

関連する問題