5.3.2. Cachegrind로 캐시 사용량 프로파일링
Cachegrind는 시스템의 캐시 계층 및 (옵션으로) 분기 예측과 프로그램의 상호 작용을 시뮬레이션합니다. 이는 시뮬레이션된 첫 번째 레벨의 지시 사항 및 데이터 캐시 사용을 추적하여 이러한 캐시 레벨과 상호 작용한 불충분한 코드를 감지하고 마지막 레벨 캐시 (이것이 두 번째 또는 세 번째 레벨 캐시이던지 간에)에서 메인 메모리로의 액세스를 추적합니다. 결과적으로 Cachegrind와 함께 실행되는 프로그램은 일반적으로 실행되는 것 보다 20-100배 더 느리게 실행됩니다.
Cachegrind를 실행하려면 다음과 같은 명령을 실행합니다. 여기서 program은 Cachegrind로 프로파일링하고자 하는 프로그램으로 대체합니다.
# valgrind --tool=cachegrind program
Cachegrind는 전체 프로그램에서 그리고 프로그램에 있는 각 기능에 대해 다음과 같은 통계를 수집할 수 있습니다:
- 첫 번째 레벨 지시 캐시 읽기 (또는 실행된 명령) 및 읽기 미스, 마지막 레벨 지시 캐시 읽기 미스;
- 데이터 캐시 읽기 (또는 메모리 읽기), 읽기 미스, 마지막 레벨 캐시 데이터 읽기 미스;
- 데이터 캐시 쓰기 (또는 메모리 쓰기), 쓰기 미스 및 마지막 레벨 캐시 쓰기 미스
- 실행 및 잘못 예측된 조건 분기
- 실행 및 잘못 예측된 간접 분기
Cachegrind는 이러한 통계에 대한 요약 정보를 콘솔에 인쇄하고 파일에 보다 자세한 프로파일링 정보를 씁니다 (기본값으로
cachegrind.out.pid
, 여기서 pid는 Cachegrind를 실행하는 프로그램의 프로세스 ID입니다). 이러한 파일은 다음과 같이 cg_annotate 도구로 추가 처리할 수 있습니다:
# cg_annotate cachegrind.out.pid
참고
cg_annotate는 경로의 길이에 따라 120 자 보다 긴 행을 출력할 수 있습니다. 출력을 명확하게 하고 읽기 쉽게하려면 위의 명령을 실행하기 전 창을 적어도 이 폭으로 확대하는 것이 좋습니다.
또한 Cachegrind에 의해 생성된 프로파일 파일을 비교하여 변경 전 후의 프로그램 성능을 쉽게 도표로 만들 수 있습니다. 이를 위해 cg_diff 명령을 사용합니다. 여기서 first는 초기 프로파일 출력 파일로 second는 후속 프로파일 출력 파일로 바꿉니다:
# cg_diff first second
이 명령은 결합된 출력 파일을 생성하며, 보다 자세한 내용은 cg_annotate를 사용하여 확인할 수 있습니다.
Cachegrind는 출력에 초점을 두는 옵션을 지원합니다. 사용 가능한 옵션 중 일부는 다음과 같습니다:
--I1
- 콤마로 구분하여 첫 번째 레벨 지시 캐시의 크기, 연결성, 행의 크기를 지정합니다:
--I1=size,associativity,line size
. --D1
- 콤마로 구분하여 첫 번째 레벨 데이터 캐시의 크기, 연결성, 행의 크기를 지정합니다:
--D1=size,associativity,line size
. --LL
- 콤마로 구분하여 마지막 레벨 캐시의 크기, 연결성, 행의 크기를 지정합니다:
--LL=size,associativity,line size
. --cache-sim
- 캐시 액세스 및 미스 카운트의 모음을 활성화 또는 비활성화합니다. 기본값은
yes
(활성화)입니다.이 옵션 및--branch-sim
모두를 비활성화하면 Cachegrind에는 수집할 정보가 없게 됨에 유의합니다. --branch-sim
- 분기 지시 및 예측 실패 수의 모음을 활성화 또는 비활성화합니다. 이는 Cachegrind를 약 25% 느리게 할 수 있으므로 기본값은
no
(비활성화)로 설정되어 있습니다.이 옵션 및--cache-sim
모두를 비활성화하면 Cachegrind에는 수집할 정보가 없게 됨에 유의합니다.
옵션의 전체 목록은
/usr/share/doc/valgrind-version/valgrind_manual.pdf
에 있는 문서에서 참조하십시오.