Cuando se usa un FPGA normal como Xilinx Spartan 3 o Virtex 5, ¿cuántos ciclos se tarda en ejecutar una multiplicación o división de coma flotante de doble precisión de 64 bits?
¡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. Trataré de 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 único 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 lo hace el número de multiplicados por segundo. Pero incluso mirando un solo multiplicador, hay diferentes formas 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 haga que un punto flotante se multiplique en un reloj. Pero eso también requeriría que el reloj sea más lento, tal vez tan lento como 10 MHz. O podría diseñarlo para que funcione con un reloj de 100 MHz, pero requeriría 10 relojes por multiplicación. La velocidad general es la misma (una se multiplica en 100 ns), pero una tiene un reloj más rápido.
Relacionado con el párrafo anterior está la compensación de la velocidad del reloj frente a la latencia múltiple. Existe una técnica en el diseño lógico llamada canalización. 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 completarse. 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 funcionando 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 completar cada una de esas multiplicaciones.
Entonces, la respuesta a su pregunta, qué tan rápido puede un FPGA hacer una multiplicación, realmente depende de usted. Los FPGA vienen en diferentes tamaños y velocidades, y puede dedicar tanta lógica a la tarea en cuestión como desee. Pero veamos un escenario específico ...
Digamos que queremos usar el Spartan-3A más grande y todo lo que nos importa son las multiplicaciones de coma flotante de 32 bits. Una multiplicación flotante de 32 bits requiere un multiplicador entero 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 coma 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 poder completar cuatro multiplicaciones de coma flotante de 32 bits por ciclo de reloj, para una velocidad efectiva de 800 millones de multiplicaciones de coma 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 podríamos hacer 3 multiplicaciones en paralelo, lo que da como resultado una velocidad de aproximadamente 300 millones de multiplicaciones de coma 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 coma flotante de 64 bits. También hay 1.920 multiplicadores dedicados en la parte más grande, por lo que podemos hacer 320 multiplicadores de coma flotante de doble precisión en paralelo. Esas partes también son mucho más rápidas. Calculo que podemos ejecutar esas partes a 200 MHz, lo que nos da una velocidad total de 64 MIL MILLONES de multiplicaciones de punto flotante de precisión doble 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 funciona mucho más lento. Lo mismo es cierto para la mayoría de las CPU, ya que las instrucciones de división (punto flotante y fijo) son mucho más lentas. Si la velocidad es importante, entonces desea eliminar tantas divisiones como sea posible. Por ejemplo, en lugar de dividir por 5, debe multiplicar por 0.2. De hecho, en muchos sistemas es más rápido calcular un recíproco y multiplicar que simplemente dividir.
Las mismas compensaciones se aplican a la división como multiplicación: es solo que la división siempre será mucho más lenta y mucho más grande que la multiplicación.