1

私はこのようにやっています.一時的なバイト数をルートプロセスに送信する必要があるとします:

var char*;
var=new char[temp];
MPI_Isend(&temp,1,MPI_INT,0,tag,MPI_COMM_WORLD,&request[0]);
MPI_Isend(var,temp,MPI_BYTE,0,tag,MPI_COMM_WORLD,&request[1]);

そしてルートプロセスで、私はこのコードを書いています、

MPI_Recv(&temp,1,MPI_INT,i,tag,MPI_COMM_WORLD,&status[0]);
var=new char[temp];
MPI_Recv(var,temp,MPI_BYTE,0,tag,MPI_COMM_WORLD,&status[1]);

ルート プロセスで一時 (転送されるデータ バイトの量) を受信できますが、次の部分の切り捨てられたメッセージのエラーが表示されますか?

4

2 に答える 2

3

要素の数を別のメッセージとして送信する必要はありません。MPI は、プログラムがメッセージ キューを覗いて、受信する前にメッセージ サイズを取得できるメカニズムを提供します。

送信者:

char *var = new char[temp];
MPI_Send(var, temp, MPI_BYTE, 0, tag, MPI_COMM_WORLD);

レシーバー:

MPI_Status status;
int temp;
// Probe for matching message without receiving it
MPI_Probe(i, tag, MPI_COMM_WORLD, &status);
// Get the number of data elements in the message
MPI_Get_count(&status, MPI_BYTE, &temp);
char *var = new char[temp];
MPI_Recv(var, temp, MPI_BYTE, i, tag, MPI_COMM_WORLD, &status);

これは、さまざまなサイズの配列を通信するためのはるかに最適な方法です。

于 2013-06-29T09:56:52.547 に答える