Cómo detectar si RDTSC devuelve un valor de contador de velocidad constante?
Pregunta
Parece la mayoría de los nuevos procesadores de AMD e Intel aplicar RDTSC como un contador de velocidad constante, evitando los problemas causados ??por el cambio de frecuencia como resultado de cosas como la configuración de ahorro de energía o función turbo.
Como RDTSC es mucho más adecuado para mediciones de rendimiento que QueryPerformanceCounter debido a su mucho menos gastos generales, me gustaría utilizar siempre que sea posible.
¿Cómo puedo detectar de forma fiable si el RDTSC es un contador de velocidad constante o no?
Solución
Se puede utilizar CPUID
decirle. De los documentos en CPUID Fn8000_0007_EDX bit 8:
TscInvariant: TSC invariante . La tasa de TSC está garantizada para ser invariantes en todos los P-Unidos, C-Unidos, y las transiciones de parada de subvención (tales como STPCLK Throttling); por lo tanto, el TSC es adecuado para su uso como una fuente de tiempo. 0 = No existe tal garantía se hace y se debe evitar el software de intentar utilizar el TSC como fuente de tiempo.
Otros consejos
Sé que es mucho tiempo que la pregunta original se le pidió, pero puede que acabo de señalar que el control de la generación / modelo del procesador es absolutamente lo peor que puede hacer. En primer lugar, es muy fácil conseguir el mal código para que no funciona en procesadores de la generación futura (debido a que los números de la familia / modelo no son siempre "lineal"), y en segundo lugar, sólo porque un procesador es "una tarde familia / modelo" que las que usted sabía esto funciona en, no es una garantía de que la función está allí. Es probable, pero he visto un montón de código que hace este mal, y por lo tanto "nuevo procesador sale, y el código obtiene cosas mal".
Utilice el CPUID poco para comprobar si el procesador tiene el bit correcto o no.
El uso justo CPUID
para detectar la generación href="http://en.wikipedia.org/wiki/Time_Stamp_Counter" de la CPU , ver si su uso de contadores constantes. Sin embargo me gustaría, sugerir el uso de una API de perfiles de lugar, sin embargo, algo así como SDK CodeAnalyst de AMD haría bien
hago contar el número o las garrapatas en un segundo y luego comparar con el reloj informado en / proc / cpuinfo. Sólo funciona con el reloj dinámico desactivado. Ver la fuente: https://github.com/petersenna/rdtscbench