2017-12-16 13 views
0

これについてはサイトhereに質問がありますが、これはcで実装されています。私はそれのC + +バージョンが必要です。C++ MPIフィールドchar [16]と整数を持つ構造体の配列を作成して送信する

問題は次のとおりです。 私はこれらの構造体の配列を送信する必要があり、以下のフォーム

struct word 
{ 
    char value[WORD_MAX_LENGTH]; 
    int freq; 
}; 

を持つ構造体を作成しました。どのようにしてこの構造体をシリアル化し、MPI_Sendを使用してそれらのうちの500個を別のプロセスに送ることができますか?私がこれまでに得たのはここ

は次のとおりです。私はこれを行うと、私はそれを実行しようとすると、

MPI_Datatype word_type, oldtypes[2]; 
    int blockcounts[2]; 
    MPI_Aint offsets[2], extent; 

    //Determine the offset and block length of the first element of the struct which is a char array. 
    offsets[0] = 0; 
    oldtypes[0] = MPI_CHAR; 
    blockcounts[0] = WORD_MAX_LENGTH; 

    //Determine the offset of int ferq of the struct. 
    MPI_Type_extent(MPI_CHAR, &extent); 
    offsets[1] = 16 * extent; 
    blockcounts[1] = 1; 

    // Finally create the type. 
    MPI_Type_create_struct(2, blockcounts, offsets, oldtypes, &word_type); 
    MPI_Type_commit(&word_type); 

が、それはしかし、エラーなしでコンパイルされます。 それは文句を言う

Fatal error in PMPI_Type_create_struct: Invalid datatype, error stack: 

PMPI_Type_create_struct(173): MPI_Type_create_struct(count=2, 
array_of_blocklengths=0x7fffbd059f70, 
array_of_displacements=0x7fffbd059f80, array_of_types=0x7fffbd059f60, 
newtype=0x7fffbd059f14) failed 

PMPI_Type_create_struct(142): Invalid datatype 

助けていただければ幸いです。 注:私は、ブーストライブラリを使用することはできません。

答えて

0

少なくとも二つの問題

  • oldtypes[1]がありますが
  • offsets[1]は奇妙に見える初期化されていない、あなたのコンパイラが追加した場合、あなたが代わりに

をマクロoffsetsof()を使用することができますまた、MPI_Type_create_resized()する必要がある場合がありますwordの最後にいくつかのパディング。

+0

ありがとうございました!私は質問をした後にオフセットを編集するのを忘れてしまった。とにかくヘッドアップのおかげで、私はすでにそれを変更しました。彼らはこのオフセット[1] =(size_t)&(word.freq) - (size_t)&word;のようになりました。また、私はoldtypesにMPI_INTを追加しました。それは今働いているようです:D –

+0

これは動作しています。どのようにしてこれらの構造体の複数をスレーブに送ることができますか? –

+0

'MPI_Send(words、n、word_type、...)' –

関連する問題