40 votos

¿Por qué Intel ' chip Haswell de s permite multiplicación de FP para ser dos veces tan rápido como adición?

Estaba leyendo esta pregunta muy interesante sobre Stack Overflow:

Es de enteros multiplicación realmente hace a la misma velocidad que en una CPU moderna?

Uno de los comentarios que dijo:

"Vale la pena nada de lo que en Haswell, la FP multiplicar el rendimiento es el doble que el de FP agregar. Eso es debido a que tanto los puertos 0 y 1 puede ser utilizado para multiplicar, pero sólo el puerto 1 se puede utilizar para la adición. Dicho esto, usted puede engañar con fundida multiplicar añade desde ambos puertos pueden hacer ellos".

¿Por qué es que iban a permitir dos veces como muchos simultánea multiplicaciones en comparación con la suma?

40voto

samjudson Puntos 27483

Esto posiblemente respuestas el título de la pregunta, si no el cuerpo:

Punto flotante, además requiere de la alineación de los dos mantisa antes de la adición de ellos (dependiendo de la diferencia entre los dos exponentes), lo que podría requerir una gran cantidad variable de cambio antes de la serpiente. Luego renormalizing el resultado de la mantisa, además de que podría ser necesaria, potencialmente requiere otra gran cantidad variable de cambio en el orden correctamente el formato de coma flotante resultado. Los dos mantisa barril manetas de lo que podría requerir más la puerta retrasos, mayor de alambre retrasos, o ciclos extras que excedan el retraso de un bien compactada carry-save-serpiente-árbol multiplicador de front end.

Añadido para el OP: tenga en cuenta que la adición de las longitudes de 2 milímetros y 2 kilómetros no es de 4 de la unidad. Eso es debido a la necesidad de convertir uno o el otro de la medición a la misma escala o la representación de la unidad antes de la adición. Que la conversión requiere esencialmente una multiplicación por alguna potencia de 10. La misma cosa, por lo general debe ocurrir durante de punto flotante de adición, ya que los números de punto flotante son una forma de variable escala de números enteros (por ejemplo, no es una unidad o factor de escala, un exponente, asociados con cada número). Así que usted puede necesitar a escala de uno de los números por una potencia de 2, antes de la adición de raw bits de mantisa con el fin de tener ambos representan el mismo o unidades de la escala. Esta escala es esencialmente una forma simple de multiplicación por una potencia de 2. Por lo tanto, de punto flotante, además requiere de la multiplicación (que, por ser una potencia de 2, se puede hacer con una variable de desplazamiento de bits o el cañón de la palanca de cambios, los cuales pueden requerir relativamente largo de los cables en relación con el transistor tamaños, que puede ser relativamente lento en profundidad de sub-micrones-litografía de circuitos). Si los dos números en su mayoría cancelar (porque uno es casi el negativo de la otra), entonces no puede haber una necesidad de redimensionar el resultado de la suma así a la adecuada formato el resultado. Así que además puede ser lento si además requiere 2 multiplicaciones (pre y post) pasos que rodea el binaria de la adición de una prima fija (finito) número de bits de mantisa que representan las unidades equivalentes o escala, debido a la naturaleza del formato de número (IEEE de punto flotante).

Añadió #2: También, muchos de los criterios de peso FMACS (multiplicar-se acumula) más que desnudo, añade. En un fundido de MAC, la alineación (shift) del sumando a menudo puede ser realizado principalmente en paralelo con la de multiplicar, y la mantisa agregar a menudo puede ser incluido en el CSA del árbol antes de la final de llevar a la propagación.

25voto

Brian Drummond Puntos 27798

En FP multiplicación, exponente de procesamiento resulta ser la suma simple (por exactamente la misma razón por la que la multiplicación en el registro de dominio es simplemente la adición). Usted ha venido a través de los logaritmos, espero.

Ahora considere lo difícil que es para agregar dos números en forma logarítmica...

