Callgrind로 CFD 코드 프로파일 링


16

Valgrind + Callgrind를 사용하여 내가 작성한 솔버를 프로파일 링하고 있습니다. Valgrind 사용자 매뉴얼에서 알 수 있듯이 컴파일러의 디버깅 옵션으로 코드를 컴파일했습니다.

"디버깅 정보 없이는 Valgrind 도구를 사용하여 수행 할 수있는 가장 좋은 기능은 특정 코드가 속하는 기능을 추측하는 것입니다. 이로 인해 오류 메시지와 프로파일 링 출력이 거의 쓸모 없게됩니다. -g를 사용하면 관련 소스 코드 줄 "

발 그린 드 매뉴얼

디버깅 옵션으로 컴파일하면 코드가 훨씬 느리게 실행됩니다. CFD 코드는 디버깅 플래그로 컴파일 할 때 작은 경우에도 매우 느려집니다. Valgrind는 40 배 느리게합니다 (설명서 1 참조 ).

  1. 코드 프로파일 링을 위해 어떤 도구를 사용하고 있습니까 (벤치마킹이 아닌 프로파일 링)?

  2. 코드를 얼마나 오래 실행할 수 있습니까 (통계 : 시간 단계 수)?

  3. 사례가 얼마나 큰가?


3
디버깅 심볼과 최적화를 모두 사용하여 코드를 컴파일 할 수 있습니다. 여전히 모든 메모리 액세스를 시뮬레이트하는 valgrind의 40 배는 불합리한 것이 아닙니다.
Aron Ahmadia 2019

감사합니다. 이것은 내가 읽은 것입니다 ... 알고 싶은 것은 매일 프로파일 링 프로파일 링 경험에 대한 정보입니다 (가급적이면 바람직합니다) : 보고서를 기다리는 데 얼마나 많은 시간이 걸리는지, 반복 횟수는 얼마입니까? 카운트 필요, 제외 할 수있는 ... 등 ...
tmaric

귀하의 질문도 약간 광범위합니다. Q1은 완전히 다른 질문이므로 질문을 편집하여 Q2.1과 Q2.2에 중점을 두는 것이 좋습니다. 별도로 질문하는 것이 좋으며 좋은 질문이지만 "어떤 도구를 사용 하시겠습니까? 문제 X "를 해결하기 위해 사용하십시오. 여기서 X는 잘 설명되어 있습니다!) 반면 Q2 자체는 너무 일반적입니다.
Aron Ahmadia 2019

당신은 또한 이름을 편집 할 수 있습니다 callgrind, cachegrind또는 massif. 많은 사람들이 Valgrind를 기본 도구 ( memcheck) 에만 연결 합니다. 인터럽트 기반이 아닌 에뮬레이션 기반 프로파일 링 시스템으로 오랫동안 실행하지 않아도됩니다.
Jed Brown

@Aron & Jed : 팁 주셔서 감사합니다. 질문을 편집했습니다. :)
tmaric

답변:


11

Q1 : 코드 프로파일 링을 위해 어떤 도구를 사용하고 있습니까 (벤치마킹이 아닌 프로파일 링)?

Q2 : 코드를 얼마나 오래 실행할 수 있습니까 (통계 : 시간 단계 수)?

Q3 : 케이스가 얼마나 큰가?

내가하는 방법의 예는 다음과 같습니다.

벤치마킹 (시간이 얼마나 걸리는지 확인)과 프로파일 링 (빠르게 만드는 방법 식별)을 분리했습니다. 프로파일 러가 빠르다는 것은 중요하지 않습니다. 수정해야 할 사항을 알려주는 것이 중요합니다.

"프로파일 링"이라는 단어는 마음에 들지 않습니다. 히스토그램과 같은 이미지를 활용하기 때문입니다. 각 루틴에 대한 비용 막대가 있거나 "병목 현상"은 코드에 약간의 위치가 있어야 함을 의미하기 때문에 결정된. 이 두 가지 모두 일종의 타이밍과 통계를 의미하며 정확도가 중요하다고 가정합니다. 타이밍의 정확성에 대한 통찰력을 포기할 가치가 없습니다.

내가 사용하는 방법은 무작위 일시 중지이며 여기에 전체 사례 연구 및 슬라이드 쇼가 있습니다 . 프로파일 러 병목 세계관의 일부는 아무것도 찾지 못하면 찾을 것이 없으며, 무언가를 찾아 일정 퍼센트의 속도를 올리면 승리를 선언하고 종료한다는 것입니다. 프로필러 팬은 속도를 얼마나 높이는지 거의 말하지 않으며 광고는 쉽게 찾을 수 있도록 인위적으로 고안된 문제 만 표시합니다. 무작위 일시 중지는 쉽고 어려운 문제를 찾습니다. 그런 다음 하나의 문제를 해결하면 다른 문제가 드러나므로 프로세스를 반복하여 속도를 높일 수 있습니다.

수많은 예제에서 얻은 경험에 따르면 다음과 같습니다. 무작위로 일시 중지하여 한 가지 문제를 찾아서 고칠 수 있습니다 (예 : 30 % 또는 1.3x). 그런 다음 다시 할 수 있고 다른 문제를 찾아서 고칠 수 있습니다. 다른 속도 향상, 아마도 30 % 미만, 더 많을 수도 있습니다. 그런 다음 다시 고칠 다른 것을 찾을 수 없을 때까지 여러 번 다시 할 수 있습니다. 궁극적 속도 향상 요소는 개별 요소의 실행 결과이며 놀랍게도 큰 경우가 있습니다.

