플롭 카운팅에 의한 알고리즘 분석은 더 이상 사용되지 않습니까?


43

수치 분석 과정에서 문제의 크기에 따라 필요한 부동 소수점 연산 (플롭) 수를 계산하여 알고리즘의 효율성을 분석하는 방법을 배웠습니다. 예를 들어, Numerical Linear Algebra에 관한 Trefethen & Bau의 텍스트에는 플롭 카운트에 대한 3D 모양의 그림도 있습니다.

캐시에없는 것을 가져 오기위한 메모리 대기 시간이 플롭 비용보다 훨씬 크기 때문에 "플롭이 비어있다"고 말하는 것이 유행입니다. 그러나 우리는 여전히 최소한 수치 분석 과정에서 학생들에게 플롭을 세도록 가르치고 있습니다. 대신 메모리 액세스를 계산하도록 그들에게 가르쳐야합니까? 새로운 교과서를 작성해야합니까? 아니면 메모리 액세스가 너무 머신별로 시간을 소비합니까? 플롭 또는 메모리 액세스가 병목 현상인지 여부와 관련하여 장기 추세는 무엇입니까?

참고 : 아래 답변 중 일부는 "몇 가지 플롭을 저장하거나 캐시 성능을 향상시키기 위해 구현을 강박 적으로 다시 작성해야합니까?"와 같은 다른 질문에 대답하는 것 같습니다. 그러나 내가 묻는 것은 " 산술 연산이나 메모리 액세스 측면에서 알고리즘의 복잡성을 추정하는 것이 더 유용한가 ?"


1
> "산술 연산 또는 메모리 액세스 측면에서 알고리즘 복잡성을 추정하는 것이 더 유용합니까?" . 실용적인 관점에서 임베디드 시스템은 여전히 ​​메모리 대역폭이 아닌 FPU 속도에 의해 제한됩니다. 따라서 플롭 카운팅이 HPC 표준에 의해 폐기 된 것으로 간주 되더라도 다른 커뮤니티에서는 여전히 실용적입니다.
Damien

답변:


31

내가 할 수있는 (첫 번째 순서) 옳은 일을 내가 전화 알고리즘에 필요한 바이트 플롭의 비율, 봐 생각 . 하자 F가 있어요 X가 최대 플롭 프로세서의 속도,되고 B의 m X 최대 대역폭. 하면 F가 있어요 X를βFmaxBmax이면 알고리즘은 대역폭이 제한됩니다. 경우B의mXβ>F가있어요X를, 알고리즘은 한정 플롭이다.Fmaxβ>BmaxBmaxβ>Fmax

메모리 액세스 수를 세는 것이 필수적이라고 생각하지만 다음 사항도 고려해야합니다.

  • 필요한 로컬 메모리 양

  • 가능한 동시성

그런 다음 최신 하드웨어에 대한 알고리즘 분석을 시작할 수 있습니다.


3
β

2
데이비드는 8 년 전에 일을했습니다.
Matt Knepley

3
좋아, 그래서 더 나은, 더 복잡한 모델이 있습니다. 그러나이 모델은 기계 의존적 인 답변을 제공합니다. 학생들에게 첫 번째 분석으로 사용하도록 무엇을 가르쳐야합니까?
David Ketcheson

3
요점은 알고리즘과 마찬가지로 기계가 피크 수 대 피크 대역폭의 비율 인 단일 숫자로 감소했다는 것입니다. 이것은 얻는 것처럼 간단합니다. 계산 모델이 없으면 복잡도 추정이 쓸모가 없으며 이것이 가장 간단한 사실입니다.
Matt Knepley

1
나는 당신이 문제를 오해한다고 생각합니다. 우리는 이미 큰 짐을 실을 수있는 광학 운송 수단을 가지고 있습니다. 문제는 칩에 문제가 있다는 것입니다. 당신은 너무 많은 전선과 최고 클럭 속도가 있습니다. 광학 전송은 광학 칩에서이 문제를 완화 할뿐입니다.
Matt Knepley

22

O(N4)O(N)O(NlogN)O(N2)

더 넓은 관점에서, 알고리즘 성능의 분석은 "모두 포함"해야한다고 생각합니다. 사람들에게 실제 HPC 개발자 및 사용자가되도록 가르치는 경우 실제 프로그래밍 비용이 무엇인지 이해해야합니다. 우리가 프로그래머의 시간을 고려하지 않은 추상 분석 모델. 우리는 단지 플롭 카운트와 알고리즘 효율성보다는 "총 해결 시간"이라는 관점에서 생각해야합니다. 몇 백만 번의 계산을 계획하지 않는 한, 작업 당 1 초의 컴퓨터 시간을 절약 할 수있는 루틴을 다시 작성하는 데 3-4 일의 프로그래머가 소요되는 것이 타당하지 않습니다. 마찬가지로, 1 ~ 2 시간의 컴퓨팅 시간을 절약하기위한 며칠의 투자가 빠르게 효과를 발휘합니다. 이 새로운 알고리즘은 놀랍습니다.


