과학 소프트웨어는 튜닝이 필요한 것을 아는 한 다른 소프트웨어와 크게 다르지 않습니다.
내가 사용하는 방법은 무작위 일시 중지 입니다. 나를 위해 찾은 속도 향상의 일부는 다음과 같습니다.
log
and와 같은 함수에 많은 시간을 소비 exp
하면 해당 함수에 대한 인수가 호출되는 포인트의 함수로 무엇인지 알 수 있습니다. 종종 같은 주장으로 반복해서 부르고 있습니다. 그렇다면 메모를하면 엄청난 속도 향상 요소가 발생합니다.
BLAS 또는 LAPACK 함수를 사용하는 경우 배열 복사, 행렬 곱하기, 콜레 스키 변환 등의 루틴에 많은 시간이 소요될 수 있습니다.
어레이를 복사하는 루틴은 속도가 아니라 편의를위한 것입니다. 덜 편리하지만 더 빠른 방법이 있습니다.
행렬을 곱하거나 거꾸로 돌리거나 콜레 스키 변환을 수행하는 루틴에는 위쪽 또는 아래쪽 삼각형의 경우 'U'또는 'L'과 같은 옵션을 지정하는 문자 인수가있는 경향이 있습니다. 다시, 그것들은 편의상 존재합니다. 내가 찾은 것은 매트릭스가 크지 않았기 때문에 루틴은 옵션을 해독하기 위해 문자 를 비교 하기 위해 서브 루틴을 호출하는 데 절반 이상을 소비하고있었습니다 . 가장 비용이 많이 드는 수학 루틴의 특수 목적 버전을 작성하면 속도가 크게 향상되었습니다.
후자를 확장 할 수 있다면 행렬 곱셈 루틴 DGEMM은 LSAME를 호출하여 문자 인수를 해독합니다. "양호한"것으로 간주되는 포괄적 인 백분율 시간 (유일한 통계 가치)을 보면 80 %와 같은 총 시간의 일부를 사용하여 DGEMM을 표시하고 50 %와 같은 총 시간의 일부를 사용하여 LSAME를 표시 할 수 있습니다. 전자를 살펴보면 "잘 최적화해야하므로 그렇게 할 수있는 일은 많지 않다"고 말하고 싶은 유혹을받을 것이다. 후자를 보면, "어? 그게 다 뭐야? 그것은 아주 작은 일 과일뿐입니다.이 프로파일 러는 틀렸어 야합니다!"라고 말하고 싶을 것입니다.
그것은 틀린 것이 아니며, 당신이 알아야 할 것을 말하지 않습니다. 무작위로 일시 중지하는 것은 DGEMM이 스택 샘플의 80 %에 있고 LSAME가 50 %에 있다는 것입니다. (그것을 탐지하기 위해 많은 샘플이 필요하지 않습니다. 10은 일반적으로 충분합니다.) 또한, 많은 샘플에서 DGEMM은 몇 가지 다른 코드 라인에서 LSAME 를 호출 하는 중입니다.
이제 두 루틴이 왜 그렇게 많은 시간을 소비 하는지 알고 있습니다. 또한 코드 내 에서이 모든 시간을 보내기 위해 어디에서 호출 되는지 알고 있습니다. 그래서 나는 무작위로 일시 중지를 사용하고 프로파일 러가 얼마나 잘 만들어 졌는지에 대한 황달 한 견해를 취합니다. 진행 상황을 알려주는 것보다 측정을 얻는 데 더 관심이 있습니다.
수학 라이브러리 루틴이 n 도로 최적화되었다고 가정하기는 쉽지만 실제로는 광범위한 목적으로 사용할 수 있도록 최적화되었습니다. 추정하기 쉬운 것이 아니라 실제로 진행되고 있는 것을 볼 필요 가 있습니다.
추가 : 마지막 두 가지 질문에 대답하십시오.
가장 먼저 시도해야 할 것이 무엇입니까?
10-20 개의 스택 샘플을 가져 와서 요약하지 말고 각 샘플이 무엇을 말하는지 이해하십시오. 먼저, 마지막, 중간에 수행하십시오. (젊은 Skywalker는 "시도"가 없습니다.)
얼마나 많은 성능을 얻을 수 있는지 어떻게 알 수 있습니까?
xβ(s+1,(n−s)+1)sn1/(1−x)n=10s=5x
xx
전에 말씀 드렸듯이 더 이상 할 수 없을 때까지 전체 절차를 반복 할 수 있으며 복합 속도 향상 비율이 상당히 클 수 있습니다.
(s+1)/(n+2)=3/22=13.6%.) 다음 그래프에서 아래쪽 곡선은 분포입니다.
우리가 40 개나되는 샘플을 한 번에 가져 왔고 그중 2 개에서만 문제가 발생했는지 생각해보십시오. 더 큰 곡선에서 볼 수 있듯이 해당 문제의 예상 비용 (모드)은 5 %입니다.
"거짓 긍정적"이란 무엇입니까? 문제를 해결하면 예상보다 적은 이익을 실현하고 문제를 해결 한 것을 후회할 수 있습니다. 곡선은 (문제가 "작은"경우) 이득 이 그것을 보여주는 샘플의 비율보다 작을 수 있지만 평균적으로 더 클 것임을 보여줍니다.
훨씬 더 심각한 위험이 있습니다- "거짓 부정적인". 그때 문제가 있지만 찾을 수 없습니다. (기여의 부재가 부재의 증거로 취급되는 경향이있는 "확인 편향"이다.)
당신이 프로파일 러 (좋은)에 도착하면 문제가 실제로 무엇인지에 대해 훨씬 덜 정확한 정보의 비용으로 훨씬 더 정확한 측정 (오 탐지하여 적은 기회)를 얻을 수있다 이다 (그것을 발견하고 점점 따라서 적은 기회 모든 이득). 이는 달성 할 수있는 전체 속도 향상을 제한합니다.
프로파일 러 사용자가 실제로 속도 향상 요소를보고하도록 권장합니다.
다시 만들어야 할 또 다른 요점이 있습니다. 오 탐지에 대한 페드로의 질문.
그는 고도로 최적화 된 코드에서 작은 문제를 해결할 때 어려움이있을 수 있다고 언급했습니다. (나에게 작은 문제는 총 시간의 5 % 이하를 차지하는 문제입니다.)
5 %를 제외하고는 완전히 최적 인 프로그램을 구성하는 것이 전적으로 가능하므로이 답변 에서처럼 경험적으로 만 해결할 수 있습니다 . 경험적 경험을 일반화하기 위해 다음과 같이 진행됩니다.
작성된 프로그램에는 일반적으로 최적화 기회가 여러 개 있습니다. (이를 "문제"라고 부를 수 있지만 종종 완벽하게 좋은 코드이며, 상당히 개선 될 수 있습니다.)이 다이어그램은 시간이 오래 걸리는 인공 프로그램 (100 초)을 보여 주며 문제 A, B, C, ... 발견 및 고정시 원래 100 대 30 %, 21 % 등을 절약 할 수 있습니다.
문제 F는 원래 시간의 5 %를 소비하므로 "소형"이며 40 개 이상의 샘플이 없으면 찾기가 어렵습니다.
그러나 처음 10 개의 샘플은 문제 A를 쉽게 찾을 수 있습니다. ** 문제가 해결되면 100/70 = 1.43x의 속도로 70 초만 걸립니다. 그것은 프로그램을 더 빠르게 만들뿐만 아니라 나머지 문제에 의해 취해진 비율을 그 비율로 확대합니다. 예를 들어 문제 B는 원래 총 21 % 인 21 초를 사용했지만 A를 제거한 후 B는 70 초에서 21 초 또는 30 %를 차지하므로 전체 프로세스가 반복되는시기를 찾기가 더 쉽습니다.
프로세스가 5 번 반복되면 실행 시간은 16.8 초이며, 그 중 문제 F는 5 %가 아닌 30 %이므로 10 개의 샘플이 쉽게 찾을 수 있습니다.
그게 요점입니다. 경험적으로 프로그램에는 크기 분포가있는 일련의 문제가 있으며 발견 및 수정 된 문제로 인해 나머지 문제를 쉽게 찾을 수 있습니다. 이를 달성하기 위해, 시간이 걸리고, 총 속도를 제한하며, 나머지 문제를 확대하지 못하기 때문에 문제가 발생하면 건너 뛸 수 없습니다.
그래서 숨어 있는 문제를 찾는 것이 매우 중요합니다 .
문제 A에서 F까지 발견되고 수정되면 속도는 100 / 11.8 = 8.5x입니다. 둘 중 하나를 놓치면 (예 : D) 속도는 100 / (11.8 + 10.3) = 4.5x에 불과합니다.
그것이 거짓 부정에 대한 대가입니다.
따라서 프로파일 러가 "여기에 중요한 문제는없는 것 같습니다"(예 : 좋은 코더, 이것은 실제로 최적의 코드 임)라고 말하면 맞을 수도 있고 아닐 수도 있습니다. ( 거짓 부정 .) 다른 프로파일 링 방법을 시도하고 있음을 발견하지 않으면 더 빠른 속도로 해결할 문제가 더 있는지 확실하지 않습니다. 필자의 경험에 따르면, 프로파일 링 방법에는 요약 된 많은 수의 샘플이 아니라 적은 수의 샘플이 필요합니다. 여기서 각 샘플은 최적화 기회를 인식 할 수있을만큼 충분히 이해됩니다.
2/0.3=6.671 - pbinom(1, numberOfSamples, sizeOfProblem)
1 - pbinom(1, 20, 0.3) = 0.9923627
xβ(s+1,(n−s)+1)nsy1/(1−x)xyy−1BetaPrime 배포. 이 동작에 도달하여 2 백만 개의 샘플로 시뮬레이션했습니다.
distribution of speedup
ratio y
s, n 5%-ile 95%-ile mean
2, 2 1.58 59.30 32.36
2, 3 1.33 10.25 4.00
2, 4 1.23 5.28 2.50
2, 5 1.18 3.69 2.00
2,10 1.09 1.89 1.37
2,20 1.04 1.37 1.17
2,40 1.02 1.17 1.08
3, 3 1.90 78.34 42.94
3, 4 1.52 13.10 5.00
3, 5 1.37 6.53 3.00
3,10 1.16 2.29 1.57
3,20 1.07 1.49 1.24
3,40 1.04 1.22 1.11
4, 4 2.22 98.02 52.36
4, 5 1.72 15.95 6.00
4,10 1.25 2.86 1.83
4,20 1.11 1.62 1.31
4,40 1.05 1.26 1.14
5, 5 2.54 117.27 64.29
5,10 1.37 3.69 2.20
5,20 1.15 1.78 1.40
5,40 1.07 1.31 1.17
(n+1)/(n−s)s=ny
이것은 5, 4, 3, 2 개의 샘플 중 2 개의 적중에 대한 속도 향상 요인의 분포와 그 평균의 도표입니다. 예를 들어, 3 개의 샘플이 수집되고 그 중 2 개가 문제에 부딪 히고 해당 문제를 제거 할 수있는 경우 평균 속도 향상 요소는 4 배가됩니다. 2 개의 적중이 2 개의 샘플에서만 보이는 경우, 무한 루프를 가진 프로그램이 0이 아닌 확률로 존재하기 때문에 평균 속도가 정의되지 않습니다!