assembly intel rdrand

assembly - ¿Cuál es la latencia y el rendimiento de la instrucción RDRAND en Ivy Bridge?



intel (4)

No puedo encontrar ninguna información en agner.org sobre la latencia o el rendimiento de la instrucción RDRAND . Sin embargo, este procesador existe, por lo que la información debe estar disponible.

Editar: en realidad, el manual de optimización más nuevo menciona esta instrucción. Está documentado como <200 ciclos y un ancho de banda total de al menos 500 MB / s en Ivy Bridge. Pero algunas estadísticas más detalladas sobre esta instrucción serían excelentes ya que la latencia y el rendimiento son variables.


Aquí hay algunas cifras de rendimiento que obtengo con rdrand: http://smackerelofopinion.blogspot.co.uk/2012/10/intel-rdrand-instruction-revisited.html

En un i5-3210M (2.5GHz) Ivybridge (2 núcleos, 4 hilos) obtengo un pico de ~ 99.6 millones de 64 bits por segundo con 4 hilos, lo que equivale a ~ 6.374 millones de bits por segundo.

Un i7-3770 de 8 hilos (3.4GHz) Ivybridge (4 núcleos, 8 hilos) alcancé un rendimiento máximo de 99.6 millones de 64 bits por segundo en 3 hilos.



Escribí librdrand. Es un conjunto básico de rutinas para usar la instrucción RdRand para llenar los buffers con números aleatorios.

Los datos de rendimiento que mostramos en IDF provienen del software de prueba que escribí y que genera varios hilos usando pthreads en Linux. Cada extracción de hilo llena un búfer de memoria con números aleatorios usando RdRand. El programa mide la velocidad promedio y puede iterar variando el número de subprocesos.

Dado que hay una latencia de comunicaciones de ida y vuelta desde cada núcleo hasta el DRNG compartido y que es más largo que el tiempo necesario para generar un número aleatorio en el DRNG, el rendimiento promedio obviamente aumenta a medida que agrega subprocesos hasta que se alcanza el rendimiento máximo . El rendimiento máximo físico del DRNG en IVB es de 800 MB / s. Un IVB de 4 núcleos con 8 hilos maneja algo del orden de 780Mbytes / s. Con menos hilos y núcleos, se alcanzan números más bajos. El número de 500MB / s es algo conservador, pero cuando intenta hacer afirmaciones de rendimiento honesto, tiene que serlo.

Como el DRNG funciona a una frecuencia fija (800MHz) mientras que las frecuencias del núcleo pueden variar, el número de ciclos del reloj central por RdRand varía, dependiendo de la frecuencia del núcleo y el número de otros núcleos que acceden simultáneamente al DRNG. Las curvas dadas en la presentación de IDF son una representación realista de qué esperar. El rendimiento total se ve afectado un poco por la frecuencia del reloj central, pero no mucho. El número de hilos es lo que domina.

Se debe tener cuidado al medir el rendimiento RdRand para ''usar'' realmente el resultado RdRand. Si no lo hace, IE lo hizo ... RdRand R6, RdRand R6, ....., RdRand R6 repetidos muchas veces, el rendimiento sería artificialmente alto. Como los datos no se utilizan antes de que se sobrescriban, la interconexión de la CPU no espera a que los datos vuelvan del DRNG antes de emitir la siguiente instrucción. Las pruebas que escribimos escriben los datos resultantes en la memoria que estará en la memoria caché en el chip para que la tubería se detenga en espera de los datos. Esa es también la razón por la que hyperthreading es mucho más efectivo con RdRand que con otros tipos de código.

Los detalles de la plataforma específica, la velocidad del reloj, la versión de Linux y la versión de GCC se dieron en las diapositivas de IDF. No recuerdo los números en la parte superior de mi cabeza. Hay chips disponibles que son más lentos y chips disponibles que son más rápidos. El número que dimos para <200 ciclos por instrucción se basa en mediciones de alrededor de 150 ciclos centrales por instrucción.

Los chips están disponibles ahora, por lo que cualquier persona versada en el uso de rdtsc puede hacer el mismo tipo de prueba.


He realizado algunas pruebas de rendimiento preliminares en un Ivy Bridge i7-3770 real utilizando el envoltorio "librdrand" Intel y genera 33-35 millones de números de 32 bits por segundo en un solo núcleo.

Este número de 70M de Intel es de aproximadamente 8 núcleos; por un lado, informan solo alrededor de 10M, por lo que mi prueba es más de 3 veces mejor: - /