2011-02-26 4 views
1

세 번의 반복에서 논리 원을 작성한 다음 간단한 결과를 인쇄하는 간단한 응용 프로그램을 작성합니다. 우선, 프로세스 0에서 Send Send와 Recv를 사용하고 있습니다. Send와 Recv를 사용하고 있습니다. 마지막 n-1 프로세스는 프로세스 0으로 전송됩니다. 프로세스 0에서 나는이 코드를 메인에 가지고 있습니다 :MPI - 프로세스의 논리 순환

int i; 
    MPI_Status status; 
    MPI_Init(&argc, &argv); 
    MPI_Comm_size(MPI_COMM_WORLD,&numtasks); 
    MPI_Comm_rank(MPI_COMM_WORLD;&myrank); 



if(myrank==0){ 


    for(i=0;i<3;i++){ 
     MPI_Send(msg,MPI_CHAR,myrank+1,99,MPI_COMM_WORLD); 
     MPI_Recv(msg,100,MPI_CHAR, numtasks-1,99,MPI_COMM_WORLD,&status); 
     printf("hello"); 
    } 
    } 
    else if(myrank==(numtasks-1)){ 
    MPI_Recv(msg,100,MPI_CHAR,numtasks-2,99,MPI_COMM_WORLD,&status); 
    MPI_Send(msg,100,MPI_CHAR,0,99,MPI_COMM_WORLD); 

    } 
    else{ 
    MPI_Recv(msg,100,MPI_CHAR,myrank-1,99,MPI_COMM_WORLD,&status); 
    MPI_Send(msg,100,MPI_CHAR,myrank+1,99,MPI_COMM_WORLD); 
    } 

지금 나는 3 가지 결과를 얻으려고하고 있습니다. 하지만 여전히 나는 하나만 얻고 있습니다. 나머지 코드는 간단합니다. 0 이외의 프로세스는 myrank-1 (myrank는 실제 프로세스 번호)에서 수신하여 rank + 1로 전송합니다. 여전히 이해가 안됩니다. 아이디어를 제공해 주셔서 감사합니다.

답변

3

MPI_Send은 수신 측이 MPI_Recv으로 전화하기를 기다릴 수도 있습니다. 따라서 모든 프로세스가 MPI_Send으로 호출되면 모든 프로세스가 중단됩니다. 대신 MPI_Isend을 사용하고 각 메시지를 MPI_Waitall과 함께 수신했는지 확인하십시오.

편집 : 어떻게 처음에 루프가 있다는 사실을 간과했는지 모르겠다. if 블록 * 당혹 스럽다. 나는 MPI 부분에 너무 집중했다. 코드 을 실행하여 루프를 (루프 본문은 여전히 ​​있음)으로 실행하십시오. 그것은 예상대로 작동한다 (예를 들어, 함께, N = 3 개 공정)

  1. 0 (1)에 전송하고, 0 내지 2
  2. 1 수신으로부터 수신하도록 대기하고, (2)에 송신하고,
  3. 를 종료 2, 1에서 수신 0으로 전송하고,
  4. 0 (2)로부터 수신 종료 메시지를 출력하고, 지금

종료 다시 루프를 다시 삽입. 프로세스 0이 4 단계 이후에 계속 진행되고을 종료 한 프로세스 1로 전송된다는 점을 제외하고는 똑같은 일이 발생합니다. else ifelse 블록에도 루프를 삽입하거나 if 블록에서 루프를 제거하고 루프 전체에 if/else if/else을 래핑하십시오.

+1

+1 나를 이길. (차단하는 방법에 대한 귀하의 답변이 수정되었습니다.) – chrisaycock

+0

@chrisaycock : Ah; 'MPI_Waitall'은 친숙한 것 같습니다. :-) +1. –

+0

첫 번째 프로세스는 MPI_Send로 시작하고 다른 프로세스는 MPI_Recv로 시작한 다음 MPI_Send로 계속 진행합니다. 그리고 그 이상한 내게, 그것은 단지 한 번하고 아무 것도하지 않을 것입니다. 심지어 3 번 가버 리더라도 ... – Waypoint