2012-10-16 2 views
0

두 개의 프로세서에서 실행되는 간단한 MPI 프로그램입니다. 나의 예 (또는 내 컴퓨터에있을 수도 있음)에서 내 콘솔은 메시지를 보내기 전에 수신 메시지를 출력합니다.MPI를 사용한 간단한 메시지 교환

MPI를 사용하여 리셉션을 주문하는 방법이 있다는 것을 알고 있지만, 필자의 예는 프로세서 0이 데이터를 보내길 기다려야하므로 수신 출력이 반드시 2 등분이 될 것입니다.

어떻게 메시지를 보낸 후에 수신 메시지를 인쇄 할 수 있습니까?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <mpi.h> 

int main(int argc, char *argv[]){ 
     int np, myId; 
     char send[100], recv[100]; 

     MPI_Init(&argc, &argv); 

     MPI_Comm_size(MPI_COMM_WORLD, &np); 
     MPI_Comm_rank(MPI_COMM_WORLD, &myId); 

     MPI_Status stat; 
     if(myId == 0){ 
       int length = sprintf(send, "hey!"); 

       for(int i = 1; i < np; i++){ 
         printf("send %d => %d (%d)", myId, i, length); 
         MPI_Send(send, length, MPI_CHAR, i, 0, MPI_COMM_WORLD); 
       } 

     }else if (myId == 1){ 
       MPI_Recv(send, 41, MPI_CHAR, 0, 0, MPI_COMM_WORLD, &stat); 
       printf("receive %d <= %d\n", myId, 0); 
     } 

     MPI_Finalize(); 
     return 0; 
} 
+1

메시지 또는 fflush (stdout)을 수신하는 프로세스를 종료하려고 했습니까? –

+0

MPI_Recv 전에 fflush (send)를 두는 것과 마찬가지? –

+0

'fflush (send)'는 의미가 없습니다 ...'send'는 출력 버퍼가 아닙니다. – Mosby

답변

1

병렬로 공유 버퍼에 쓰기, 병렬 I/O 라이브러리를 사용하지 않고 버퍼가 먼저 삭제됩니다 보장은 없습니다 :

이 내 코드입니다. 명령을 순서대로 수행하려면 인쇄 명령 (예 : fflush(stdout);) 후 출력 버퍼를 플러시하거나 매번 자동으로 플러시되는 버퍼 (예 : fprintf(stderr,...);)로 인쇄하거나 MPI_Barrier을 사용하여 인쇄 명령을 분리해야합니다. 마지막 성능은 성능 저하로 이어질 수 있으므로 권장하지 않습니다.

관련 문제