1

MPI を使用して C でプログラムをコーディングしました。このプログラムでは、struct 変数がリング形式でプロセスに送信され、その変数から受け取った値に基づいて、その特定のプロセスの作業が割り当てられます。

MPI_Send()問題は、実行時に INVALID DATATYPE を与えているため、関数で構造体変数を送信する方法を知る必要があることです。次の例を検討してください。

struct info{
  int ne, n, u, v, process, min, strip, mincost, b;
} stat;

MPI_Send(&stat,sizeof(stat),sizeof(struct info),1,2,MPI_COMM_WORLD);
4

2 に答える 2

5

構造体を送信する前に、いくつかの操作を行う必要があります。あなたの例のコードを書きましたが、よりよく理解するには、いくつかのドキュメントを読む必要があります。とにかく、ここにいくつかのヒントがあります:

  • すべての変数が int である例のように、1 種類の要素だけで構成された構造体がある場合は、各変数の位置に注意してベクトルを送信することをお勧めします。
  • 他の種類がある場合は、countを 2 以上に設定し、他のすべての配列を変更する必要があります (例: array_of_types、array_of_blocklengths など)。
  • その場合、データ構造の配置に注意して、 array_of_displaysmentsの値を自分で計算できます。たとえば、次の構造体がある場合、要素を整列させるために 4 バイトのパディングが追加されるため、x は 0 から始まりますが、y は 8 から始まります。struct point{ int x; double y; };
  • array_of_displaysments を計算したくない場合は、常に MPI_Get_Address を使用し、&演算子に依存しないでください。

ここにコード:

struct info{
    int ne, n, u, v, process,min,strip,mincost,b;
}stat;


int main(...){

/*MPI INIT*/

struct info _info,  

int count; //Says how many kinds of data your structure has
count = 1; //1, 'cause you just have int

// Says the type of every block
MPI_Datatype array_of_types[count];
// You just have int
array_of_types[0] = MPI_INT;

// Says how many elements for block
int array_of_blocklengths[count];
// You have 8 int
array_of_blocklengths[0] = {8};

/* Says where every block starts in memory, counting from the beginning of the struct. */
MPI_Aint array_of_displaysments[coun];
MPI_Aint address1, address2;
MPI_Get_address(&_info,&address1);
MPI_Get_address(&_info.ne,&address2);
array_of_displaysments[0] = address2 - address1;

/*Create MPI Datatype and commit*/
MPI_Datatype stat_type;
MPI_Type_create_struct(count, array_of_blocklengths, array_of_displaysments, array_of_types, &stat_type);
MPI_Type_commit(&stat_type);

// Now we are ready to send
MPI_Send(&_info, 1, stat_type, dest, tag, comm),

/* . . . */


// Free datatype
MPI_Type_free(&stat_type);

// MPI finalization
MPI_Finalize();
}
于 2013-08-10T20:35:11.637 に答える
-1

これを試して

MPI_Send(&stat,sizeof(struct info),MPI_CHAR,1,2,MPI_COMM_WORLD);
MPI_Recv(&data,sizeof(struct info), MPI_CHAR, 0, DEFAULT_TAG, MPI_COMM_WORLD, &status);
stat = (struct info *) data;
于 2014-12-09T06:49:28.400 に答える