2017-11-03 9 views
0

저는 MPI가 새롭고 15 개의 요소로 된 2 개의 배열 A와 B가 있고 16 개의 프로세스가 있고 각 프로세스는 배열의 요소를 나타냅니다. (프로세스 0을 사용하지 않습니다.). 배열 A는 8 ... 15 위치의 입력 데이터를 저장합니다.이 위치는 트리의 리프를 reprezent하고 첫 번째 단계에서는 나뭇잎에서 부모에게 숫자를 보내고 부모는 모두로부터 받는다. 아들들과 그 숫자들을 더하여 아버지에게 보내라. 그리고 배열 A는 배열의 모든 원소의 합계가 1 인 곳에서 처리됩니다. 그리고 두 번째 단계에서 나는 접두사 계산을합니다. 여기서 접두사 계산은 0 번 프로세스에서 시작하여 잎을 마칩니다. 그리고 배열 B를 계산하기 위해 다른 모든 프로세스는 프로세스 1을 끝내기 위해 기다려야하고 MPI_Barrier를 사용하기 위해서는 코드를 exec 할 때 오류가 발생합니다.MPI : 다음 예제에서 MPI_Barrier를 사용할 때 오류가 발생하는 이유는 무엇입니까?

int m = 3; 
int n = (int)pow(2, m); 
int *A = (int*)malloc(2 * n * sizeof(int)); 
int *B = (int*)malloc(2 * n * sizeof(int)); 
int id; 
MPI_Status status; 
A[8] = 4; A[9] = 8; A[10] = 5; A[11] = 2; 
A[12] = 10; A[13] = 6; A[14] = 9; A[15] = 11; 
MPI_Init(&argc, &argv); 
MPI_Comm_rank(MPI_COMM_WORLD, &id); 
if (id == 1) 
{ 
    int nr; 
    int suma = 0; 
    MPI_Recv(&nr, 1, MPI_INT, 2 * id, 99, MPI_COMM_WORLD, &status); 
    suma += nr; 
    MPI_Recv(&nr, 1, MPI_INT, 2 * id + 1, 99, MPI_COMM_WORLD, &status); 
    suma += nr; 
    A[id] = suma; 
    printf("A[%d]=%d\n", id, A[id]); 
    B[id] = A[id]; 
    printf("B[%d]=%d\n", id, B[id]); 
    MPI_Barrier(MPI_COMM_WORLD); 
} 
else 
{ 
    if (id != 0) 
    { 
     if(id >= 8) 
     { 
      MPI_Send(&A[id], 1, MPI_INT, id/2, 99, MPI_COMM_WORLD); 
      printf("%d a trimis %d catre %d\n", id, A[id], id/2); 
      MPI_Barrier(MPI_COMM_WORLD); 
     } 
     else 
     { 
      int nr; 
      int suma = 0; 
      MPI_Recv(&nr, 1, MPI_INT, 2 * id, 99, MPI_COMM_WORLD, &status); 
      suma += nr; 
      MPI_Recv(&nr, 1, MPI_INT, 2 * id + 1, 99, MPI_COMM_WORLD, &status); 
      suma += nr; 
      A[id] = suma; 
      MPI_Send(&A[id], 1, MPI_INT, id/2, 99, MPI_COMM_WORLD); 
      printf("%d a trimis %d catre %d\n", id, A[id], id/2); 
      MPI_Barrier(MPI_COMM_WORLD); 
     } 
     if (id % 2 == 1) 
     { 
      B[id] = B[(id - 1)/2]; 
      printf("B[%d]=%d\n", id, B[id]); 
     } 
     else 
     { 
      B[id] = B[id/2] - A[id + 1]; 
      printf("B[%d]=%d\n", id, B[id]); 
     } 
    } 
    MPI_Finalize(); 
    free(A); 
    return 0; 

그리고 난 다음 오류가 나타납니다 나는 프로그램 작업을 할 수있는 방법

[15]fatal error
Fatal error in MPI_Barrier:Other MPI error, error stack:
MPI_Barrier(MPI_COMM_WORLD) failed
failed to attach to a bootstrap queue - 5064:344

를?

+0

시스템에서보다 기본적인 Init/Barrier/Finalize 작업을 수행합니까? – Zulan

답변

0

MPI_Barrier()는 공동 작업이며, 한 번 하여 의사 소통의 모든는 MPI 작업을 호출이 완료됩니다.

코드를 올바르게 읽으면 0 작업은 MPI_Barrier(MPI_COMM_WORLD)을 호출하지 않으므로 MPI 라이브러리의 일부 메커니즘이 중단하지 않으면 프로그램이 교착 상태가됩니다.