병렬 감소를 위해 수치 비 연관성을 해결하는 방법은 무엇입니까?


17

병렬 축소는 해당 작업이 연관되어 있다고 가정합니다. 부동 소수점 숫자를 추가하면이 가정이 위반됩니다. 내가 왜 이것에 관심이 있는지 물을 수 있습니다. 음, 결과를 재현성이 떨어집니다. 그리고 시뮬레이션 된 어닐링이 그러한 재현 불가능한 결과를 생성하는 서브 루틴에 대해 매개 변수를 최적화 (또는 적합)하기 위해 사용될 때 더 나빠집니다.

이 문제를 처리하는 일반적인 방법은 무엇입니까? 다음 전략에 대해 무엇을 말할 수 있습니까?

  • 재현 할 수없는 것에 신경 쓰지 마십시오.
  • 부동 소수점 숫자 및 덧셈과 함께 병렬 축소를 사용하지 마십시오.
  • 적절한 크기의 작업 패키지를 재현 가능한 방식으로 작성하고 손으로 최종 축소하십시오.
  • 더하기에는 더 높은 정밀도를 사용하십시오 (그러나 모든 컴파일러가 더 높은 정밀도의 부동 소수점 유형을 제공하는 것은 아닙니다).

동일한 수의 프로세스에서 재현성 또는 다른 수의 프로세서에서 재현성에 대해 우려하고 있습니까? 비트 단위의 재현성을 위해 얼마나 많은 성능 저하가 있습니까? 시뮬레이션 어닐링에만 관심이 있습니까?
Jed Brown

@JedBrown 나는 잠재적 인 문제를 디버깅하기 위해 재현 가능한 결과를 얻을 가능성에 대해 우려하고 있습니다. 예를 들어 동일한 수의 프로세서를 사용하거나 원래 사용 된 프로세서 수를 "인식"하여 결과를 재현 할 수있는 방법이 있다면 나에게 좋습니다. 더하기 자체에 고정밀 부동 소수점 유형을 사용하는 것과 관련된 성능 저하를 기꺼이 감수합니다. 내 구체적인 문제는 주로 시뮬레이트 된 어닐링과 예상치 못한 차이와 관련이 있었지만 모두 실제 버그로 판명되었습니다.
토마스 클림 펠

답변:


15

MPI_Allreduce()MPI-2.2 표준의 5.9.1 절에 다음 참고 사항이 표시되는 경우, 동일한 수의 프로세서를 사용하는 한 사용하여 구현 된 축소를 재현 할 수 있습니다.

구현 자에 대한 조언 . MPI_REDUCE함수가 동일한 인수에 적용될 때마다 동일한 순서로 나타나는 동일한 결과를 얻도록 구현 하는 것이 좋습니다 . 이로 인해 프로세서의 물리적 위치를 이용하는 최적화가 방지 될 수 있습니다. ( 구현 자에 대한 조언의 끝 .)

모든 비용으로 재현성을 보장해야하는 경우 다음 단락의 지침을 따를 수 있습니다.

사용자에게 조언 . 일부 응용 프로그램은 부동 소수점 연산의 비 연관 특성을 무시할 수 없거나 특수 축소 순서가 필요하고 연관으로 취급 될 수없는 사용자 정의 연산 (5.9.5 참조)을 사용할 수 있습니다. 그러한 신청은 평가 순서를 명시 적으로 시행해야한다. 예를 들어, 엄격한 왼쪽에서 오른쪽으로 (또는 오른쪽에서 왼쪽으로) 평가 순서가 필요한 연산의 경우 MPI_GATHER, 축소 연산을 적용하여 단일 프로세스 (예 :로 ) 에서 모든 피연산자를 수집하여 수행 할 수 있습니다. 원하는 순서로 (예를 들어,로 MPI_REDUCE_LOCAL), 그리고 필요한 경우, 결과를 다른 프로세스로 (예를 들어,로 MPI_BCAST) 브로드 캐스팅 또는 분산시킨다 . ( 사용자에게 조언의 끝 .)

보다 광범위한 방식에서 대부분의 응용 프로그램에 효율적인 알고리즘은 지역성을 이용합니다. 다른 수의 프로세스에서 실행될 때 알고리즘이 실제로 다르기 때문에 다른 수의 프로세스에서 실행될 때 결과를 정확하게 재현하는 것은 실용적이지 않습니다. 가능한 예외는 감쇠 된 Jacobi 또는 다항식 (예 : Chebyshev) 스무더가있는 멀티 그리드이며,이 간단한 방법으로 성능이 우수 할 수 있습니다.

동일한 수의 프로세스를 사용하면 메시지를받은 순서대로 (예 :) 사용하여 메시지를 처리하여 성능을 MPI_Waitany()결정하는 데 도움이되므로 결정적이지 않습니다. 이러한 경우 두 가지 변형, 즉 임의 순서로 수신하는 빠른 변형과 정적 순서로 수신되는 "디버그"변형을 구현할 수 있습니다. 이를 위해서는 모든 기본 라이브러리도이 동작을 제공하도록 작성되어야합니다.

경우에 따라 디버깅을 위해이 재현 가능한 동작을 제공하지 않는 계산의 일부를 분리하여 중복 수행 할 수 있습니다. 구성 요소의 설계 방식에 따라 이러한 변경은 약간의 코드 또는 매우 방해가 될 수 있습니다.


6

대부분의 경우 나는 Jed의 대답을 이해했다. 그러나 다른 방법이 있습니다. 일반 부동 소수점 숫자의 크기를 고려하면 모든 숫자를 4000 비트 고정 소수점 숫자로 저장할 수 있습니다. 따라서 포함 된 부동 소수점 숫자를 줄이면 연관성에 관계없이 정확한 계산을 얻을 수 있습니다. (죄송합니다. 누가이 아이디어를 생각해 냈는지에 대한 언급이 없습니다.)


1
나는 그가 처음이라고 생각하지 않지만 동료 Dr. Bandwidth는 확실히이 주제에 대해 좋은 글을 남겼습니다
Jeff

5

직렬에서 수행 할 수있는 것처럼 MPI에서 수치 적으로 안정적인 감소 알고리즘을 구현할 수 있습니다. 물론 성능 저하가있을 수 있습니다. 벡터를 복제 할 여유가있는 경우 MPI_Gather를 사용하고 루트에서 일련의 숫자를 안정적으로 줄이십시오. 경우에 따라 성능 저하가 큰 문제가되지 않을 수도 있습니다.

다른 해결책은 여기에 설명 된대로 넓은 축 압기를 사용하는 입니다. 더 많은 대역폭을 사용하지만 사용자 정의 축소로 MPI를 사용하여이 작업을 수행 할 수 있습니다.

위의 타협은 보상 합계를 사용하는 것입니다. 자세한 내용은“카한 요약”을 참조하십시오. Higham의“ 숫자 알고리즘의 정확성과 안정성 ”은이 주제에 대한 훌륭한 자료입니다.



2

더하기에 더 높은 정밀도의 산술을 사용하는 대신 보상 합산을 사용할 가능성이 있음을 지적하고 싶습니다 ([1] 참조). 이는 더 큰 데이터 유형에 의존 할 필요없이 합산의 정확성을 높일 수 있습니다.

[1] Higham, NJ 부동 소수점 합산의 정확도. 과학 컴퓨팅에 관한 SIAM 저널 14, 783-799 (1993).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.