2016-09-12 5 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()', которая предоставляется для вашей выгоды. Как ни странно, возможно, из нескольких веб-страниц, которые я искал Google, только страница [MS] (https://msdn.microsoft.com/en-us/library/dn473277 (v = vs.85) .aspx) конкретно упоминает возвращаемое значение , Остальные все, кажется, плагиат, что другие написали. –

ответ

3

Я не слишком уверен, что для остальной части кода (кажется, в порядке, но я слишком близко не смотреть), но то, что уверен в том, что у вас есть он MPI_Recv()/MPI_Send() пары неправильно. Проблема в том, что вы отправляете и получаете массивы из 30 целых чисел, в то время как вы выделяете только память для каждого из них. Попробуйте заменить параметр 30 на номер 1 в 3 MPI_Send() или MPI_Recv() вызовах, и код может просто работать.

+0

переполнение стека всегда помогает :) –

Смежные вопросы