2011-10-18 4 views
1

私はMPIアプリケーションを構築しています。転送されるメッセージのサイズを小さくするために、boolテーブルを表す "ビット"のテーブルを持つことを考えています(boolの値はtrueまたはfalseの2つの値のいずれか1つしか取ることができないため)。コミュニケーションは私のアプリケーションの主要なパフォーマンスボトルネックなので、私の場合は重要です。ビットの表を宣言できますか?

この種類のテーブルを作成することはできますか?このデータ型はMPI APIに存在しますか?

+1

私は本当に要件を理解していません。 –

+0

私はMPIがこれを意味すると推測しています:http://en.wikipedia.org/wiki/Message_Passing_Interface –

+2

あなたのビットをエンコードするintを送信しないのはなぜですか? – PlasmaHH

答えて

4

C++ std::bitsetまたはboost::dynamic_bitsetでは、多くのビットを管理するのに役立ちます。ビットセットのサイズが固定されていない場合は、後で選択します。 AFAIK MPIは、プロセス間通信にMPI_SendMPI_Recを使用します。どのようにあなたの出力をシリアル化し、それらのインターフェイスを介して送信するかは、Boost.Serializationによって2つのタイプのどちらもサポートされていないため、別の問題です。

+0

良い一般的な答えですが、私は質問者がMPIインターフェイスにもっと興味を持っていると賭けています。 –

+0

@ MarkRansom OPがMPIでユーザー定義型を使用する方法を知っていることを願っています。さもなければ全体の問題は無意味に見えます。 – pmr

1

元の質問のタグに基づいて、あなたはFortranとC++の組み合わせを使用していると仮定します。 FortranのMPIバインディングにはMPI_LOGICALというデータ型があります。これは、メッセージ渡し呼び出しで簡単に使用できます。私はMPI Cバインディングのためのそのようなタイプを知らない。 PlasmaHHで示唆されているように、この場合、整数を送ることが効果的かもしれません。

https://computing.llnl.gov/tutorials/mpi/#Derived_Data_Types

1

短い答えは - いいえ、最短MPIデータ型は、あなたが少しだけの型を作成することはできませんMPI_BYTEです。 (Fortranバインディングにはローカル論理型に対応するMPI_LOGICALがありますが、ほとんどの場合はintに対応しているか、またはビットではなく1バイトに対応しています)。

これは必ずしも問題ではありません。ビット配列を持っていれば、次の整数のバイトまで切り上げて送ることができ、最後の数ビットを無視するだけです。 (とにかくあなたのテーブルの作成でやらなければならないことはほとんどありません)。しかし、いくつか質問があります。

メッセージの量はどれくらいですか?あなたのネットワーキングは何ですか? 待ち時間が限られているのではなく、帯域幅が制限されていますか?

あなたのメッセージは、(MBの下で言う)小さめである場合、あなたはおそらく、メッセージの遅延、帯域幅ではないが支配している、とのメッセージのサイズを小さくすることは助けにはなりません。 (実際の帯域幅がどの程度の大きさになっているかは、ピンポンテスト(Intel MPI benchmarksなど)で見積もることができます。それがあなたが入っている体制であれば、通信がスピードアップすることはありませんが、ビット配列への索引付けの追加コストは物事を遅らせる可能性があるため、状況を悪化させる可能性があります。一方

あなたが大きなメッセージを送信している場合、これは良いことかもしれない、(MBは、サイズの言う)および/またはあなたは、メモリ制限されています。

0

あなたのビットを整数の配列に変換します。

FORTRAN言語に関してお答えします。 intrinsicビット操作を使用して、ビットを前後に移動できます。

また、FORTRANタイプLOGICALは、通常の整数と同様に4バイトの変数であるため、クリアするには使用しないでください。 は、これらの機能を使用します。次に

BIT_SIZE(I) 
IBCLR(I, POS) ! Set to 0 in variable I at position POS 
IBSET(I, POS) ! Set to 1 in variable I at position POS 
BTEST(I, POS) ! To test if bit at POS is 1 

あなたが扱っているものは何でもタイプで通常の転送を行います。MPI通信でタグを追加して、ビット単位で処理する必要のある変数であることを受信者に知らせることができます。 これはあなたのコミュニケーションを制限するはずですが、データのパッキングとアウトパッケージも必要です。いずれの場合でも、すべてのBOOLテーブルをこのスキームに転送することもできます。

しかし、あなたのBOOLテーブルは、どのような効果を見るためには非常に大きくなければならないことに注意してください。

関連する問題