2016-09-12 2 views
1

성공적으로 실행되는 단순한 MPI 코드가 있습니다 만 종료하기 직전에 다음과 같은 오류가 표시됩니다.MPI - 분할 오류 종료 코드 : 139

=== 
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES 
= EXIT CODE: 139 
= CLEANING UP REMAINING PROCESSES 
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES 
=================================================================================== 
YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 11) 
This typically refers to a problem with your application. 

아래는 내 소스 코드입니다. 나는 코드의 나머지 부분에 대해 너무 확실하지 않다

/* 
AUTHOR ::: KHAYAM ANJAM 
*/ 

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

int main (int argc, char *argv[]) 
{ 
    int rank, size, ball_value, ball_present; 

    MPI_Init (&argc, &argv); 
    MPI_Comm_rank (MPI_COMM_WORLD, &rank); 
    MPI_Comm_size (MPI_COMM_WORLD, &size); 

    srandom(rank); 
     int delta = rand() % 13; 
    int random = rand() % 5; 
     if (random == 0) delta = -1*delta; 
    if (rank == 0) { 
     ball_present = 1; 
     ball_value = 0; 
    } 
    else ball_present = 0; 
    while (1) { 
     if(ball_present == 0) 
      MPI_Recv(&ball_value, 30, MPI_INT, MPI_ANY_SOURCE, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
     ball_present = 1; 
     printf("Task %d has Ball with value %d\n", rank, ball_value); 
     if (ball_value == 1000) break; 
     if (abs(ball_value) > 100) { 
      int send_1000 = 1000; 
      int i; 
      for (i = 0; i < size; i++) 
       if (i != rank) MPI_Send(&send_1000, 30, MPI_INT, i, 10, MPI_COMM_WORLD); //Broadcast to all others 
      break; 
     } 
     ball_value += delta; 
     int next_to_send = rand() % size; 
     if (next_to_send != rank) { 
      printf("Sending ball to %d\n", next_to_send); 
      MPI_Send(&ball_value, 30, MPI_INT, next_to_send, 10, MPI_COMM_WORLD); 
      ball_present = 0; 
      } 
    } 
    MPI_Finalize(); 
    return 0; 
} 
+0

나는 MPI 사용자가 아니지만, 귀하의 이익을 위해 제공되는'MPI_xxx()'함수의 * any *에서 반환 값을 확인하지 않음을 확인합니다. 이상하게도 어쩌면 내가 검색 한 몇몇 웹 페이지 중 아마도 [MS 페이지] (https://msdn.microsoft.com/en-us/library/dn473277(v=vs.85) .aspx) 만 반환 값을 구체적으로 언급합니다. . 다른 모든 사람들은 다른 사람들이 작성한 것을 표절하는 것처럼 보입니다. –

답변

3

는 (OK 보이지만 너무 밀접하게 보지 않았다)하지만 확실한 것은 그가 MPI_Recv()/MPI_Send()쌍 잘못 가지고 있다는 것입니다. 문제는 30 개의 정수 배열을 송수신하는 반면 각 정수 중 하나에 대해서만 메모리를 할당한다는 것입니다. 30 매개 변수를 (3 MPI_Send() 또는 MPI_Recv() 호출)로 바꿔보십시오. 그러면 코드 만 작동 할 수 있습니다.

+0

스택 오버플로가 항상 도움이됩니다. :) –