MPI_Allreduce()
MPI-2.2 표준의 5.9.1 절에 다음 참고 사항이 표시되는 경우, 동일한 수의 프로세서를 사용하는 한 사용하여 구현 된 축소를 재현 할 수 있습니다.
구현 자에 대한 조언 . MPI_REDUCE
함수가 동일한 인수에 적용될 때마다 동일한 순서로 나타나는 동일한 결과를 얻도록 구현 하는 것이 좋습니다 . 이로 인해 프로세서의 물리적 위치를 이용하는 최적화가 방지 될 수 있습니다. ( 구현 자에 대한 조언의 끝 .)
모든 비용으로 재현성을 보장해야하는 경우 다음 단락의 지침을 따를 수 있습니다.
사용자에게 조언 . 일부 응용 프로그램은 부동 소수점 연산의 비 연관 특성을 무시할 수 없거나 특수 축소 순서가 필요하고 연관으로 취급 될 수없는 사용자 정의 연산 (5.9.5 참조)을 사용할 수 있습니다. 그러한 신청은 평가 순서를 명시 적으로 시행해야한다. 예를 들어, 엄격한 왼쪽에서 오른쪽으로 (또는 오른쪽에서 왼쪽으로) 평가 순서가 필요한 연산의 경우 MPI_GATHER
, 축소 연산을 적용하여 단일 프로세스 (예 :로 ) 에서 모든 피연산자를 수집하여 수행 할 수 있습니다.
원하는 순서로 (예를 들어,로
MPI_REDUCE_LOCAL
), 그리고 필요한 경우, 결과를 다른 프로세스로 (예를 들어,로 MPI_BCAST
) 브로드 캐스팅 또는 분산시킨다 . ( 사용자에게 조언의 끝 .)
보다 광범위한 방식에서 대부분의 응용 프로그램에 효율적인 알고리즘은 지역성을 이용합니다. 다른 수의 프로세스에서 실행될 때 알고리즘이 실제로 다르기 때문에 다른 수의 프로세스에서 실행될 때 결과를 정확하게 재현하는 것은 실용적이지 않습니다. 가능한 예외는 감쇠 된 Jacobi 또는 다항식 (예 : Chebyshev) 스무더가있는 멀티 그리드이며,이 간단한 방법으로 성능이 우수 할 수 있습니다.
동일한 수의 프로세스를 사용하면 메시지를받은 순서대로 (예 :) 사용하여 메시지를 처리하여 성능을 MPI_Waitany()
결정하는 데 도움이되므로 결정적이지 않습니다. 이러한 경우 두 가지 변형, 즉 임의 순서로 수신하는 빠른 변형과 정적 순서로 수신되는 "디버그"변형을 구현할 수 있습니다. 이를 위해서는 모든 기본 라이브러리도이 동작을 제공하도록 작성되어야합니다.
경우에 따라 디버깅을 위해이 재현 가능한 동작을 제공하지 않는 계산의 일부를 분리하여 중복 수행 할 수 있습니다. 구성 요소의 설계 방식에 따라 이러한 변경은 약간의 코드 또는 매우 방해가 될 수 있습니다.