2012-09-10 10 views
11

El término común es que rep movsb es mucho más lento que rep movsd (o en 64 bits, rep movsq) cuando se realizan operaciones idénticas. Sin embargo, he estado probando en algunas máquinas modernas, y los tiempos de ejecución son idénticos (hasta el ruido de medición) en una gran variedad de tamaños de buffer (10 bytes a 2 megas). Hasta ahora, acabo de probar en 2 máquinas (Intel Atom D510 de 32 bits y AMD FX 8120 de 64 bits).¿Información confiable sobre el rendimiento de la instrucción de cadena x86?

  • ¿Hay alguna moderna x 86 máquinas (32 o 64 bits), donde rep movsb es más lento que rep movsd (o rep movsq)?

  • Si no, ¿cuál fue la última máquina en la que la diferencia fue significativa y qué tan significativa fue?

que estoy haciendo esta pregunta desde un punto de vista de que quieran evitar la carga-culting un montón de pruebas para romper la memoria hasta en no alineado cabeza/cola y media alineado por el bien de la utilización de rep movsd o rep movsq si no hay beneficio real para hacer esto ...

+0

Sus resultados de rendimiento para máquinas modernas son correctos. –

+1

Se acelera por el ancho de banda del bus de memoria, no por la CPU. –

+0

En teoría, eso es probablemente cierto, pero otras formas de copia (por ejemplo, los bucles C) son 2-8 veces más lentas. Entonces, el tiempo de CPU gastado hace una diferencia. –

Respuesta

15

Un montón de puntos de referencia aquí: instlatx64.atw.hu

Por ejemplo (Intel Core 2 Duo E6700):

REP MOVSB BW in L1D:13.04 B/c 34829MiB/s 
REP MOVSW BW in L1D:13.29 B/c 35493MiB/s 
REP MOVSD BW in L1D:13.40 B/c 35783MiB/s 

Lo que muestra que hay es una diferencia, pero es muy pequeña.

Esta es para SandyBridge es un poco raro:

REP MOVSB BW in L1D:25.50 B/c 86986MiB/s 
REP MOVSW BW in L1D:18.09 B/c 61721MiB/s 
REP MOVSD BW in L1D:27.47 B/c 93693MiB/s 

Parece que hay una gran diferencia en algunos átomos (que parece haber desaparecido con la D5xx, por lo que sólo lo perdiste):

REP MOVSB BW in L1D: 0.53 B/c 990MiB/s 
REP MOVSW BW in L1D: 1.93 B/c 3598MiB/s 
REP MOVSD BW in L1D: 3.74 B/c 6960MiB/s 

No he encontrado tanta diferencia en cualquier otra cosa que pueda considerarse nueva.

Cuestiones relacionadas