¿Qué tan rápido se ejecuta una multiplicación o división de 64 bits en un FPGA?

8

Cuando se utiliza un FPGA normal como Xilinx Spartan 3 o Virtex 5, ¿cuántos ciclos requiere la ejecución de una multiplicación de 64 bits de punto flotante de precisión doble?

Según tengo entendido, el FPGA no tiene una FPU difícil y necesita crear uno utilizando las bibliotecas IEEE estándar u otros materiales. Esto significa que no se ejecutará en un solo ciclo, así que estoy buscando una estimación aproximada para comparar el rendimiento de una CPU de 100 Mhz con un FPGA Spartan / Virtex de 100 MHz.

Me interesan principalmente los operadores de punto flotante, pero si tiene experiencia con operaciones de enteros que también se apreciarían.

    
pregunta Robinicks

5 respuestas

12

No he hecho esto para la FP de doble precisión, pero se aplican los mismos principios que para la precisión simple, para los cuales he implementado la división (multiplicar por recíproco).

Lo que estos FPGA tienen, en lugar de las FPU, son los bloques DSP / multiplicadores cableados, capaces de implementar una multiplicación de 18 * 18 o (Virtex-5) 18 * 25 en un solo ciclo. Y los dispositivos más grandes tienen alrededor de un millar de estos, o incluso 126 o 180 en el extremo superior de las familias Spartan-3 o Spartan-6.

Por lo tanto, puede descomponer una gran multiplicación en operaciones más pequeñas utilizando varias de estas (2 para el Virtex-5 con precisión simple) utilizando los agregados del DSP o el tejido FPGA para sumar los productos parciales.

Obtendrá una respuesta en unos pocos ciclos: 3 o 4 para SP, quizás 5 para DP, dependiendo de cómo componga el árbol sumador (y, a veces, ¡donde las herramientas de sintetizador insisten en agregar registros de canalizaciones!).

Sin embargo, esa es la latencia, ya que se canaliza, el rendimiento será de 1 resultado por ciclo de reloj.

Para la división, aproximé un operador recíproco usando una tabla de búsqueda seguida de interpolación cuadrática. Esto fue más preciso que el de precisión simple y se extendería (con más hardware) a DP si quisiera. En Spartan-6 se necesitan 2 BlockRams y 4 DSP / multiplicadores, y un par de cientos de pares de LUT / FF.

Su latencia es de 8 ciclos, pero nuevamente el rendimiento es de un solo ciclo, por lo que al combinarlo con el multiplicador anterior, se obtiene una división por ciclo de reloj. Debería superar los 100MHz en Spartan-3. En Spartan-6, la estimación de síntesis es de 185 MHz, pero eso es con 1.6 ns en una única ruta de enrutamiento, por lo que 200 MHz está dentro de lo razonable.

En Virtex-5 alcanzó 200MHz sin esfuerzo, al igual que su doble raíz cuadrada. Tuve un par de estudiantes de verano que intentaron volver a instalarlo: con menos de 12 ciclos de latencia obtuvieron cerca de 400MHz - 2.5 ns para una raíz cuadrada.

¿Pero recuerda que tal vez tenga de cien a mil unidades DSP? Eso le da a uno o dos órdenes de magnitud más poder de procesamiento que una sola unidad FP.

    
respondido por el Brian Drummond
4
  

Cuando se utiliza un FPGA normal como Xilinx Spartan 3 o Virtex 5, ¿cómo   Muchos ciclos hacen un punto flotante de doble precisión de 64 bits.   multiplicación o división llevar a ejecutar?

La respuesta es: ¡Sí!

Pero en serio, es muy difícil encontrar un número. Al diseñar cualquier lógica compleja, siempre hay una compensación entre diferentes cosas, y ningún enfoque es bueno para todos los diseños. Intentaré cubrir los grandes.

Con el diseño lógico, una compensación es el tamaño frente a la velocidad. El ejemplo fácil de esto es, digamos, que un solo multiplicador de punto flotante es demasiado lento. Para acelerarlo todo lo que tienes que hacer es agregar un segundo multiplicador. Su tamaño lógico se duplica, pero sí lo hace el número de multiplicados por segundo. Pero incluso solo mirando un solo multiplicador, hay diferentes maneras de multiplicar números; Algunos son rápidos y grandes, otros son pequeños y lentos.

Otra compensación es la velocidad del reloj frente a los relojes por multiplicación. Podría diseñar alguna lógica que hiciera una sola multiplicación de punto flotante en un reloj. Pero eso también requeriría que el reloj sea más lento, tal vez tan lento como 10 MHz. O bien, podría diseñarlo para que funcione con un reloj de 100 MHz pero requeriría 10 relojes por multiplicar. La velocidad total es la misma (una multiplicación en 100 ns), pero una tiene un reloj más rápido.

