gcc
でMPI?をコンパイルできるかどうかは誰にもわかりますか?。gcc
を使用する必要がありますが、mpicc
は使用しません。
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
を使用してオプションを自動的に取得しない限り)。
mpicc -compile_info
MPICHの場合。
はい、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チームは、Open MPIの「ラッパー」コンパイラを使用してMPIアプリケーションをコンパイルすることを強くお勧めします。つまり、(たとえば) gccを使用してプログラムをコンパイルするには、mpiccを使用します。
上記のステートメントを繰り返します。OpenMPIチームは、ラッパーコンパイラを使用して、MPIアプリケーションをコンパイルおよびリンクすることを強くお勧めします。しかし、私はラッパーコンパイラを使用したくありません!」、ユーモアをかけて試してみてください。それらがあなたのために機能するかどうかを確認してください。それらがあなたのために機能しない場合は必ずお知らせください。 「1990年代半ばの実装が不十分なラッパーコンパイラの悪い動作に対する考え方。最近では状況が改善されています。ラッパーコンパイラはほとんどすべての状況を処理でき、Open MPI固有のコンパイラをハードコーディングするよりもはるかに信頼性が高くなりますただし、複数のプロジェクトの複数のラッパーコンパイラを入れ子にするなど、ラッパーコンパイラの使用が問題になる可能性のある状況がいくつかあります。非常にわずかです。したがって、Open MPIは、コンパイルに必要なコマンドラインフラグを見つけるための回避策を提供しますMPIアプリケーション。
ここでは、この回答が役立ちます。
MPICHの場合、mpiccのマニュアルページによると、mpicc -compile_info
はプログラムをコンパイルするためのフラグを示し、mpicc -link_info
は、プログラムをリンクするためのフラグを示します。
mpicc
はすでにgcc
をバックエンドとして使用しています
はい、あなたは確かにMPIプログラムをmpicc
ラッパーの便利なしにコンパイルできます。ほとんどの実装ではmpicc
は環境変数、さまざまなライブラリの検索とリンク、Makefileに入れない限りのあらゆる種類のライブラリ。
mpicc
スクリプトのインスタンスを見つけて、それを分解することをお勧めします。