2009-02-22 5 views
8

C에서 매우 짧은 연산을위한 마이크로 벤치마킹 코드를 작성 중입니다. 예를 들어, 인수의 수에 따라 빈 함수를 호출하는 데 필요한 사이클 수가 얼마나되는지 측정하고 있습니다.인텔 코어 2 듀오의 명령 파이프 라인을 배제 하시겠습니까?

현재 RDTSC 명령을 사용하여 각 작업 전후에 CPU주기 수를 얻으려고합니다. 그러나 첫 번째 RDTSC 이전에 발급 된 지침에 따라 실제 지침이 느려질 수 있습니다. 두 번째 RDTSC가 발행되기 전에 전체 작업이 완료되지 않을 수도 있습니다.

새로운 명령을 내리기 전에 모든 기내 지시 사항을 강제 실행하는 x86 명령을 아는 사람이 있습니까? 나는 CPUID가 이것을 할 수 있다고 들었지만, 그렇게 말하는 문서를 찾을 수 없었다.

답변

9

내 지식으로는 특별히 파이프 라인을 "소모"시키는 지시가 없습니다. 이것은 직렬화 명령을 사용하여 쉽게 수행 할 수 있습니다.

CPUID는 사용자가 찾고있는 것을 정확히 나타내는 직렬화 명령입니다. CPUID 명령 전에 실행되도록 보장되기 전에 모든 명령이 발행됩니다.

그래서 다음을 수행하면 원하는 효과를 얻을해야합니다 여담으로,

cpuid 
rdtsc 
# stuff 
cpuid 
rdtsc 

을, 나는이 작업을 수행하지 않는 것이 좋습니다. "물건"은 여전히 ​​CPU 캐시, 시스템에서 실행중인 다른 프로세스 등과 같이 사용자가 제어 할 수없는 많은 다른 것들에 의해 영향을받을 수 있으며 모든 것을 제거 할 수는 없습니다. 정확한 성능 통계를 얻는 가장 좋은 방법은 측정하려는 작업을 적어도 수백만 번 수행하고 배치의 실행 시간을 평균화하는 것입니다.

편집 : 대부분의 CPUID 명령 참조는 NASM manual appendix B과 같은 직렬화 속성을 언급합니다.

편집 2 : this related question을 살펴볼 수도 있습니다.

+1

당신은 울타리 지침에 대한 권리입니다. CPUID 실제로 그들을 암시합니다 (나는 그것에 대한 내 대답을 삭제했습니다). CPUID가 직렬화되는 동안 캐시를 지우지 않아 성능에 영향을 미칠 수 있습니다. 캐시는 WBINVD로 지울 수 있습니다. 응답에 추가하고 싶을 수도 있습니다. –

+0

wbinvd 권한이 ... 당신은 clflush를 사용할 수 있습니다. 지난 주부터 그런 종류의 질문에 대한 별도의 질문이 .... http://stackoverflow.com/questions/558848/can-iforce-cache-coherency-on-a-multicore-x86-cpu/558900# 558900 – SoapBox

+0

좋은 답변입니다. 고맙습니다. –

관련 문제