0

私は少しMPIを勉強していて、オブジェクトを呼び出すプログラムを作成してテストを行うことにしました。たとえば、main.c->メインプログラムfunction.c->任意の関数

MPIのみを使用するfunction.c。次のようにIをコンパイルします。

gcc-c main.c

作成するmain.ompicc-c作成するfunction.c function.o、もちろん私もファイルを作成しますfunction.h

mpicc-oプログラムでコンパイルしますmain.o function.o

ここはmain.c

#include <stdio.h>
#include "function.h"

void main(int argc, char *argv[])
{
  printf("Hello\n");
  function();
  printf("Bye\n");
}

関数にはMPIコードが含まれていますが、プログラムmpiexe -np 2を実行すると、次のようになります。

Hello
Hello
----- function job here -----
Bye
Bye

でも私はそれが欲しかった

Hello
------ function job -----
Bye

私に何ができる?

4

3 に答える 3

1

プログラム全体は、で設定した2つのプロセッサの両方で実行されます-np 2。印刷出力や最終結果などの重複を防ぐ一般的な方法は、最初にスレッドIDを確認するだけで、1つのスレッドにそれらの処理を実行させることです。好き:

int id;
MPI_Comm_rank(MPI_COMM_WORLD, &id);
if (id == 0) {
  printf("only process %d does this one\n", id);
}

printf("hello from process %d\n", id);  // all processes do this one

MPIを開始したとき、各スレッドが処理していた部分的な結果やデータとともに、これらのID番号を出力すると便利であることがわかりました。何が起こっているのかをより理解するのに役立ちました。

于 2012-04-18T01:09:42.667 に答える
0

私は通常、データを印刷するためにこの方法を好みます。それは障壁を含みます。したがって、使用中は注意が必要です。

if(1)
do
  for(i = 0 to num_threads)
  do
     if(i==my_rank)
     do
       do_printf
     done

      ******* barrier ********
  end for
done

値を出力するスレッドのセットにすべてのスレッドが含まれていない場合は、関連するスレッドをバリアに追加するだけです。

もう1つの方法は、すべてのスレッドがその出力を専用ファイルに書き込むことです。こちらです :

  1. バリアにアクセスする必要はありません
  2. スレッドのprintfsを失うことはありません
  3. 出力は明示的です。そのため、プログラムのデバッグ中に混乱することはありません。

コード:

sprintf(my_op_file_str, "output%d", myThreadID);
close(1)
open(my_op_file_str)

Now use printf's anywhere you may like.
于 2012-04-18T05:54:43.267 に答える
0

基本的にmpirun -np 22つの同一のプロセスを開始し、MPI_Comm_rank関数を使用してプロセスのランクを確認する必要があります。

簡単なスニペットは次のとおりです。

int main(int argc, char **argv)
{
  int myrank;
  MPI_Init(&argc, &argv);
  MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
  if (myrank == 0) {
    printf("Hello\n");
    function();
    MPI_Barrier(MPI_COMM_WORLD);
    printf("Done\n");
  } else {
    function();
    MPI_Barrier(MPI_COMM_WORLD);
  }
  MPI_Finalize();
  return 0;
}
于 2012-04-18T01:06:20.810 に答える