내 특정 문제는 다음과 같습니다. 직원 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);
}
도움을 주시면 감사하겠습니다.
설명하는 데이터 패턴은 MPI_Alltoall 또는 MPI_Alltoallv입니다. 왜이 작업을 위해 그 집단을 사용하지 않습니까? –
감사! 전송할 벡터의 길이가 다른 경우 작동합니까? alltoall이 모든 프로세스에 동일한 길이를 보내는 것으로 보입니다. – Shidaniel
'MPI_Alltoallv'는 다양한 크기의 벡터와 함께 사용됩니다. 'MPI_Recv'의 마지막 인자는'MPI_Request'가 아닌'MPI_Status' 타입입니다. 아마도 대신에'MPI_Irecv'를 사용하려고했을 것입니다. –