MPI_Alltoallv 함수
에서 데이터를 수집하고 그룹의 모든 멤버에 데이터를 분산합니다. MPI_Alltoallv 함수는 각 프로세스의 다양한 데이터 수를 허용하여 MPI_Alltoall 함수에 유연성을 더합니다.
구문
int MPIAPI MPI_Alltoallv(
_In_ void *sendbuf,
_In_ int *sendcounts,
_In_ int *sdispls,
MPI_Datatype sendtype,
_Out_ void *recvbuf,
_In_ int *recvcounts,
_In_ int *rdispls,
MPI_Datatype recvtype,
MPI_Comm comm
);
매개 변수
sendbuf [in]
그룹의 모든 프로세스로 보낼 데이터에 대한 포인터입니다. 버퍼에 있는 요소의 수와 데이터 형식은 sendcount 및 sendtype 매개 변수에 지정됩니다. 버퍼의 각 요소는 그룹의 프로세스에 해당합니다.comm 매개 변수가 통신 내를 참조하는 경우 모든 프로세스에서 MPI_IN_PLACE 지정하여 현재 위치 옵션을 지정할 수 있습니다. sendcount, sdispls 및 sendtype 매개 변수는 무시됩니다. 각 프로세스는 해당 수신 버퍼 요소에 데이터를 입력합니다.
보내고 받은 데이터에는 recvcounts 배열 및 recvtype 매개 변수에 지정된 것과 동일한 형식 맵이 있어야 합니다. 데이터는 rdispls 매개 변수로 지정된 수신 버퍼의 위치에서 읽습니다.
sendcounts [in]
이 프로세스가 sendbuf 매개 변수에 지정된 버퍼에서 보내는 데이터 요소의 수입니다. sendcount의 요소가 0이면 해당 프로세스의 메시지 데이터 부분이 비어 있습니다.sdispls [in]
각 통신기 프로세스에 대한 데이터의 sendbuf 매개 변수를 기준으로 하는 위치입니다.Entry j는 프로세스 j로 향하는 나가는 데이터를 가져오는 sendbuf 매개 변수를 기준으로 하는 변위를 지정합니다.
sendtype
송신 버퍼에 있는 요소의 MPI 데이터 형식입니다.recvbuf [out]
각 프로세스에서 받은 데이터를 포함하는 버퍼에 대한 포인터입니다. 버퍼에 있는 요소의 수와 데이터 형식은 recvcount 및 recvtype 매개 변수에 지정됩니다.recvcounts [in]
수신 버퍼에 있는 각 통신기 프로세스의 데이터 요소 수입니다.rdispls [in]
각 통신기 프로세스의 데이터의 recvbuf 매개 변수를 기준으로 하는 위치입니다.recvbuf, recvcounts 및 rdispls 매개 변수 배열에서 각 배열의 n번째 요소는 n번째 통신기 프로세스에서 수신된 데이터를 참조합니다.
recvtype
버퍼에 있는 각 요소의 MPI 데이터 형식입니다.통신
MPI_Comm 통신기 핸들을 지정합니다.
반환 값
성공에 대한 MPI_SUCCESS 반환합니다. 그렇지 않으면 반환 값이 오류 코드입니다.
Fortran에서 반환 값은 IERROR 매개 변수에 저장됩니다.
Fortran
MPI_ALLTOALL(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT, RECVTYPE,
COMM, IERROR)
<type> SENDBUF(*), R.ECVBUF(*)
INTEGER SENDCOUNT, SENDTYPE, RECVCOUNT, RECVTYPE, COMM, IERROR
설명
sendcount로 지정된 형식 서명과 프로세스에 대한 sendtype 매개 변수는 recvcount로 지정된 형식 서명과 수신 프로세스의 recvtype 매개 변수와 같아야 합니다. 따라서 전송되는 데이터의 양은 모든 프로세스 쌍 간에 수신되는 데이터 양과 같아야 합니다. 발신자와 수신자 간의 고유 형식 맵은 여전히 허용됩니다.
모든 매개 변수는 모든 프로세스에서 중요합니다. comm 매개 변수는 모든 프로세스에서 동일해야 합니다.
comm 매개 변수가 통신 내를 참조하는 경우 프로세스에서 보낸 j번째 블록은 프로세스j에 의해 수신되고 수신 버퍼의 i번째 블록에 배치됩니다. 이러한 블록의 크기가 모두 같을 필요는 없습니다.
MPI_Alltoallv 함수를 호출한 결과는 각 프로세스가 를 사용하여 다른 모든 프로세스에 메시지를 보내고 를 MPI_Send(sendbuf + sdispls[i]*extent(sendtype), sendcounts[i], sendtype, I, …)
호출MPI_Recv(recvbuf + rdispls[i]*extent(recvtype), recvcounts[i], recvtype, I, …)
하여 다른 모든 프로세스에서 메시지를 받은 것처럼 표시됩니다.
현재 위치 옵션을 지정하면 통신자 그룹의 두 프로세스 간에 동일한 양의 데이터와 형식이 전송되고 수신됨을 나타냅니다. 프로세스 쌍이 다르면 다양한 양의 데이터를 교환할 수 있습니다. 사용자는 recvcounts[j] 및 recvtype이 프로세스 j의 recvcounts[i] 및 recvtype과 일치하는지 확인해야 합니다. 이 대칭 교환은 MPI_Alltoallv 함수 호출 후 전송 프로세스에서 전송할 데이터를 사용하지 않는 애플리케이션에서 유용할 수 있습니다.
comm 매개 변수가 상호 통신기를 참조하는 경우 결과는 그룹 A의 각 프로세스가 그룹 B의 각 프로세스에 메시지를 보내는 것처럼, 그 반대의 경우도 마찬가지입니다. 그룹 A에 있는 프로세스 i의 jth송신 버퍼는 그룹 B에서 프로세스 j의 i번째 수신 버퍼와 일치해야 하며 그 반대의 경우도 마찬가지입니다.
요구 사항
제품 |
HPC 팩 2012 MS-MPI 재배포 가능 패키지, HPC 팩 2008 R2 MS-MPI 재배포 가능 패키지, HPC Pack 2008 MS-MPI 재배포 가능 패키지 또는 HPC 팩 2008 클라이언트 유틸리티 |
헤더 |
Mpi.h; Mpif.h |
라이브러리 |
Msmpi.lib |
DLL |
Msmpi.dll |