2009-02-22 15 views
8

Escribo un código de micro-benchmarking para algunas operaciones muy cortas en C. Por ejemplo, una cosa que estoy midiendo es cuántos ciclos se necesitan para llamar a una función vacía dependiendo de la cantidad de argumentos pasados.¿Vaciar la tubería de instrucciones de Intel Core 2 Duo?

Actualmente estoy programando el uso de una instrucción RDTSC antes y después de cada operación para obtener el conteo cíclico de la CPU. Sin embargo, me preocupa que las instrucciones emitidas antes del primer RDTSC puedan ralentizar las instrucciones reales que estoy midiendo. También me preocupa que la operación completa no esté completa antes de que se emita el segundo RDTSC.

¿Alguien sabe de una instrucción x86 que obliga a todas las instrucciones en vuelo a confirmar antes de que se emitan nuevas instrucciones? Me han dicho que CPUID podría hacer esto, pero no he podido encontrar ninguna documentación que lo diga.

Respuesta

9

Que yo sepa, no hay instrucciones que específicamente "drenen" la tubería. Esto se puede lograr fácilmente usando una instrucción de serialización.

CPUID es una instrucción de serialización, que significa exactamente lo que está buscando. Cada problema de instrucción antes de que se garantice su ejecución antes de la instrucción CPUID.

hacerlo, el siguiente debe conseguir el efecto deseado:

cpuid 
rdtsc 
# stuff 
cpuid 
rdtsc 

Pero, como un aparte, no recomiendo que lo haga. Sus "cosas" aún pueden verse afectadas por muchas otras cosas fuera de su control (como cachés de CPU, otros procesos que se ejecutan en el sistema, etc.) y nunca podrá eliminarlas todas. La mejor forma de obtener estadísticas de rendimiento precisas es realizar la (s) operación (es) que desea medir al menos varias millones de veces y promediar el tiempo de ejecución del lote.

Editar: La mayoría de las referencias de instrucciones para CPUID mencionarán sus propiedades de serialización, como NASM manual appendix B.

Editar 2: También es posible que desee echar un vistazo a this related question.

+1

Tienes razón sobre las instrucciones de Fence. CPUID de hecho los implica (eliminé mi respuesta al respecto). Tenga en cuenta que, aunque el CPUID se serializa, no borra los cachés, lo que también puede afectar el rendimiento. La memoria caché se puede borrar con WBINVD. Es posible que desee agregar eso a su respuesta. –

+0

wbinvd tiene privilegios ... sin embargo, podría usar clflush. Hay una pregunta aparte sobre ese tipo de cosas de la semana pasada ... http://stackoverflow.com/questions/558848/can-i-force-cache-coherency-on-a-multicore-x86-cpu/558900# 558900 – SoapBox

+0

Gran respuesta. Gracias. –

Cuestiones relacionadas