Punto flotante, habita una zona gris entre lo lineal y registro de dominios, con aspectos de ambos. Cada FP número consta de una mantisa (que es lineal) y un (logarítmica) exponente. Para determinar el significado de cada bit de la mantisa, primero tiene que mirar en el exponente (que es sólo un factor de escala).

En FP, además, exponente de procesamiento en el caso general, se requiere el barril de cambio de la mantisa dos veces, donde cada barril de cambio es, efectivamente, un caso especial de un poco simplificada de la multiplicación.

(El primer turno alinea las dos entradas para la misma potencia de 2, por lo que una mantisa de bits tiene el mismo peso binario en cada operando.

Un decimal ejemplo será suficiente (a pesar de que el binario se utilizan obviamente)...

$$ (3 \cdot 10^3) + (1 \cdot 10^{-1}) = (3\cdot10^3) + (0.0001 \cdot 10^3) $$

La segunda re-escala la salida...

$$ 1 \cdot 10^0 + (-0.999 \cdot 10^0) = 0.001 \cdot 10^0 = 1 \cdot 10^{-3} $$

Así, paradójicamente, un FP, además implica algo muy parecido a dos multiplicaciones que tienen que ser realizadas de forma secuencial, con la mantisa, además entre ellos. En ese sentido, informó de rendimiento no es tan sorprendente.

22voto

Willshaw Media Puntos 125

TL:DR: porque Intel pensamiento ESS/AVX FP agregar la latencia era más importante que el rendimiento, optaron por no ejecutar en el FMA unidades en Haswell/Broadwell.


Haswell se ejecuta (SIMD) FP se multiplican en las mismas unidades de ejecución como FMA (Fusionado Multiplicar-Agregar), de la cual tiene dos debido a que algunos FP-intensivo de código puede utilizar la mayoría de Fma para hacer 2 FLOPs por la instrucción. 5 ciclo de latencia como FMA, y como mulps anteriores Cpu (Sandybridge/IvyBridge). Haswell quería 2 FMA unidades, y no hay ningún inconveniente para dejar multiplicar ejecutar ya sea porque son de la misma latencia como el dedicar multiplicar la unidad en anteriores Cpu.

Pero se mantiene el dedicado SIMD FP agregar unidad desde principios de la Cpu para ejecutar addps/addpd con 3 ciclo de latencia. He leído que la posible razonamiento podría ser que el código que hace un montón de FP agregar tiende a cuello de botella en su latencia, no el rendimiento. Eso es cierto para un ingenuo suma de una matriz con sólo uno (vector) acumulador, como a menudo se obtiene a partir de GCC auto-vectorizar. Pero no sé si Intel ha confirmado públicamente que era su razonamiento.

Broadwell es el mismo (pero se aceleró mulps / mulpd a 3c de latencia, mientras que la FMA se alojó en 5c). Tal vez ellos fueron capaces de acceso directo de la FMA de la unidad y obtener el resultado de multiplicar antes de hacer un muñeco de añadir 0.0, o tal vez algo completamente diferente, y eso es demasiado simplista. BDW es principalmente un die-shrink de HSW con la mayoría de los cambios de menor importancia.

En Skylake todo FP (incluyendo la adición) se ejecuta en el FMA unidad con 4 ciclos de latencia y 0.5 c rendimiento, excepto, por supuesto, div/sqrt y bit a bit booleanos (por ejemplo, para el valor absoluto o la negación). Intel aparentemente decidió que no valía la pena adicional de silicio para reducir la latencia de FP agregar, o que el desequilibrado addps el rendimiento era problemática. Y también la estandarización de las latencias hace evitar la escritura de conflictos (cuando 2 resultados están listos en el mismo ciclo) más fácil de evitar en uop programación. es decir, simplifica la programación y/o puertos de finalización.

Así que sí, Intel hizo cambiar en su próxima gran microarquitectura de revisión (Skylake). La reducción de la FMA latencia por 1 ciclo de hecho el beneficio de un dedicado SIMD FP agregar unidad mucho más pequeña, para los casos de latencia obligado.

Skylake también muestra signos de Intel listo para AVX512, donde se extiende por separado un SIMD-FP adder a 512 bits de ancho habría tomado aún más área de la matriz. Skylake-X (con AVX512) al parecer tiene un casi idéntico núcleo para regular Skylake-cliente, excepto para los mayores de caché L2 y (en algunos modelos) un extra de 512 bits FMA unidad "pegado" al puerto 5.

SKX cierra el puerto 1 SIMD Alu cuando 512 bits uops en vuelo, pero necesita una manera de ejecutar vaddps xmm/ymm/zmm en cualquier punto. Este hecho de tener un dedicado FP AGREGAR unidad en el puerto 1 es un problema, y es independiente de la motivación para el cambio de la ejecución de código existente.

Dato divertido: todo, desde Skylake, KabyLake, Café Lago e incluso la Cascada del Lago han sido microarchitecturally idéntica a Skylake, excepto por la Cascada del Lago de la adición de nuevas AVX512 instrucciones. El IPC no ha cambiado lo contrario. Nuevas CPUs tienen mejor iGPUs, aunque. Lago helado (Soleado Cove microarquitectura) es la primera vez en varios años que hemos visto una nueva microarquitectura (excepto la de nunca ampliamente publicado Cañón del Lago).


Los argumentos basados en la complejidad de un FMUL unidad contra un FADD unidad son interesantes pero no son relevantes en este caso. Una de las FMA de la unidad incluye todo lo necesario cambio de hardware para hacer FP como parte de una FMA1.

Nota: no me refiero a la x87 fmul instrucción, me refiero a una ESS/AVX SIMD/escalar FP multiplicar ALUMINIO que soporta 32 bits de precisión simple / float y 64-bit double de precisión (53 bits de mantisa aka mantisa). por ejemplo, las instrucciones de como mulps o mulsd. Real de 80 bits x87 fmul todavía es sólo 1/reloj rendimiento en Haswell, en el puerto 0.

Las Cpu modernas tienen más que suficiente transistores para lanzar en problemas cuando vale la pena, y cuando no causa física-distancia de retardo de propagación de los problemas. Especialmente para las unidades de ejecución en que sólo se activa una parte del tiempo. Ver https://en.wikipedia.org/wiki/Dark_silicon y este 2011 ponencia: la Oscuridad de Silicio y el Final de Multinúcleo de Escala. Esto es lo que hace posible que la Cpu masiva FPU rendimiento, y la masiva entero rendimiento, pero no ambos al mismo tiempo (porque las diferentes unidades de ejecución se encuentran en el mismo despacho de los puertos, de modo que competir el uno con el otro). En muchos cuidadosamente afinado de código que no haga cuello de botella en memoria de ancho de banda, no es de back-end de unidades de ejecución que es el factor limitante, pero en lugar de front-end de la instrucción de rendimiento. (distintos núcleos son muy caros). Ver también http://www.lighterra.com/papers/modernmicroprocessors/.


Antes De Haswell

Antes de HSW, Cpu Intel como Nehalem y Sandybridge había SIMD FP se multiplican en el puerto 0 y SIMD FP agregar en el puerto 1. Así fueron separados de unidades de ejecución y el rendimiento fue equilibrado. (https://stackoverflow.com/questions/8389648/how-do-i-achieve-the-theoretical-maximum-of-4-flops-per-cycle

Haswell introducido FMA apoyo en la Cpu Intel (un par de años después de que AMD presentó FMA4 en Bulldozer, después de que Intel fingido ellos por la espera tan tarde como para hacer público que iban a implementar 3-el operando de la FMA, no 4-operando no destructivos-destino FMA4). Dato divertido: AMD Martillo fue el primer x86 CPU con FMA3, aproximadamente un año antes de Haswell en junio de 2013

Esto requiere de algunos de los principales hacking de los mecanismos internos para apoyar incluso una sola uop con 3 entradas. Pero de todos modos, Intel fue all-in y aprovechó cada vez más transistores para poner en dos de 256 bits SIMD FMA unidades, haciendo Haswell (y sus sucesores) bestias de FP de matemáticas.

Un objetivo de rendimiento de Intel podría haber tenido en mente era BLAS densa matmul y producto escalar de vectores. Tanto de aquellos que pueden sobre todo el uso de la FMA y no necesitan acaba de agregar.

Como he mencionado anteriormente, algunas de las cargas de trabajo que en su mayoría o simplemente FP, además son un cuello de botella en agregar latencia, (en su mayoría) no el rendimiento.


Nota 1: Y con un multiplicador de 1.0, FMA, literalmente, puede ser utilizado para la suma, pero con peor latencia de un addps instrucción. Esto es potencialmente útil para las cargas de trabajo como suma de una matriz que es caliente en L1d caché, donde FP añadir el rendimiento es más importante que el tiempo de latencia. Esto sólo ayuda si el uso múltiple del vector de acumuladores para ocultar la latencia, por supuesto, y mantener 10 FMA operaciones en vuelo en la FP de unidades de ejecución (5c latencia / 0.5 c rendimiento = 10 operaciones de latencia * ancho de banda del producto). Usted necesita para hacer que cuando el uso de FMA para un producto escalar de vectores, demasiado.

Ver David Kanter la escritura de los Sandybridge microarquitectura que tiene un diagrama de bloque que la Use se en que puerto para NHM, SnB, y AMD Bulldozer-familia. (Ver también Agner la Niebla de la instrucción de tablas y asm optimización microarch guía, y también https://uops.info/ que también tiene una prueba experimental de uops, puertos, y la latencia/rendimiento de casi todas las instrucciones sobre muchas generaciones de Intel microarquitecturas.)

También relacionado con: https://stackoverflow.com/questions/8389648/how-do-i-achieve-the-theoretical-maximum-of-4-flops-per-cycle

10voto

MikeP Puntos 201

Voy a mirar en esta parte:
"¿Por qué es que iban a permitir"...
TL;DR - porque se ha diseñado de esa manera. Es una decisión de la administración. Seguro que hay respuestas de mantisa y poco shifters, pero estas son cosas que van en la decisión de la administración.

¿Por qué diseñar de esa manera? La respuesta es que las especificaciones son para cumplir ciertos objetivos. Los objetivos incluyen el rendimiento y el coste. El rendimiento está orientado no hacia las operaciones, en lugar de un punto de referencia como FLOPS o FPS en Crysis.
Estos puntos de referencia tendrán una mezcla de funciones, algunas de ellas pueden procesar al mismo tiempo.
Si los diseñadores de la figura que tener dos funciones de Un widget que hace que sea mucho más rápido, en lugar de dos funciones de widget B, luego van a ir con el widget A. la Ejecución de dos de Una y dos de la B va a costar más.

Mirando hacia atrás cuando superscalar y super tuberías (antes de multi-core) en primer lugar se hizo común en los comerciales de chips, estos estaban allí para aumentar el rendimiento. El Pentium tiene dos tubos, y no del vector que une. Haswell tiene más tubos, vector de unidades, una más profundo de la tubería, funciones específicas, y más. ¿Por qué no hay dos de todo? Debido a que se diseñó de esa manera.

7voto

jns Puntos 449

Este diagrama de Intel pueden ayudar:

Haswell Execution Unit Overview

Parece que he dado a cada unidad de una FMA (fusionada multiplicar-agregar) así como multiplicar y una sola serpiente. Se puede compartir o no de hardware por debajo.

A la pregunta de ¿por qué es mucho más difícil de responder sin diseño interno de los fundamentos, pero el texto en el cuadro morado nos da una pista con "dobles pico FLOPs": el procesador va a ser la orientación de una serie de puntos de referencia, derivados de la utilización real de los casos. FMA es muy popular en estos, ya que es la unidad básica de la multiplicación de la matriz. Desnudo, además es menos popular.

Usted puede, como se ha señalado, el uso de ambos puertos para hacer la adición de una FMA instrucción donde la multiplicación parámetro es 1, la informática (x 1) + B. Este será un poco más lento que una simple adición.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X