2017-12-13 6 views
0

派生データ型を作成したい。私の問題は、それがsize_of()機能と同様であることをMPI_Type_extentの使用は異なるマシン上のC++ mpi派生データ型

int blocks[3] = {1,1,1}; 
    MPI_Datatype types[3] ={MPI_INT,MPI_DOUBLE,MPI_DOUBLE};  
    MPI_Aint displacements[3]; 

    MPI_Datatype MPI_Struct; 
    MPI_Aint doublex; 

    MPI_Type_extent(MPI_DOUBLE,&doublex); 

    displacements[0]=static_cast<MPI_Aint>(0); 
    displacements[1]=doublex; 
    displacements[2]=doublex+doublex; 

    MPI_Type_struct(3,blocks,displacements,types,&MPI_Struct) 

です:

struct { 
    int provider; 
    double service; 
    double cost; 
} MPI_Struct; 

ウェブマニュアルに続いて、私はそのような何かを書く必要があります。特に、私はこのような構造体が欲しいです。私のプログラムはMPI_Datatype_exentという異なるマシンのクラスタ上で動作するので、別のマシンのあるプロセスから別のプロセスにMy_Structを渡す際に問題がないことを確かめることはできますか?ここで

私は間違っていないよ場合は、型はビット長で、標準ではありません。..

+0

あなたのマシンはどのように拡張されていますか? – Zulan

+0

この瞬間、正確な違いはわかりません。彼らは大学のコンピュータであり、まだ使用していませんでした。 – dang92

+0

すべてが完全に均質でなければなりません。異なるOS /インストール/バージョン/ MPI実装/コンパイラオプション/バイナリ/ CPUの組み合わせでMPIを実行しないでください。 – Zulan

答えて

0

私はこの

typedef struct { 
    int provider; 
    double service; 
    double cost; 
} mystruct; 

displacements[0]=static_cast<MPI_Aint>(offsetof(mystruct, provider)); 
displacements[1]=static_cast<MPI_Aint>(offsetof(mystruct, service)); 
displacements[2]=static_cast<MPI_Aint>(offsetof(mystruct, cost)); 
MPI_Type_struct(3,blocks,displacements,types,&tmp_ddt); 
MPI_Type_create_resized(tmp_ddt, static_cast<MPI_Aint>(0), static_cast<MPI_Aint>(sizeof(mystruct)), &MPI_Struct); 
MPI_Type_free(&tmp_ddt); 

を記述します方法です私はMPI_INTMPI_DOUBLEはビットに標準装備されていますかなり確信しています長さ(fwiw、Fortran MPI_INTEGERデータ型はありません)、コンパイラが使用する(またはしない)パディングはありません。私はむしろoffsetof()マクロを使用してdisplacements配列にデータを入力し、データ型のサイズを変更するのはなぜでしょうか。

+0

ありがとう! MPI_create_resizedは正確に何をしますか?私はmpiで新しく、特に派生型である。 – dang92

+0

'MPI_Type_create_resized()'は基本的にエクステントを設定します。 'MPI_Send()'要素が2つの要素の場合、最初の要素はオフセット '0'から始まり、2つ目の要素はオフセット 'extent'から始まります。 MPIは保証されておらず、コンパイラは構造体の最後にパディングを処理するので、コンパイラが選択したことを明示的にMPIに伝える方が安全です。 –

関連する問題