2010-12-22 5 views
3

AMD와 Intel의 최신 CPU는 대부분 rdtsc를 일정 속도 카운터로 구현하여 TurboBoost 또는 절전 설정과 같은 결과로 인해 주파수가 변경되는 문제를 방지합니다.RDTSC가 일정 속도 카운터 값을 반환하는지 여부를 감지하는 방법은 무엇입니까?

rdtsc는 오버 헤드가 매우 낮기 때문에 QueryPerformanceCounter보다 성능 측정에 훨씬 적합하므로 가능한 경우 언제든지 사용하고 싶습니다.

rdtsc가 일정 속도 카운터인지 여부를 어떻게 안정적으로 감지 할 수 있습니까?

답변

7

CPUID을 사용하면 말할 수 있습니다. the docs에서 CPUID에 Fn8000_0007_EDX 8 비트 :

TscInvariant : TSC 불변합니다. TSC 비율은 모든 P- 주, C- 주 및 불허가 전환 (STPCLK 스로틀 링 등)에서 불변으로 보장됩니다. 따라서 TSC는 시간의 원천으로 사용하기에 적합합니다. 0 = 그러한 보증이 이루어지지 않으며 소프트웨어는 TSC를 시간의 근원으로 사용하려고 시도하지 않아야합니다.

+0

좋습니다. 인텔을 위해 일하는 것 같습니다 : http://stackoverflow.com/questions/3388134/rdtsc-accuracy-across-cpu-cores/4145156#4145156 – Suma

+0

여기에 문제는 동적 클럭이 활성화되어 있으면 작업이 실행할 시간. 따라서 rdtsc 레지스터 증가가 시계 자체에 의해 영향을받지 않더라도 작업을 실행하는 데 필요한 시간은 클럭 속도의 영향을받습니다. –

-1

generation of the CPU을 감지하려면 CPUID을 사용하고, 상수 카운터를 사용하는지 확인하십시오. 그러나 프로파일 링 API를 사용하는 것이 좋습니다. AMD의 codeanalyst SDK와 같은 것이 좋습니다.

-1

초당 틱 수를 계산 한 다음/proc/cpuinfo의 정보 클럭과 비교합니다. 동적 클럭이 비활성화 된 경우에만 작동합니다. 출처 : https://github.com/petersenna/rdtscbench

0

원래 질문 이후로 오랜 시간을 알고 있지만 프로세서의 생성/모델을 확인하는 것이 절대적으로 잘못된 것이라고 지적 할 수 있습니다. 우선, 코드가 잘못되어 다음 세대 프로세서에서는 작동하지 않으므로 (가족/모델 번호가 항상 "선형"이 아니기 때문에) 매우 쉽습니다. 둘째, 프로세서가 "나중에 가족/모델 "이라고 말하면서이 기능이 작동한다는 것을 보장하지는 않습니다. 필자도 그렇지만 코드를 많이 보아서 "새로운 프로세서가 나오고 코드가 잘못 처리됩니다".

CPUID 비트를 사용하여 프로세서의 비트가 올바른지 확인하십시오.

관련 문제