Есть ли какие-либо проблемы с использованием «break» внутри процесса MPI?

#c #mpi

#c #mpi

Вопрос:

Я выполняю классическую программу «пинг-понг» в многопроцессорном режиме с использованием MPI, и когда я использую break для выхода из while цикла, программа никогда не завершается. Когда я использую другие способы выхода из цикла, программа завершается нормально. Вот моя программа:

 #include <iostream>
#include <mpi.h>

using namespace std;
#define SL cout<<endl
#define LIMITE_PINPON 10

int main(int argc, char** argv) 
{
    SL;

    MPI_Init(NULL, NULL);
    int TP; MPI_Comm_size(MPI_COMM_WORLD, amp;TP);
    int NP; MPI_Comm_rank(MPI_COMM_WORLD, amp;NP);

    int cuenta_pinpon = 0;
    int NP_prev = (NP - 1   TP) % TP;
    int NP_post = (NP   1) % TP;


    if(NP==0)
    {
        printf ( "Proc. %i -> proc. %i: t'Toma %i'n", NP, NP_post, cuenta_pinpon );
        MPI_Send ( amp;cuenta_pinpon, 1, MPI_INT, NP_post, 0, MPI_COMM_WORLD );
    }

    while (1)
    //while (cuenta_pinpon < LIMITE_PINPON)
    {
        MPI_Recv ( amp;cuenta_pinpon, 1, MPI_INT, NP_prev, 0, MPI_COMM_WORLD,
                   MPI_STATUS_IGNORE );

        cuenta_pinpon  ;

        if (cuenta_pinpon > LIMITE_PINPON) break;
        
        printf ( "Proc. %i -> proc. %i: t'Toma %i'n", NP, NP_post, cuenta_pinpon );
        MPI_Send ( amp;cuenta_pinpon, 1, MPI_INT, NP_post, 0, MPI_COMM_WORLD );
    }

    cout << "Chau"; SL;SL;

    MPI_Finalize();
    return 0;
}
  

Я должен использовать Ctrl C для завершения выполнения:

вывод

Является break ли инструкция проблемой? или какой из них?

Комментарии:

1. Проблема не в самом break операторе. Вы должны поместить его перед вызовом receive. В противном случае он прерывается до отправки вызовов, а некоторые вызовы приема никогда не получат свои сообщения и просто заблокируются навсегда.

2. Вы определили классическое рукопожатие «пинг-понг», затем «break» выскакивает из протокола. Получает ли другая задача информацию о том, что протокол ping-pong был прерван? Итак, как другой спросит, чтобы выйти / завершить / сделать то, что вам нужно?

3. Я должен был понять, почему «chau» был написан только один раз… Спасибо @HristoIliev! Спасибо @ 2785528!