Linux に gcc と mpich ライブラリをインストールした後、mpicxx
コンパイラでコードをコンパイルできます。gccコンパイラをアップグレードするだけでmpiライブラリでc++ 11を使用することは可能ですか?
3 に答える
新しいバージョンでコンパイラを変更することは、いくつかの強力なコード生成の変更が観察されない限り、一般的に機能するはずです(たとえば、異なるデータアライメントまたは異なるABI)。MPIはライブラリであるため、使用している言語構成がその内部を混乱させない限り、それらの構成は関係ありません。提供されるスレッド化にはC++11を使用するため、注意すべき点がいくつかあります。
まず、マルチスレッドはMPIで常にうまく機能するとは限りません。ほとんどのMPI実装は内部でスレッド化されていますが、デフォルトではスレッドセーフではありません。
次に、MPIは4つのレベルのスレッドサポートを定義します。
MPI_THREAD_SINGLE
:スレッドサポートなし-MPIは、シングルスレッドアプリケーションで使用された場合にのみ安全に機能します。MPI_THREAD_FUNNELED
:部分的なスレッドのサポート-MPIはマルチスレッドアプリケーションで使用できますが、MPIを呼び出すことができるのはメインスレッドのみです。MPI_THREAD_SERIALIZED
:部分的なスレッドのサポート-MPIはマルチスレッドアプリケーションで使用できますが、異なるスレッドでの同時呼び出しは許可されません。つまり、各スレッドはMPIを呼び出すことができますが、シリアル化メカニズムを導入する必要があります。MPI_THREAD_MULTIPLE
:完全なスレッドサポート-MPIは多くのスレッドから自由に呼び出すことができます。
真実は、ほとんどのMPI実装がMPI_THREAD_FUNNELED
最大で箱から出してサポートし、それらのほとんどがのみをサポートしていることMPI_THERAD_SINGLE
です。たとえば、Open MPIは、完全なスレッドサポートを取得するために、デフォルト以外のオプションを使用してコンパイルする必要があります。
MPI_Init_thread()
マルチスレッドアプリケーションは、の代わりにを使用してMPIライブラリを初期化する必要MPI_Init()
があり、初期化呼び出しを行うスレッドがメインスレッドになります。これは、サポートされているレベルがである場合にのみMPIへの呼び出しが許可されるのとまったく同じメインスレッドMPI_THREAD_FUNNELED
です。1つはMPI_Thread_init()
、必要なレベルのスレッドサポートを提供し、関数は、サポートされているレベルを返します。これは、必要なレベルよりも低い可能性があります。後者の場合、正しくてポータブルなプログラムはそれに応じて動作し、スレッド化されていない操作に切り替えるか、ユーザーへのそれぞれのエラーメッセージで中止することになっています。
MPIがスレッドとどのように連携するかについての詳細は、MPIStandardv2.2を参照してください。
MPI ディレクティブを改ざんすることはできないはずなので、私が考える限り問題はありません。それ以外は、MPI と C++11 の問題は直交しています。
ちなみに、私のマシン (gcc 4.6.3、MPICH2 1.4.1) でmpic++
ormpicxx
を発行すると、単純に次のように変換されます。
c++ -Wl,-Bsymbolic-functions -Wl,-z,relro -I/usr/include/mpich2 -L/usr/lib -lmpichcxx -lmpich -lopa -lmpl -lrt -lcr -lpthread
を使用して、自分のマシンで確認できますmpic++ -show
。
C++11 と MPI を組み合わせても問題ありません。
mpic++ と mpicxx は単なるラッパーであり、標準コンパイラまたはユーザー指定のコンパイラのいずれかを使用します。したがって、mpic++ と mpicxx が C++11 と互換性のあるコンパイラを使用することを定義できます。
mpich の正確なコマンドがわかりません。opemmpi の場合、次の環境フラグを設定する必要があります。
export OMPI_CC='gcc-mp-4.7'
export OMPI_CXX='g++-mp-4.7'
私の場合、macports の gcc 4.7 コンパイラで openmpi 1.5.5 を使用しています。