2011-08-02 3 views
0

저는 MPI를 처음 사용하기 때문에 스노우 레오파드를 실행하는 Mac OS X 노드 클러스터에서 mpirun을 구현하는 데 문제가 있습니다. 내가 겪고있는 문제는 MPI_Barrier()입니다. 아래에 표시된 간단한 함수가 제대로 작동합니다. 그러나 조건부 끝에 MPI_Barrier() 명령을 추가하면 부모 노드가 중지됩니다. 프로세서 중 하나는 장벽 명령을 지나가고 다른 하나는 걸린 상태로 있습니다. 누군가가 나에게 빠른 해결 방법을 줄 수 있거나 내 네트워크 환경이 명령이 제대로 작동하지 못하게하는 몇 가지 방법을 제안 할 수 있기를 바랬습니다.부모 노드가 MPI_Barrier에서 멈춤

int main (int argc, char **argv) 
{ 
    int me, np, q, sendto; 
    double t0, t1; 
    MPI_Status status; 
    MPI_Init(&argc, &argv); 
    t0 = MPI_Wtime(); 
    MPI_Comm_size(MPI_COMM_WORLD,&np); 
    MPI_Commm_rank(MPI_COMM_WORLD,&me); 
    if (np%2 == 1) return 0; 
    if (me%2 == 1) {sendto = me - 1;} 
    else {sendto = me + 1;} 
    if (me%2 == 0) { 
     MPI_Send(&me, 1, MPI_INT, sendto, me, MPI_COMM_WORLD); 
     MPIRecv(&q, 1, MPI_INT, sendto, sendto, MPI_COMM_WORLD, &status); 
    } else { 
     MPI_Recv(&q, 1, MPI_INT, sendto, sendto, MPI_COMM_WORLD,&status); 
     MPI_Send(&me,1,MPI_INT,sendto,me,MPI_COMM_WORLD); 
    } 
    printf("Send %d to proc %d, received %d from proc %d\n",me,sendto,q,sendto); 
    t1 = MPI_Wtime(); 
    printf("Timing is %g",t1-10); 
    MPI_Finalize(); 
    return 0; 
} 

답변

0

몇 가지 오타를 수정하는 것 이외에 문제없이 작동하는 코드가 있습니다. IBM 클러스터에서 openmpi 및 gnu c 컴파일러를 사용하고 있습니다. 장벽을 어디에 둘지 모르겠습니다. 나는 정확하게 추측 했는가?

#include "mpi.h" 
#include "stdio.h" 

int main (int argc, char **argv) 
{ 
int me, np, q, sendto; 
double t0, t1; 
MPI_Status status; 
MPI_Init(&argc, &argv); 
t0 = MPI_Wtime(); 
MPI_Comm_size(MPI_COMM_WORLD,&np); 
MPI_Comm_rank(MPI_COMM_WORLD,&me); 
if (np%2 == 1) { 
    MPI_Finalize(); 
    return 0; 
} 
if (me%2 == 1) {sendto = me - 1;} 
else {sendto = me + 1;} 
if (me%2 == 0) { 
    MPI_Send(&me, 1, MPI_INT, sendto, me, MPI_COMM_WORLD); 
    MPI_Recv(&q, 1, MPI_INT, sendto, sendto, MPI_COMM_WORLD, &status); 
} else { 
    MPI_Recv(&q, 1, MPI_INT, sendto, sendto, MPI_COMM_WORLD,&status); 
    MPI_Send(&me,1,MPI_INT,sendto,me,MPI_COMM_WORLD); 
} 
MPI_Barrier(MPI_COMM_WORLD); 
printf("Send %d to proc %d, received %d from proc %d\n", 
    me,sendto,q,sendto); 
t1 = MPI_Wtime(); 
printf("Timing is %g\n",t1-t0); 
MPI_Finalize(); 
return 0; 
} 
+0

답장을 보내 주셔서 감사합니다. 이것은 정확히 멈춘 프로그램이 어떻게 생겼는지를 보여줍니다 (첫 번째 조건의 Finalize 문 제외). 내 장벽은 코드에 표시된 것과 같은 위치에 있습니다. – JChiTown

+0

나는 또한이 프로그램을 가지고있다. 이 텍스트를 잘라내어 붙여보고 시도해보십시오. 나는 당신이 놓친 일부 오타가 있다고 생각합니다. –

관련 문제