#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!