0

フラグ -Dparallel (並列部分を有効にするためにコードで使用) で問題が発生しました。私がそれを使用すると、もう1つのOpenMPスレッドを取得することはありません。

注意: MPI/OpenMP ハイブリッド コードを実行しています。

短いコード例:

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

#ifdef _OPENMP
    #include <omp.h>
#else
    #define omp_get_num_threads() 0
    #define omp_get_thread_num() 0
#endif

int main(int argc, char **argv)
{
  int nthreads, thread_id;
  int rank, size, provided;

  MPI_Init_thread(&argc, &argv, MPI_THREAD_FUNNELED, &provided); /* starts MPI */

  MPI_Comm_rank (MPI_COMM_WORLD, &rank); /* get current process id */
  MPI_Comm_size (MPI_COMM_WORLD, &size); /* get number of processes */

  #pragma omp parallel private(nthreads, thread_id)
  {
    nthreads = omp_get_num_threads();
    thread_id = omp_get_thread_num();

    if (thread_id == 0)
      printf("This is rank %d with %d threads.\n", rank,nthreads);
  }

  MPI_Finalize();
  return 0;
}

mpicc -o example -fopenmp example.cが出力ショーでそれをコンパイルした場合:

$ mpirun -np 2 ./example
This is rank 1 with 6 threads.
This is rank 0 with 6 threads.

予想通り。

フラグを使用する場合-Dparallel(行全体: mpicc -Dparallel -o example_parallel -fopenmp example.c)

出力には次のように表示されます。

$ mpirun -np 2 ./example_parallel 
This is rank 0 with 1 threads.
This is rank 1 with 1 threads.

-Dparallelが OpenMP Threadfs を 1 に制限するのはなぜですか? これに関するドキュメントはどこにありますか?

完全を期すために:

  • mpirun (オープン MPI) 1.4.1
  • gcc (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3

編集(おそらく解決策):私はそれをコンパイルするためにテストするだけです:

mpicc -Dparallel=parallel -o example_parallel -fopenmp example.c

期待どおりに動作します。だから、 -Dparallel は#pragma omp parallel. 私は正しいですか?

4

1 に答える 1

3

ほとんどの C コンパイラで-Dは、プリプロセッサ マクロ シンボルの値を定義するためのオプションです。と-Dparallel呼ばれるプリプロセッサシンボルを定義しますparallelが、値は空です。コードがコンパイラによってさらに解析される前に常に前処理が行われるため、コードparallel内の のすべての出現は空の文字列に置き換えられ、 に#pragma omp parallel private(...)なり#pragma omp private(...)ます。コンパイラは、結果の無効なプラグマを無視する可能性があります。

-Dparallelコマンドラインからドロップします。コードのさまざまな部分を条件付きでコンパイルできるようにする必要がある場合は、別のプリプロセッサ シンボルを使用しますBUILD_PARALLEL

#if defined(BUILD_PARALLEL)
 ... parallel code ...
#else
 ... serial code ...
#endif

言語キーワードに一致する名前を持つプリプロセッサ シンボルを使用しないでください。Using-Dparallel=parallelは、プリプロセッサ シンボルを定義し、元の意味を保持するためのひどいハックです。parallel

于 2013-03-28T17:04:02.740 に答える