2013-07-23 4 views
1

내 특정 문제는 다음과 같습니다. 직원 4 명과 마스터 프로세스 1 명이 있다고 가정 해보십시오. 나는 각 노동자로부터 다른 모든 노동자에게 메시지를 보내고 싶다. (작업자 1에서 2,3,4, 프로세스 2에서 1,3,4 등으로)MPI의 여러 프로세스에 Recv를 전송하는 최적의 방법

메시지를 보내는 순서는 신경 쓰지 않지만 성능은 중요합니다. 전송할 데이터가 매우 크고 기가 바이트 수 있습니다.

현재 Isend와 Recv를 사용하고 있지만 세그먼트 오류가 계속 발생합니다. 나는 Sendrecv를 사용하려고 시도했지만, 중간에 멈춰있는 것 같다. 아마도 교착 상태 때문일 것이다. 따라서 여러 프로세스간에주고받는 가장 좋은 방법이 무엇인지 궁금합니다. 수신 다음

for(int id = 1; id < num_processes; id++) { 
    // Some computation with the vector vec // 
    MPI_Request request; 
    if(id != myId) 
     MPI_Isend(&vec.front(), vec.size(), mpi_bid, id, 1, MPI_COMM_WORLD, &request); 
} 

:

여기에 내 현재 코드입니다.

for(int id = 1; id < num_processes; id++) { 
    MPI_Request request2; 
    if(id != myID) 
     MPI_Recv(&recvVec.front(), some_large_value, mpi_bid, MPI_ANY_SOURCE, 1, MPI_COMM_WORLD, &request2); 
} 

도움을 주시면 감사하겠습니다.

+0

설명하는 데이터 패턴은 MPI_Alltoall 또는 MPI_Alltoallv입니다. 왜이 작업을 위해 그 집단을 사용하지 않습니까? –

+0

감사! 전송할 벡터의 길이가 다른 경우 작동합니까? alltoall이 모든 프로세스에 동일한 길이를 보내는 것으로 보입니다. – Shidaniel

+2

'MPI_Alltoallv'는 다양한 크기의 벡터와 함께 사용됩니다. 'MPI_Recv'의 마지막 인자는'MPI_Request'가 아닌'MPI_Status' 타입입니다. 아마도 대신에'MPI_Irecv'를 사용하려고했을 것입니다. –

답변

0

segfaults가 발생하는 경우 데이터 전송을 최적으로 수행하는 것이 아닌 다른 문제가 발생할 수 있습니다. 다른 곳에서도 문제가있을 수 있습니다. 디버거를 사용하여 현재 진행중인 작업을 파악할 수 있습니다. 여기서 MPI 디버깅에 대한 큰 글을보실 수 있습니다 (How do I debug an MPI program?). 무료 디버거를 원하는 경우 GDB를 항상 사용할 수 있습니다 (수행 방법을 모르는 경우 this answer 참조).

관련 문제