삽입 :이 마지막 요점을 설명하기 위해. 슬라이드 쇼와 모든 파일 이 포함 된 자세한 예제가 여기 있으며 일련의 문제 제거에서 730x의 속도 향상을 달성 한 방법을 보여줍니다. 첫 번째 버전은 작업 단위당 2700 마이크로 초가 걸렸습니다. 문제 A가 제거되어 시간이 1800으로 줄어들고 남은 문제의 비율이 1.5 배 (2700/1800)로 확대되었습니다. 그런 다음 B가 제거되었습니다. 이 프로세스는 6 번의 반복으로 계속되어 거의 3 배의 속도가 향상되었습니다. 그러나 프로파일 링 기술은 실제로 효과적이어야합니다. 왜냐하면 그러한 문제가 발견되지 않으면, 즉 더 이상 할 수있는 일이 잘못되었다고 생각되면 프로세스가 중단되기 때문입니다.

큰 속도 향상을 위해 여러 문제 제거에 대한 설명

삽입 : 다른 방법으로 말하면, 연속적인 문제가 제거 될 때의 총 속도 향상 요소에 대한 그래프는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

Q1의 경우 간단한 타이머를 벤치마킹하면 충분합니다. "프로파일 링"을 위해 임의 일시 정지를 사용합니다.

Q2 : 충분한 워크로드를 제공하거나 주변에 루프를 배치하여 일시 정지 할 정도로 오래 실행됩니다.

Q3 : 캐시 문제를 놓치지 않도록 사실적으로 큰 작업 부하를 제공하십시오. 메모리 가져 오기를 수행하는 코드에서 샘플로 표시됩니다.


Mike, 비주얼 IDE가 없을 때 무작위로 일시 정지하는 방법을 선호합니까? 이 프로세스를 어떤 방식으로 자동화 할 수 있습니까?
Matthew Emmett

@ Matthew : pstackand와 같은 도구가 있다는 것을 알고 lsstack있지만 실제로 디버깅과 공통적 인 프로세스라고 생각합니다. 따라서 내가 가질 수있는 가장 좋은 디버거가 일지라도 gdb완료됩니다. 디버거를 사용하면 데이터를 검사 할 수 있으며 스택만으로는 충분하지 않은 경우 차이를 만들 수 있습니다.
Mike Dunlavey 2016 년

9

가난한 사람의 프로파일 러는 기본적입니다 gdb스크립트 샘플이 호출 스택. 여전히 디버깅 심볼이 있어야합니다. 여전히 느리지 만 코드를 실행하기 위해 가상 머신을 구현하지 않기 때문에 종종 callgrind작업 보다 빠르며 적절합니다.

나는 입자 물리 분석기에서 약간의 성공을 거두었습니다 (즉, 코드 끔찍한 핫 스팟 이 아니며 최적화에 더 나은 알고리즘이 필요 하다는 것을 보여주었습니다 ).


1
+ 증거의 부재는 부재의 증거가 아닙니다. : 가난한 사람의 프로파일 러가해야 할 일은 추적을 줄이고 축소하지는 않지만, 보도록하는 것입니다. 인간의 눈은 단순한 기능 시간 추정치보다 유용한 패턴을 감지하는 데 훨씬 뛰어나며, 2 개의 샘플로 개선 할 수있는 것이 있다면 크게 도움이 될 것입니다. 저장되는 분수 X는 모드 2 / N의 베타 분포입니다. 여기서 N은 검사 한 트레이스 수이며 속도 향상 요소는 1 / (1-X)이며 이는 클 수 있습니다.
Mike Dunlavey

2

사용 가능한 훌륭한 답변을 추가하기 위해 Rice에서 개발 된 도구는 스택 샘플링을 자동화하므로 오버 헤드가 거의 없습니다.

http://hpctoolkit.org/


그래도 괜찮아 보입니다 (죄송합니다) 불꽃 모자를 여기에 썼습니다. 맹 글링 된 코드에서 무슨 일이 일어나고 있는지 알기가 어렵 기 때문에 컴파일러 최적화 코드를 튜닝하지 않습니다. 잘라내는 것은 호출 explog동일한 인수를 반복적으로 호출 하는 것과 같은 옵티마이 저가 처리 할 수있는 것이 아니며 매트릭스 연산이 모든 시간 디코딩 옵션을 소비합니다. 가능한 한 튜닝 한 다음 -O3을 켭니다.
Mike Dunlavey

도구는 도구이며 사용자가 자신의 한계를 알고 이해하는 경우에만 유용합니다. 나는 출력을 이해하고 정보를 사용하는 방법을 아는 것과 관련하여 방정식에서 사용자를 완전히 제거하는 "완벽한 프로파일 러"가 없을 것이라고 생각합니다.
Reid. Atcheson

1

Allinea MAP 은 상업적으로 개발 및 지원되는 샘플링 프로파일 러이므로 이전 답변에서 제안한 HPC 툴킷과 같이 원하는 경우 프로덕션 규모의 작업에서 실행할 수 있습니다.

이러한 종류의 도구는 CPU 병목 현상 또는 MPI 통신 불량을 나타내며 전체 작업을 프로파일 링하는 데 대한 전체적인 감독은 놀라운 문제를 찾는 데 많은 비용이들 수 있습니다.

예상치 못한 영역에서 CFD 코드의 핵심 커널 외부에 성능 저하가 자주 발생합니다. 무작위 스택 샘플링은 GDB를 사용하여 수동으로 수행하든 HPC 툴킷 및 Allinea MAP와 같은 도구를 사용하여 수행하든 최상의 방법입니다. 성능에 중요한 것이 있으면 표시됩니다.

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