첫째, 정확한 답은 (1) 사용법, 함수 입력 인수, (2) MPI 구현 품질 및 세부 사항, (3) 사용중인 하드웨어에 따라 다릅니다. 하드웨어 공급 업체가 네트워크에 대한 MPI를 최적화 할 때와 같이 종종 (2) 및 (3)이 관련됩니다.
일반적으로 MPI 집합 통합은 소규모 메시지에 더 좋습니다. 시작 비용이 중요하지 않으며 호출 간 계산 시간에 편차가있는 경우 집합 차단으로 인한 동기화를 최소화해야하기 때문입니다. 더 큰 메시지의 경우 전송되는 데이터 양을 최소화하는 것이 목표입니다.
예를 들어, 이론적으로 MPI_Reduce_scatter_block
는 전자가 후자의 관점에서 종종 구현되기 때문에 MPI_Reduce
뒤에 MPI_Scatter
나오는 것보다 낫습니다 . 따라서 실제 이점은 없습니다. 대부분의 MPI 구현에서 구현 품질과 사용 빈도 사이에는 상관 관계가 있으며 공급 업체는 기계 계약에 필요한 기능을 분명히 최적화합니다.
다른 한편으로, 하나가 블루 진에 있다면, 보다 많은 의사 소통을 하고 결합 하는을 MPI_Reduce_scatter_block
사용 MPI_Allreduce
하는 것이 실제로는 훨씬 더 빠릅니다. 이것은 내가 최근에 발견 한 것으로 MPI의 성능 자체 일관성 원칙에 대한 흥미로운 위반입니다 (이 원칙은 "자체 일관성있는 MPI 성능 지침" 에 자세히 설명되어 있음 ).MPI_Reduce
MPI_Scatter
분산 + 수집 대 수집의 특정 경우, 전자의 경우 모든 데이터가 단일 프로세스로 이동해야하므로 병목 현상이 발생하지만 병목 현상의 경우 데이터가 모든 등급에서 즉시 유입 및 유출 될 수 있습니다. 모든 순위에는 다른 모든 순위로 보낼 데이터가 있기 때문입니다. 그러나 일부 네트워크에서는 모든 노드에서 한 번에 데이터를 보내는 것이 좋은 아이디어는 아닙니다.
마지막 으로이 질문에 대답하는 가장 좋은 방법은 코드에서 다음을 수행하고 실험을 통해 질문에 대답하는 것입니다.
#ifdef TWO_MPI_CALLS_ARE_BETTER_THAN_ONE
MPI_Scatter(..)
MPI_Gather(..)
#else
MPI_Allgather(..)
#endif
더 나은 옵션은 처음 두 번 반복하는 동안 코드를 실험적으로 측정 한 다음 나머지 반복에 더 빠른 것을 사용하는 것입니다.
const int use_allgather = 1;
const int use_scatter_then_gather = 2;
int algorithm = 0;
double t0 = 0.0, t1 = 0.0, dt1 = 0.0, dt2 = 0.0;
while (..)
{
if ( (iteration==0 && algorithm==0) || algorithm==use_scatter_then_gather )
{
t0 = MPI_Wtime();
MPI_Scatter(..);
MPI_Gather(..);
t1 = MPI_Wtime();
dt1 = t1-t0;
}
else if ( (iteration==1 && algorithm==0) || algorithm==use_allgather)
{
t0 = MPI_Wtime();
MPI_Allgather(..);
t1 = MPI_Wtime();
dt2 = t1-t0;
}
if (iteration==1)
{
dt2<dt1 ? algorithm=use_allgather : algorithm=use_scatter_then_gather;
}
}
MPI_Scatter
다음MPI_Gather
과 같은 의미 통신 제공하지 않는다MPI_Allgather
. 어떤 식 으로든 작업을 표현할 때 중복성이 관련되어 있습니까?