2011-07-31 3 views
13

이것은 내가 요구하는 것입니다. 특정 알고리즘이 캐시를 잘 사용하고, 어떤 알고리즘은 특정 데이터 세트에서 다른 것보다 I/O를 더 많이합니다. 나는 그것을보고 분석하고 싶다.C/C++ 프로그램의 캐시 히트/미스

그래서 특정 메모리/변수가 읽히는 방식을 알 수있는 방법이 있는지 궁금 해서요. 즉 캐시에서 가져온 것이거나 캐시 미스가있는 것입니다. 또한이 값을 검색하는 동안 페이지 오류가있는 경우

고마워요!

+1

당신 이이 질문에 관심이있을 수 있습니다 : http://stackoverflow.com/questions/3052776/how-to-detect-cache-misses-from-users-codes –

답변

7

캐시가 언제 치고 있는지 알고 싶으면 현대 프로세서에이 용도로 사용할 수있는 성능 카운터가 있습니다. 나는 그들을 학술 연구에 광범위하게 사용했다. 가장 쉬운 방법은 perfmon2입니다. Perfmon2에는 프로그램에 링크 할 수있는 라이브러리 나 기존 프로그램을 모니터링하는 독립 실행 형 프로그램이 있습니다. this document (PDF)의

참고로
pfmon -eL1D_CACHE_LD:MESI,L1D_CACHE_LD:I_STATE your_program 

, 부록 A 사용할 수있는 하드웨어 카운터에 인텔의 문서를 나열 예를 들어, 다음은 모든 레벨 1 데이터 캐시 읽기 요청과 미스를 기록 독립 실행 형 프로그램입니다.

0

특정 컴파일러, OS 및 실행중인 프로세서의 특정 모델에 따라 다릅니다. C/C++ 언어로는 (내가 알고있는) 아무것도 캐시 수준에서 무슨 일이 일어나고 있는지 알 수 없습니다.

다양한 측정 도구가 있지만 언어와 크게 관련이 없습니다.

캐시 및 페이징 문제를 최소화하기위한 몇 가지 "규칙"이 있지만 합리적으로 포괄적 인 목록을 생각하는 데 다소 시간이 걸립니다.

4

나는 valgrind cachegrind tool을 사용해 보겠다. 주석이 달린 소스 라인을 그 라인의 캐시에있는 히트 수/미스 수와 함께 출력 할 수있다.

+0

그 cachegrind 캐시 미스는 실제되지 않습니다 캐시 미스가 있지만 시뮬레이션 된 것입니다. – osgx

1

AMD CodeAnalyst가 해당 레벨을 표시 할 수 있는지는 잘 모르지만 확인하는 것이 좋을 것 같습니다.

+0

Intel 플랫폼에서 AMD CodeAnalyst가 약간 제한적이지만 (기본 기능이 작동합니다). 따라서 Intel의 경우 Intel Vtune이 있습니다. 리눅스 oprofile/perf/perfmon2. – osgx

관련 문제