2012-05-07 16 views
27

No puedo encontrar ninguna información en agner.org en la latencia o el rendimiento de la instrucción RDRAND. Sin embargo, este procesador existe, por lo que la información debe estar disponible.¿Cuál es la latencia y el rendimiento de la instrucción RDRAND en Ivy Bridge?

Editar: En realidad, el manual de optimización más nuevo menciona estas instrucciones. Se documenta 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.

+0

No sé la respuesta, sin ejecutar un punto de referencia, pero como parte interesada puedo preguntar "¿Qué tan rápido quieres que sea?" Es decir. ¿Qué aplicaciones necesitan muchos RDRANDs? Por cierto, hay dos preguntas separadas aquí: (a) qué tan rápida es la instrucción, en términos de latencia y rendimiento, pero también (b) ¿puede leerse más rápido de lo que se acumula el pool de entropía? Es decir. ¿puedes agotar el grupo de entropía, y simplemente estar ejecutando números pseudoaleatorios? –

+2

La única razón por la que puedo pensar por qué a alguien le importaría es decidir si se usa 'RDRAND' directamente oa través de un PRNG. Obtendrá el mismo comportamiento observable en ambos casos, pero uno podría ser significativamente más rápido que el otro, y no es inmediatamente evidente cuál sería. (KrazyGlew: Tu 'b' es algo irrelevante. Es como preguntar cuánta agua bendita obtienes antes de que cambie al agua. No hay diferencia detectable entre los dos, y la distinción es esencialmente insignificante en este contexto) –

+0

@KrazyGlew Un caso de uso genera números aleatorios para el muestreo estadístico en una GPU. – user239558

Respuesta

28

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 la parte posterior es mayor que el tiempo necesario para generar un número aleatorio en el DRNG, el rendimiento promedio obviamente aumenta al agregar hilos, 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.

Dado que 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, I.E. usted hizo esto ... 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 GCC se dieron en las diapositivas 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 aproximadamente 150 ciclos de núcleo 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.

+4

Agregue un enlace a la presentación de IDF. – Nathan

+3

"Escribí librdrand" - dijo nuf. – JebaDaHut

+0

¿Tan 'rdrand' es como una carga de alta latencia? Los números de Agner Fog indican un rendimiento de uno por ~ 110c en IvB, o uno por ~ 460cycles en Skylake. Tengo curiosidad por saber cuánto puede superponerse la computación con 'rdrand', ya que la mayoría del código que usa números aleatorios en realidad tiene mucho trabajo por hacer además de generar números aleatorios.Así que estoy curioso de cuánto se ralentizaría un código real para usar 'RDRAND' en lugar de un PRNG súper rápido como xorshift, o incluso contra el generador de números no aleatorios más rápido posible:' xor eax, eax'. –

7

Encontrará información relevante en Intel Digital Random Number Generator (DRNG) Software Implementation Guide.

Una cita literal siguiente:

medido sobre: ​​

Up to 70 million RDRAND invocations per second 
500+ million bytes of random data per second 
Throughput ceiling is insensitive to the number of contending parallel threads 
+0

+1: muy buen enlace – Necrolis

+0

@ user434507 - Siempre es bueno incluir el bit relevante. Ese vínculo podría romperse y esta respuesta carecería de sentido. He hecho esto por ti esta vez :) – ArjunShankar

+0

Cita: 'Esto tiene el efecto de destilar la entropía en muestras más concentradas'. Impresionante, ¿verdad? –

3

He hecho algunas pruebas de rendimiento preliminares sobre un puente real Ivy i7-3770 usando "librdrand" envoltorio de 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; para uno solo informan sobre 10M, entonces mi prueba es más de 3 veces mejor: -/

+0

¿De verdad usó el resultado? La respuesta de David dice que la CPU descarta 'rdrand' uops incompleto si el registro de resultados simplemente se sobrescribe. (Por ejemplo, almacenar en la memoria o 'XOR' en algo). –

3

He aquí algunas cifras de rendimiento que recibo con rdrand: http://smackerelofopinion.blogspot.co.uk/2012/10/intel-rdrand-instruction-revisited.html

En un i5-3210M (2,5 GHz) Ivybridge (2 núcleos, 4 hilos) consigo un pico de ~ 99,6 millones de 64 rdrands bits por segundo con 4 hilos que equivalen a ~ 6.374 billones de bits por segundo.

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

+0

¿Cómo se invoca 'stress-ng' para obtener los números de rendimiento? Lo mejor que he podido hacer es 'stress-ng --rdrand 1 --metrics -t 60', pero las métricas (como BogoMIPS) no son muy útiles para mí. – jww

+0

Pruebe: https://github.com/ColinIanKing/x86rdrand-benchmark –

Cuestiones relacionadas