2013-10-04 1 views
0

모든 프로세스에서 게임을 시뮬레이션하는 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; 
} 

답변

0

문제가 해결되었습니다. 나는 더 이상 지연을 얻지 않으며, 문제는 게임 프로그램 로직 자체입니다. processSlave for 루프가 다른 조건 인 pID != rank을 수정하여 TAG_QUIT 메시지를 보낼 때 프로세스가 건너 뛴다는 논리를 위반했습니다.

0

'승리'패킷 Wireshark/ethereal 타이밍? '우승자'간에 얼마나 지연됩니까? 프로토콜을 사용하면 여러 클라이언트가 'win'이라고 말할 수는 있지만 클라이언트가 '이겼다고'가정하거나 확인을 기다리고 있습니까?

메시지 프로토콜은 무엇입니까? 몇 곳에서 'TAG_QUIT'을 (를) 표시합니다. 어떻게

  • 아이는 '확인'
  • '종료'(고소해) ​​
  • 또는, 부모 신호를 다른 아이들과 다른 아이들을 자식 신호를이기는 '승리'
  • 부모 신호 자녀와 부모를 신호에 대해 로 '승리'(경주 인해 실패, 지연) '실패'
'패'또는과
  • 부모 신호지는/늦게 아이를 신호 수있는 자녀 (들)을 잃고
  • '종료'
  • +0

    나는 패킷을 추적하지 않도록 인터넷에서 단절된 단일 컴퓨터에서만이 프로그램을 실행한다고 언급하기 위해 내 게시물을 업데이트했습니다. 지연은 일반적으로 첫 번째 승리를보고하는 데 걸리는 시간에 비해 100 % 증가합니다. do..while 루프를 종료하는 모든 프로세스는 이겼다고 가정하고이긴 경우에만 로컬에서 확인합니다 (프로세스 간 통신 없음). 나는 동점을 처리 할 수 ​​있지만 지연은 문제가된다. –

    +0

    나는 나의 지연을 현저히 줄이는 또 다른 업데이트를 올렸지 만, 나는 아직도 내가 사용하고있는 종료 메시지 시스템에 대한 조언을 찾고있다. –

    +0

    보낼 메시지를 생각하십시오. 적어도, 나는 이기고, 확인하고, 종료한다고 생각합니다. 또한 누가 종료 메시지를 보낼지 결정해야합니다. 모든 어린이의 결과를 기록 할 수 있으므로 각 어린이가 결과를 기록할지 또는 마스터 기록 결과를 기록 할지를 결정할 수 있습니다. 신호가 얼마나 빡빡하니? 여러 명의 사람들이 지금 '승리'를 보내면, 그들은 모두 모두에게 종료를 보냅니다.'확증'을받은 승자는 첫 번째 승자가 퇴장 할 수있게합니다. – ChuckCottrill

    관련 문제