MPI_Gatherv()いくつかのint/stringペアが必要です。各ペアが次のようになっているとしましょう。
struct Pair {
int x;
unsigned s_len;
char s[1]; // variable-length string of s_len chars
};
ペアに適切なMPIデータ型を定義するにはどうすればよいですか?
つまり、可変サイズのメッセージを1つ送信して、それを完全なサイズのバッファに受信することは理論的に不可能です。各文字列のサイズを含む最初のメッセージを送信してから、文字列自体を含む2番目のメッセージを送信するか、そのメタ情報をペイロードにエンコードして静的受信バッファーを使用する必要があります。
メッセージを1つだけ送信する必要がある場合は、Pairのデータ型を定義するのをやめます。代わりに、ペイロード全体のデータ型を作成し、すべてのデータを1つの連続した型なしパッケージにダンプします。次に、受信側でそれを繰り返し処理し、各文字列に必要な正確な量のスペースを割り当てて、それを埋めることができます。説明のためにASCII図を作成します。これはあなたのペイロードになります:
| ..x1 .. | ..s_len1 .. | .... string1 .... | ..x2 .. | ..s_len2 ..|.string2。|..x3.. | ..s_len3 .. | ....... string3 .......|..。
すべてを1つのユニット(たとえば、MPI_BYTEの配列)として送信すると、受信者は次のように解凍します。
while (buffer is not empty)
{
read x;
read s_len;
allocate s_len characters;
move s_len characters from buffer to allocated space;
}
ただし、このソリューションは、整数と文字のデータ表現が送信システムと受信システムで同じである場合にのみ機能することに注意してください。
MPIでやりたいことができるとは思いません。私はFortranプログラマーなので、Cの理解が少し不安定な場合は、我慢してください。1つのintと1つの文字列(文字列の最初の文字の位置を渡すことで渡す)で構成されるデータ構造を1つのプロセスから別のプロセスに渡したいようです。私はあなたがしなければならないことは固定長の文字列を渡すことだと思います-したがって、あなたが本当に渡したい文字列のいずれかと同じ長さでなければなりません。これらの弦を集めるためのレセプションエリアは、すべての弦とその長さを一緒に受け取るのに十分な大きさである必要があります。
構造体の新しいMPIデータ型を宣言することをお勧めします。次に、これらを収集できます。収集されたデータには文字列の長さが含まれるため、受信者で文字列の有用な部分を復元できます。
これについてはよくわかりませんが、使用したいと思われるメッセージの長さが本当に変化することは一度もありません。MPIのように感じられません。しかし、それは私が偶然見つけたことがない最新バージョンのMPIに実装されたものかもしれませんが、オンラインでドキュメントを見るとそうではないようです。
MPI実装は、メッセージの実際の内容を検査または解釈しません。データ構造のサイズがわかっている場合は、そのサイズをいくつかのcharまたはintで表すことができます。MPI実装は、データの実際の内部詳細を認識または認識しません。
いくつかの注意点があります...送信者と受信者の両方がメッセージの内容の解釈に同意する必要があり、送信側と受信側で提供するバッファは、定義可能な数のcharまたはintに適合する必要があります。