7
O(NlogN)O(N2)

2
O(NlogN)O(N2)

9

다른 사람들이 지적했듯이 병목 현상이 CPU인지 메모리 대역폭인지에 따라 대답이 달라집니다. 임의 크기의 데이터 집합에서 작동하는 많은 알고리즘의 경우 병목 현상은 일반적으로 데이터 집합이 CPU 캐시에 맞지 않기 때문에 메모리 대역폭입니다.

또한 Knuth는 메모리 액세스 분석이 최신 CPU 파이프 라인 및 분기 예측의 복잡성에 비해 비교적 단순하기 때문에 (캐시 친 화성을 고려하더라도) 시간 테스트를 견뎌 낼 가능성이 높다고 언급합니다.

Knuth는 BDD 를 분석 할 때 TAOCP 의 Volume 4A에서 gigamems 라는 용어를 사용합니다 . 그가 이전 볼륨에서 사용하는지 확실하지 않습니다. 그는 2010 년 연례 크리스마스 트리 강의에서 시간 테스트에 대한 언급을했습니다.

흥미롭게도, 당신은 잘못하고 있음을 보여줍니다. 데이터가 물리적 RAM에 한 번에 맞지 않으면 VM 압력과 같은 요소가 작용하기 때문에 메모리 작업을 기반으로 한 성능 분석조차 항상 간단하지는 않습니다.


8

알고리즘 비용을 결정하는 방법은 작업하는 "컴퓨팅"의 "수준"과 고려할 문제의 범위에 따라 다릅니다.

캐시 최적화를 생각하면 BLAS 및 유사한 라이브러리와 같은 수치 선형 대수 패키지의 구현과 관련이 있습니다. 따라서 이것은 저수준 최적화에 속하며 특정 문제에 대한 고정 알고리즘이 있고 입력에 충분한 제약 조건이 있으면 좋습니다. 예를 들어, 캐시 최적화는 매트릭스가 충분히 희소 한 것으로 약속 될 경우 켤레 그라디언트 반복의 빠른 구현과 관련이있을 수 있습니다.

반면에 문제의 종류가 넓을수록 실제 컴퓨팅에 대한 예측이 적어집니다 (예를 들어 CG 구현의 입력 행렬이 얼마나 드문 지 알지 못함). 프로그램이 실행될 컴퓨터의 클래스가 넓을수록 캐시 아키텍처에 대한 예측이 줄어 듭니다.

또한 과학적 컴퓨팅 수준이 높을수록 문제 구조를 변경하는 것이 더 적합 할 수 있습니다. 예를 들어, 선형 방정식 시스템에 적합한 전제 조건을 찾는 데 시간을 투자하면 반복 횟수가 크게 줄어들 기 때문에 이러한 최적화는 일반적으로 모든 하위 수준 최적화보다 우선합니다.

결론적으로, 캐시 최적화는 병렬화 및 점근 수의 FLOP 수를 줄여 최적화 할 항목이없는 경우에만 유용합니다.

이론적 인 컴퓨터 과학의 입장을 채택하는 것이 현명하다고 생각합니다. 결국 알고리즘의 복잡성 향상은 기존의 일부 코드 라인의 미세 최적화보다 더 많은 수익을 가져옵니다. 따라서 FLOP 계수는 여전히 선호됩니다.


"캐시 최적화는 병렬 처리 및 점근 적 수의 FLOP 감소로 최적화 할 항목이없는 경우에만 유용합니다." 동의하지 않습니다. 많은 수의 큰 표현을 계산하려면 각 숫자의 모든 단계보다 모든 숫자로 한 번에 한 단계 씩 수행하는 것이 좋습니다. 둘 다 같은 수의 FLOPS를 갖지만 하나는 메모리 액세스에서 더 좋습니다. 캐시에 맞도록 묶음의 크기를 선택하면 보너스가 발생합니다 (또는 컴파일러가 자동으로 수행). 이것은 numexpr이 파이썬에서하는 일입니다 : github.com/pydata/numexpr
Davidmh

6

나는 항상 플롭, 메모리 액세스 또는 당신이 가지고있는 것을 계산하는 것을 거부했습니다. 그것은 당신이 한 일이 꽤 많이 주어 졌을 때 1960 년대의 개념이며, 당신이 한 일만이 알고리즘 최적화에 달려있었습니다. Jacobi 반복의 가우시안 제거를 사용하여 균일 한 xyz 메시에서 유한 요소 문제를 해결해보십시오.

이제이를 최적화하여 몇 번의 플롭을 저장하여 런타임의 10 %를 확보 할 수 있습니다. 또는 멀티 그리드 방법과 최적의 블록 전제 조건을 구현하여 런타임에서 10 배를 달성 할 수 있습니다. 이것이 우리가 학생들에게해야 할 일입니다. 더 복잡한 내부 알고리즘을 찾는 것보다 복잡한 외부 알고리즘이 어떤 이점을 얻을 수 있는지 생각해보십시오. 당신의 상사 (키)는 MHD 계산 과정 에서이 슬라이드를 분명히 지적합니다.