Relacionado con el párrafo anterior está el equilibrio entre la velocidad del reloj y la latencia múltiple. Existe una técnica en diseño lógico llamada pipeline. Básicamente, tomas un trozo de lógica y lo divides en etapas más pequeñas, donde cada etapa toma un ciclo de reloj para completar. La ventaja aquí es que cada etapa puede estar trabajando en una multiplicación mientras que las otras etapas están trabajando en otras multiplicaciones. Por ejemplo, digamos que estamos corriendo a 100 MHz con una tubería de 10 etapas. ¡Esto significa que tomará 10 relojes por cada multiplicación, pero la lógica también funciona en 10 multiplicaciones diferentes al mismo tiempo! Lo bueno es que está completando una multiplicación en cada ciclo de reloj. Entonces, los relojes efectivos por multiplicación son 1, solo se necesitan 10 relojes para que se complete cada uno de esos multiplicados.

Entonces, la respuesta a tu pregunta, ¿qué tan rápido puede un FPGA hacer una multiplicación, depende realmente de ti? Los FPGA vienen en diferentes tamaños y velocidades, y puede dedicar la mayor parte de esa lógica a la tarea que desee. Pero veamos un escenario específico ...

Digamos que queremos usar el Spartan-3A más grande y todo lo que nos importa son los multiplicadores de punto flotante de 32 bits. Una multiplicación flotante de 32 bits requiere un multiplicador de enteros 24x24 y un sumador de 8 bits. Esto requiere cuatro de los bloques multiplicadores dedicados y algunos segmentos genéricos (muy pocos para preocuparse). El XC3S1400A tiene 32 multiplicadores dedicados, por lo que podemos hacer ocho de nuestros multiplicadores de punto flotante en paralelo. Una suposición muy aproximada sobre la velocidad del reloj sería de unos 100 MHz. Podemos canalizar completamente este diseño para que podamos completar cuatro multiplicaciones de punto flotante de 32 bits por ciclo de reloj, para una velocidad efectiva de 800 millones de multiplicaciones de punto flotante por segundo.

Una multiplicación de doble precisión requiere 9 bloques multiplicadores dedicados por multiplicación de punto flotante, por lo que solo podemos hacer 3 multiplicados en paralelo, lo que resulta en una velocidad de aproximadamente 300 millones de multiplicadores de punto flotante de 64 bits por segundo.

A modo de comparación, consideremos la nueva serie Xilinx Virtex-7. Los multiplicadores dedicados son más grandes, por lo que solo necesitamos 6 bloques multiplicadores dedicados para una multiplicación de punto flotante de 64 bits. También hay 1,920 multiplicadores dedicados en la parte más grande, por lo que podemos hacer 320 multiplicaciones de punto flotante de doble precisión en paralelo. Esas partes también son mucho más rápidas. Estimo que podemos ejecutar esas partes a 200 MHz, lo que nos da una velocidad total de 64 mil millones de puntos de coma flotante de precisión doble multiplicados por segundo. Por supuesto, esos chips cuestan alrededor de US $ 10,000 cada uno.

La división de punto flotante es mucho más difícil de hacer rápidamente. La lógica es mucho más grande, especialmente en un FPGA, y se ejecuta mucho más lento. Lo mismo ocurre con la mayoría de las CPU, ya que las instrucciones de división (punto flotante y fijo) se ejecutan mucho más lentamente. Si la velocidad es importante, entonces desea eliminar la mayor cantidad posible de divisiones. Por ejemplo, en lugar de dividir por 5, debes multiplicar por 0.2. De hecho, en muchos sistemas es más rápido calcular un recíproco y hacer una multiplicación que hacer una división.

Las mismas compensaciones se aplican a la división que a la multiplicación: es solo que la división siempre será mucho más lenta y mucho más grande que la multiplicación.

    
respondido por el user3624
3

Al menos en el componente de división ALT ALT_FP, la división de 64 bits de doble precisión (mantisa de 52 bits) requiere 10, 24 o 61 ciclos de reloj (seleccionables). La precisión extendida única puede variar. P.ej. La división de 43 bits en la que el exponente es de 11 bits, la mantisa de 26 bits permite seleccionar dichas opciones de latencia de salida de reloj: 8, 18 o 35. Inicie ISE y verifique lo que puede tener en Xilinx.

    
respondido por el Socrates
2

No hay razón para que no pueda tomar un solo ciclo. Sin embargo, probablemente sería un ciclo bastante grande y usaría muchos recursos ...

    
respondido por el Martin Thompson
1

Tengo implementaciones de multiplicación y división de punto flotante de doble precisión. La multiplicación toma 13 ciclos de reloj y la división toma 109 ciclos de reloj. Ambos están canalizados para un rendimiento del 100% (un resultado por reloj) y alrededor de 200MHz de operación en un Xilinx V5. No sé cuántos relojes menos podrías obtener a 100MHz, pero dividirlos en dos sería una apuesta segura.

También tengo implementaciones de punto flotante de precisión simple que toman 10 y 51 relojes en la misma situación.

    
respondido por el Jim

Lea otras preguntas en las etiquetas

Comentarios Recientes

En pocas palabras, ¿cuál es el rendimiento frente a la velocidad de una construcción que se basa en CUDA 9? Los rendimientos del panel fotovoltaico voltaico pueden extenderse mucho más sobre la cantidad de módulos compatibles con el chip, uno necesita mirar la arquitectura de múltiples módulos + coprocesos donde el 70% del silicio requiere que los chips admitan el quinto módulo agregado. Duplique y no solo los módulos no ponen un punto más allá, sino que limita su eficiencia al 40% donde no es necesario agregar... Lees verder