모든 프로세스에서 게임을 시뮬레이션하는 C/C++ MPI 프로그램에서 관련 문제가 있습니다. 마스터를 포함하여 어떤 프로세스가 승리하면 그 프로세스는 다른 모든 프로세스에게 게임 플레이를 종료하도록 알려야하므로 결과를 마스터에게 전송하고 마스터에 의해 합계 할 수 있습니다.모든 프로세스가 종료 메시지를 보내도록 허용
가끔은 내가이기는 과정에서 1 개 이상의 프로세스를 얻는 것이 문제입니다. 이렇게하면 작업이 끝나기 전에 긴 시간 (경우에 따라 1 분 이상 걸림)이됩니다. 모든 프로세스간에 메시지 종료 상황을 적절하게 처리하는지 확신 할 수 없습니다.
업데이트 :이 프로그램은 네트워크가 아닌 단일 컴퓨터에서 실행됩니다. 기계가 인터넷에 연결되어 있지 않습니다.
업데이트 2 : 너무 많은 작업을 유발하는 내부 게임 코드로 인해 지연 문제를 크게 줄일 수있었습니다. 나는 여전히 Irecv/Isend를 사용하여 프로세스를 종료하는 방법에 대한 해석을 찾고있다.
업데이트 3 : 내 대답이 내 대답에 표시됩니다.
여기 내 응용 프로그램의 일부 코드가 도움이됩니다.
int max_streak_length; // set in main from argv[], greater than 0
bool should_quit = false;
void checkMessages()
{
static int recvFlag
static bool msgBuff;
static MPI_Request request;
MPI_Status status;
// Are we already listening
if(request)
{
// Test for message
MPI_Test(&request, &recvFlag, &status);
if(recvFlag)
{
if(status.MPI_TAG == TAG_QUIT)
should_quit = true;
}
}
// Start listening if we aren't
if(!request)
MPI_Irecv(&msgBuff, 1, MPI_C_BOOL, MPI_ANY_SOURCE, TAG_QUIT, MPI_COMM_WORLD, &request);
}
void processMaster(int numProcs) {
double start = MPI_Wtime();
Game game(max_streak_length);
do
{
if(numProcs > 1)
checkMessages();
game.play();
} while(!should_quit && !game.is_game_over());
// Let other processes know they should stop, if I won
if(!should_quit && game.is_game_over())
{
cout << "Master wins " << MPI_Wtime() << endl;
for(int pID = 1; numProcs > 1 && pID < numProcs; ++pID)
{
MPI_Request r;
MPI_Isend(&should_quit, 1, MPI_C_BOOL, pID, TAG_QUIT, MPI_COMM_WORLD, &r);
}
}
cout << "master quitting" << endl;
}
void processSlave(int numProcs, int rank) {
Game game(max_streak_length);
do
{
checkMessages();
game.play();
} while(!should_quit && !game.is_game_over());
// Let other processes know they should stop, if I won
if(!should_quit && game.is_game_over())
{
cout << rank << " wins " << MPI_Wtime() << endl;
for(int pID = 0; pID < numProcs; ++pID)
{
if(pID == rank)
continue;
MPI_Request r;
MPI_Isend(&should_quit, 1, MPI_C_BOOL, pID, TAG_QUIT, MPI_COMM_WORLD, &r);
}
}
cout << rank << " quitting" << endl;
}
나는 패킷을 추적하지 않도록 인터넷에서 단절된 단일 컴퓨터에서만이 프로그램을 실행한다고 언급하기 위해 내 게시물을 업데이트했습니다. 지연은 일반적으로 첫 번째 승리를보고하는 데 걸리는 시간에 비해 100 % 증가합니다. do..while 루프를 종료하는 모든 프로세스는 이겼다고 가정하고이긴 경우에만 로컬에서 확인합니다 (프로세스 간 통신 없음). 나는 동점을 처리 할 수 있지만 지연은 문제가된다. –
나는 나의 지연을 현저히 줄이는 또 다른 업데이트를 올렸지 만, 나는 아직도 내가 사용하고있는 종료 메시지 시스템에 대한 조언을 찾고있다. –
보낼 메시지를 생각하십시오. 적어도, 나는 이기고, 확인하고, 종료한다고 생각합니다. 또한 누가 종료 메시지를 보낼지 결정해야합니다. 모든 어린이의 결과를 기록 할 수 있으므로 각 어린이가 결과를 기록할지 또는 마스터 기록 결과를 기록 할지를 결정할 수 있습니다. 신호가 얼마나 빡빡하니? 여러 명의 사람들이 지금 '승리'를 보내면, 그들은 모두 모두에게 종료를 보냅니다.'확증'을받은 승자는 첫 번째 승자가 퇴장 할 수있게합니다. – ChuckCottrill