2012-10-16 3 views
1

OpenMPI를 사용하여 루프에서 벗어나는 방법을 알아 내는데 어려움을 겪고 있습니다.OpenMPI가 루프에서 빠져 나오다

는 여기가 0.00의 차이가있을 때 루프에서 모든 프로세서를 중단 할 필요가 있지만,이 breakNow 변수가 모든 프로세서에 방송되지 않을 것 같아 내 루프

for(i=1; i<=steps;i++) { 

    do_calculation(psi,new_psi,&mydiff,i1,i2,j1,j2); 

    if (breakNow == 1) { 
     break; 
    } 

    diff = find_difference(); 
    if(myid == mpi_master && i % iout == 0){ 
     printf("%8d %15.5f\n",i,diff); 


     if (diff == 0.00) { 
     printf("DONE!"); 

     breakNow = 1; 

     MPI_Bcast(&breakNow, 1, MPI_INT, mpi_master, MPI_COMM_WORLD); 
     }   
    } 
    } 

입니다. 내가 놓친 게 있니?

답변

0

MPI_Bcast은 일괄 작업입니다. 완료하려면 모든 프로세스에서 호출해야합니다. 순위가 mpi_root과 일치하는 프로세스에서 브로드 캐스트는 전송 작업처럼 작동하고 다른 모든 순위에서는 수신 작업으로 작동합니다.

조건부 외부에서 MPI_Bcast으로 전화를 이동하십시오. 올바른 장소는 if (breakNow == 1) break; 직전 일 수 있습니다.

또 다른 제안 : find_difference는 모든 프로세스에서 동일한 값을 반환하는 경우, 당신은 비슷한 작업을 수행 할 수 있습니다

for (i = 1; i <= steps; i++) { 

    do_calculation(psi, new_psi, &mydiff, i1, i2, j1, j2); 

    diff = find_difference(); 
    if (i % iout == 0) { 
     if (myid == mpi_master) { 
      printf("%8d %15.5f\n", i, diff); 
      if (diff == 0.00) 
      printf("DONE!"); 
     } 
     if (diff == 0.00) break; 
    } 
} 

find_difference는 마스터 과정에서 의미있는 결과를 얻을 경우, 다음 다음 수정하면 :

for (i = 1; i <= steps; i++) { 

    do_calculation(psi, new_psi, &mydiff, i1, i2, j1, j2); 

    diff = find_difference(); 
    if (i % iout == 0) { 
     if (myid == mpi_master) { 
      printf("%8d %15.5f\n", i, diff); 
      if (diff == 0.00) 
      printf("DONE!"); 
     } 
     MPI_Bcast(&diff, 1, MPI_DOUBLE, mpi_master, MPI_COMM_WORLD); 
     if (diff == 0.00) break; 
    } 
} 

(I 제로 DIF를 확인하기 위해 코드의 원래 의미를 diff 유형 double의 것으로 가정하고 보존 한 ference 매 1 회마다 iout 걸음)

관련 문제