web-dev-qa-db-ja.com

gccでMPIをコンパイルするには?

gccでMPI?をコンパイルできるかどうかは誰にもわかりますか?。gccを使用する必要がありますが、mpiccは使用しません。

22
user1260391

mpiccは、特定のコンパイラセットの単なるラッパーです。ほとんどの実装には、mpiccラッパーが、ラッパーが渡すオプションの完全なリストを提供する-showme(Open MPI)または-show(Open MPI、MPICHおよび派生物)などの特別なオプションを理解します。バックエンドコンパイラに進みます。

たとえば、Open MPIでは、ラッパーはプレーンテキストの構成ファイルを読み取り、さらにコンパイラーに渡されるコマンドラインオプションを作成するC++プログラムです。 mpicc -showmeは、そのようなオプションの完全なリストを示します。

$ mpicc -showme
icc
-I/opt/MPI/openmpi-1.5.3/linux/intel/include
-I/opt/MPI/openmpi-1.5.3/linux/intel/include/openmpi
-fexceptions
-pthread
-I/opt/MPI/openmpi-1.5.3/linux/intel/lib
-Wl,-rpath,/opt/MPI/openmpi-1.5.3/linux/intel/lib
-I/opt/MPI/openmpi-1.5.3/linux/intel/lib
-L/opt/MPI/openmpi-1.5.3/linux/intel/lib
-lmpi
-ldl
-Wl,--export-dynamic
-lnsl
-lutil

(実際に読みやすくするためにここで分割したのは1行です)

特定のケースのインテルCコンパイラーiccがバックエンドコンパイラーとして使用されますが、GCCを使用するバリアントもあります。 mpicc -showme:compileを使用して、完了フェーズ(通常はCFLAGSとして知られる)に必要なオプションのリストを取得することもできます。

$ mpicc -showme:compile
-I/opt/MPI/openmpi-1.5.3/linux/intel/include
-I/opt/MPI/openmpi-1.5.3/linux/intel/include/openmpi
-fexceptions
-pthread
-I/opt/MPI/openmpi-1.5.3/linux/intel/lib

mpicc -showme:linkでリンカに渡す必要があるオプションのリスト(LDFLAGSとして知られています):

$ mpicc -showme:link
-fexceptions
-pthread
-I/opt/MPI/openmpi-1.5.3/linux/intel/lib
-Wl,-rpath,/opt/MPI/openmpi-1.5.3/linux/intel/lib
-I/opt/MPI/openmpi-1.5.3/linux/intel/lib
-L/opt/MPI/openmpi-1.5.3/linux/intel/lib
-lmpi
-ldl
-Wl,--export-dynamic
-lnsl
-lutil

これらを使用できます。次のようなMakefileで:

...
CFLAGS += $(Shell mpicc -showme:compile)
LDFLAGS += $(Shell mpicc -showme:link)
...

私が知る限り、-showme:compile-showme:linkはOpen MPIに固有であり、他の実装は-showで呼び出されたときにオプションの完全なリストのみを提供します。

私はまだmpiccを直接使用する方が良いと思います。なぜなら、MPIセットアップの何かが変更された場合、変更する必要がある間、すぐにラッパーに反映されるからです。ビルドスクリプト/ Makefileを手動で(-showme:compileおよび-showme:linkを使用してオプションを自動的に取得しない限り)。

26
Hristo Iliev

mpicc -compile_info MPICHの場合。

4
Kadir

はい、gccを実際に使用できます。しかし、私の場合(Ubuntuの場合)、mpiccはgccの単なるラッパーです。コマンドmpicc -showme

gcc -I/usr/lib/openmpi/include/openmpi/opal/mca/event/libevent2021/libevent -I/usr/lib/openmpi/include/openmpi/opal/mca/event/libevent2021/libevent/include -I/usr/lib/openmpi/include -I/usr/lib/openmpi/include/openmpi -pthread -Wl,-rpath -Wl,/usr/lib/openmpi/lib -Wl,--enable-new-dtags -L/usr/lib/openmpi/lib -lmpi

Open MPI docs

Open MPIチームは、Open MPIの「ラッパー」コンパイラを使用してMPIアプリケーションをコンパイルすることを強くお勧めします。つまり、(たとえば) gccを使用してプログラムをコンパイルするには、mpiccを使用します。

上記のステートメントを繰り返します。OpenMPIチームは、ラッパーコンパイラを使用して、MPIアプリケーションをコンパイルおよびリンクすることを強くお勧めします。しかし、私はラッパーコンパイラを使用したくありません!」、ユーモアをかけて試してみてください。それらがあなたのために機能するかどうかを確認してください。それらがあなたのために機能しない場合は必ずお知らせください。 「1990年代半ばの実装が不十分なラッパーコンパイラの悪い動作に対する考え方。最近では状況が改善されています。ラッパーコンパイラはほとんどすべての状況を処理でき、Open MPI固有のコンパイラをハードコーディングするよりもはるかに信頼性が高くなりますただし、複数のプロジェクトの複数のラッパーコンパイラを入れ子にするなど、ラッパーコンパイラの使用が問題になる可能性のある状況がいくつかあります。非常にわずかです。したがって、Open MPIは、コンパイルに必要なコマンドラインフラグを見つけるための回避策を提供しますMPIアプリケーション。

ここでは、この回答が役立ちます。

3
Kehe CAI

MPICHの場合、mpiccのマニュアルページによると、mpicc -compile_infoはプログラムをコンパイルするためのフラグを示し、mpicc -link_infoは、プログラムをリンクするためのフラグを示します。

0
Wey Dong

mpiccはすでにgccをバックエンドとして使用しています

0
none

はい、あなたは確かにMPIプログラムをmpiccラッパーの便利なしにコンパイルできます。ほとんどの実装ではmpiccは環境変数、さまざまなライブラリの検索とリンク、Makefileに入れない限りのあらゆる種類のライブラリ。

mpiccスクリプトのインスタンスを見つけて、それを分解することをお勧めします。