사실 저는 저수준 최적화가 아니라 당신이 제안하는 고수준 사고에 대해 묻고있었습니다. 멀티 그리드와 전제 조건이 다른 것보다 빠를 지 여부를 결정하기 위해 어떤 메트릭을 사용해야합니까?
David Ketcheson

수십 또는 수천 줄의 코드를 실행하는 복잡한 알고리즘에 대해 수작업으로 FLOPS 또는 기타 명령 수를 계산하는 방법을 모르겠습니다. 예를 들어 AMG 알고리즘의 분석 및 구성 단계가 얼마나 복잡한 지 생각해보십시오. 이 알고리즘에는 많은 부분이 있으며 모든 작업은 실제 데이터에 의존하므로 작업 수를 예측할 수 없습니다.
Wolfgang Bangerth

1
나는 처음에 당신이 무엇을 받고 있는지 오해하고 있다고 생각하지만, 나는 여전히 당신의 요점에 동의하지 않습니다. "외부 알고리즘"은 여전히 ​​점근 적 복잡성을 염두에두고 설계 될 수 있습니다. 확실히 2 차 알고리즘에서 니어 선형 알고리즘으로의 하락이 런타임에서 10 % 감소로 이어질 것이라고 주장하지는 않을 것입니다. 그러나 플롭 및 / 또는 메모리 -OP를 통한 것보다 점근 적 복잡성을 정량화하는 방법은 무엇입니까?
잭 폴슨

7
알고리즘에 대한 "손을 내밀어"접근하는 것은 쓰레기라고 생각합니다. 1 차 비용 만보고 모델을 단순화하여 해석을 단순화해야하지만 모델이 너무 복잡하여 MG 나 Cholesky와 같은 것은 분석 할 수 없습니다.
Matt Knepley

1
그러나 계산하는 모든 FLOP가 하이퍼 스레딩 된 프로세서, 캐시, 느린 RAM, 다중 스칼라 프로세서 및 자동 벡터화로 인해 발생하는 여러 대기 시간 계층 뒤에 숨겨져있을 때 MG 또는 Cholesky를 분석한다는 것은 무엇을 의미합니까? 내가하고있는 요점은 5-10의 요소 내에서 알고리즘의 타이밍을 더 이상 타이밍없이 더 이상 예측할 수 없다는 것입니다. 사람들이이 FLOP 카운팅을 시작했을 때 그것은 50 년대와 60 년대에 완전히 달랐습니다.
Wolfgang Bangerth

1

예, 쓸모 없습니다. 플롭 또는 다른 방법에 의한 알고리즘 분석은 현재 문제의 크기를 고려할 때 기계의 추상적 모델만큼 유용합니다. 실제 성능은 구현 및 하드웨어에 따라 달라지며, 후자의 실제 모델에 대한 적용 가능성은 시간이 지남에 따라 감소합니다. 예를 들어 분자 역학과 같은 복잡한 알고리즘의 구현을 더욱 병렬화 할 때 서로 다른 측면이 서로 다른 하드웨어에서 속도를 제한하며 알고리즘 분석은 관측과 아무런 관련이 없습니다. 어떤 의미에서, 유일한 중요한 것은 문제의 하드웨어 유형에 대한 알고리즘의 구현 성능을 측정하는 것입니다.

그러한 추상화는 학습 도구로 유용합니까? 예, 가르치는 데 사용되는 많은 모델과 마찬가지로 모델의 한계에 대한 이해와 함께 배치되는 한 유용합니다. 고전적인 역학은 거리가 좁거나 속도가 큰 스케일에서는 작동하지 않는다는 점을 알고 있다면 괜찮습니다 ...


-1

실제로 질문에 대답하는 것이 아니라 고려해야 할 다른 변수를 더 추가하는 것 : 고려해야 할 것은 프로그래밍 언어의 기능입니다. 예를 들어, 파이썬 sortTimsort 알고리즘을 사용합니다. Timsort 알고리즘은 다른 훌륭한 속성 중에서도 비교 횟수를 최소화하도록 설계되었으며, 파이썬 객체의 경우 잠재적으로 느려질 수 있습니다. 반면에 C ++에서 두 개의 부동 소수점을 비교하는 것은 빠르지 만 교환하는 데 비용이 많이 들기 때문에 다른 알고리즘 을 사용 합니다.

다른 예로는 동적 메모리 할당 (파이썬 목록에서는 간단하고 런타임과 개발자 시간 모두에서 빠르다 .append())과 FORTRAN 또는 C가 있습니다. 참조 파이썬은 빠른 FORTRAN보다.


이것은 사실이지만, 당신이 말하는 것처럼 질문에 대답하지 않습니다. 다른 주제에 관한 것입니다.
David Ketcheson

적절한 분석에서 구현할 알고리즘을 결정할 때 고려해야 할 사항입니다.
Davidmh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.