2017-05-03 7 views
0

MPI_IRecv/MPI_ISendのペアは同じになる必要がありますcountMPI_IRecv/MPI_ISendが同じ `count`を持つべきですか?

int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int source, 
      int tag, MPI_Comm comm, MPI_Request *request) 
... 
    count 
    number of elements in receive buffer (integer) 

documentationは、それがいけない示唆しているようだが、私は言葉遣いで混乱していますし、それは少し異なるMPI_Recvから処方されます。私は別のものを渡すと私が期待しているように動作する例を添付していますcount

のMakefile

cc=mpicc 

isend : isend.c; $(cc) $< -o [email protected] 
run: isend 
run:; mpiexec -np 2 ./isend 

clean:; rm -f isend 
.PHONY: clean run 

/* Usage: make run */ 
#include <stdio.h> 
#include <mpi.h> 
#define send_cnt 1 
#define recv_cnt 10  
#define SEND 0 /* who sends and who receives? */ 
#define RECV 1  
#define TAG 0 
#define COMM MPI_COMM_WORLD 

MPI_Status status; 
MPI_Request request; 

void send() { 
    int dest = RECV; 
    int buf[] = {42}; 
    MPI_Isend(buf, send_cnt, MPI_INT, dest, TAG, COMM, &request); 
    MPI_Wait(&request, &status); 
} 

void recv() { 
    int dest = SEND; 
    int buf[123]; 
    MPI_Irecv(buf, recv_cnt, MPI_INT, dest, TAG, COMM, &request); 
    MPI_Wait(&request, &status); 
    printf("recv: %d\n", buf[0]); 
} 

int main(int argc, char *argv[]) { 
    int rank; 
    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(COMM, &rank);  
    if (rank == SEND) send(); 
    else    recv();  
    MPI_Finalize(); 
    return 0; 
} 

答えて

1

MPI_RecvMPI_Irecv両方isend.c引数としてバッファに書き込むことを許可されているデータ要素の最大量を取ります。この数値は、必ずしもMPI_Sendに渡された数と同じである必要はありません。それは大きくても小さくてもかまいません。受信バッファにメッセージを収容するのに十分なスペースがない場合、MPIは切り捨てエラーを通知します。メッセージサイズよりもスペースがある場合、バッファの一部だけが上書きされます。後者の場合、MPI_Recv/MPI_Test*/MPI_Wait*によって返されたMPIステータスオブジェクトを調べるのにMPI_Get_countを使用することができます。

MPI_(I)Recvに渡されたカウントは、異なるデータ型のMPI_Sendに渡されたカウントよりも小さい正当なケースがあります。たとえば、10 MPI_INTを送信し、10 MPI_INTで構成される連続したデータ型の1つの要素を受け取ることができます。あなたのケースでは、sendオペレーションとreceiveオペレーションの両方が同じデータ型を使用するため、受信カウントは少なくとも送信カウントと同じくらい大きくなければなりません。

ところで、あなたのコードは、MPI_Isendによって作成されたリクエストを待機/テストするための呼び出しが欠けていますが、これは誤りです。

+0

ありがとうございました。私はコードを修正した。 – slitvinov

+0

'MPI_Send'を使って' MPI_Irecv'で受信するメッセージを送ることもできます。 –

関連する問題