std::vector<MyClass>
をMPI経由でさまざまなサイズで通信しようとしています。 MyClass
には、初期化されていないか、またはサイズが異なる可能性のあるベクトルであるメンバーが含まれています。そのために、私はserialize()
とdeserialize()
のようなものを書いて、そのようなstd::vector<MyClass>
をstd::string
に読み書きし、それをMPI経由で通信しています。オブジェクトのベクトルをstd :: stringにシリアル化してMPIで使用する
私の実装は原則として動作しますが、(必ずしもそうではありません)MPIプロセスがシリアル化に関連すると思われる位置でクラッシュすることがあります。送信されるペイロードは、MBのhundretsと同じくらい大きくなる可能性があります。私は容器としてstd::string
を使用することは良い選択ではないと思う。私はここに実行されているかもしれない巨大なバイナリデータを持つchar[]
のコンテナとしてstd::string
を使用するいくつかの制限がありますか?バイナリデータのためstd::string
を使用して、
(私はその直列化ルーチンと一緒にboost::mpi
を使用しないことに、注意していない、どちらも私は私のプロジェクトに、このようなcereal
として巨大なライブラリにプルしたいです)
私はあなたが答えから欲しいものは本当にわかりません。これはクラッシュについてですか?次に、現在のデバッグ作業の[mcve]と説明が必要です。または、これは正しくシリアル化を行う方法ですか?または、MPIで複合C++オブジェクトを送信する方法です(シリアル化はその1つの答えです)。これが本当に "* MPIを介してシリアル化されたデータの送信を実装する"のであれば、少なくともあなたのMPIコードを見る必要があります。これらの質問の多くは、意見が重い(「*良い方法*」)特定の目標や基準に焦点を当ててください。 – Zulan
こんにちはズーラン、申し訳ありませんが、質問はあまり正確ではありません。私はそれを言い換えようとします。私は多くのMPI要求に問題がなくても_sometimes_クラッシュする大きな数値シミュレーションで上記のルーチンを使用しています。スタックトレースはそれほど役に立ちません( 'bad_alloc'を含んでいますので、メモリのことを推測します)、私は簡単な例を簡単に作成できません。私は問題のために 'std :: string'のいくつかの制限を疑ったので、私の質問です。 – janoliver
serializeメソッドを 'try {...} catch(std :: bad_alloc&){...}'ブロックにカプセル化しようとすることができます。さらに、メモリプロファイラを使用してメモリリークを分析することもできます。 –