MPI_Send или MPI_Recv дает ошибку сегментации

Я пытаюсь вычислить пи с использованием библиотеки MPI C на топологии гиперкуба. Но выполнение не продолжается в частях MPI_Send и MPI_Recv.

Я использую 4 процессора!

Кажется, что ни один из процессоров не получает никаких данных.

Вот код, вывод и ошибка, которую я получаю.

Любая помощь будет оценена! Спасибо!

Код: после инициализации и расчета локального mypi на каждом процессоре.

  mypi = h * sum;
    printf("Processor %d has local pi = %f", myid, mypi);
    //Logic for send and receive!                                                                                                                                                   
    int k;
    for(k = 0; k < log10(numprocs) / log10(2.0); k++){
      printf("entering dimension %d \n", dimension);
      dimension = k;
      if(decimalRank[k] == 1 && k < e){
        //if it is a processor that need to send then                                                                                                                               
        int destination = 0;
        //find destination processor and send                                                                                                                                       
        destination = myid ^ (int)pow(2,dimension);
        printf("Processor %d sending to %d in dimension %d the value %f\n", myid, destination, dimension,  mypi);

        MPI_SEND(&mypi, 1, MPI_DOUBLE, destination, MPI_ANY_TAG, MPI_COMM_WORLD);
        printf("Processor %d done sending to %d in dimension %d the value %f\n", myid, destination, dimension, mypi);
      }
      else{
        //Else this processor is supposed to be receiving                                                                                                                           
        pi += mypi;
        printf("Processor %d ready to receive in dimension %d\n", myid, dimension);
        MPI_RECV(&mypi, 1, MPI_DOUBLE, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD);
        printf("Processor %d received value %d in dimension %d\n", myid, pi, dimension);
        pi += mypi;
      }
    }

    done = 1;
  }

Ошибка:

mpiexec: Warning: tasks 0-3 died with signal 11 (Segmentation fault).

Выход:

bcast complete
Processor 0 has local pi = 0.785473
Processor 0 ready to receive in dimension 0
Processor 1 has local pi = 0.785423
Processor 1 sending to 0 in dimension 0 the value 0.785423
Processor 3 has local pi = 0.785323
Processor 3 sending to 2 in dimension 0 the value 0.785323
Processor 2 has local pi = 0.785373
Processor 2 ready to receive in dimension 0

2 ответа

Решение

MPI_ANY_TAG не является допустимым значением тега в операциях отправки. Его можно использовать только в качестве значения тега подстановки в операциях приема, чтобы получать сообщения независимо от значения тега. Отправитель должен указать допустимое значение тега - 0 достаточно в большинстве случаев.

Это:

for(k = 0; k < log10(numprocs) / log10(2.0); k++) ...

и это:

... pow(2,dimension);

плохие: вы должны использовать только целочисленную логику. Будьте уверены, что когда-нибудь случится так, что что-то будет оценено как "2.999999" и округлено до "2", что нарушит ваш алгоритм.

Я бы попробовал что-то вроде:

for(k = 0, k2 = 1; k2 < numprocs; k++, k2 <<= 1) ...
Другие вопросы по тегам