Recientemente encontré un caso en el que necesitaba una operación de división de enteros en un chip que carecía de uno (ARM Cortex-A8). Mientras intentaba investigar por qué debía ser eso, descubrí que, en general, la división lleva muchos más ciclos que la suma, la resta o la multiplicación en casi cualquier arquitectura entera (o de punto fijo). ¿Por qué es este el caso? ¿No es representable con una lógica AND-OR de dos capas como todo lo demás?
computer-arithmetic
Phonon
fuente
fuente
Si bien todas las CPU actuales parecen usar un enfoque iterativo como sugiere aterrel , se ha realizado algún trabajo en enfoques no iterativos. La división de punto flotante de precisión variable y la raíz cuadrada hablan de una implementación no iterativa de la división de punto flotante y la raíz cuadrada en un FPGA , utilizando tablas de búsqueda y expansión de la serie taylor.
Sospecho que las mismas técnicas pueden hacer posible que estas operaciones se reduzcan a un solo ciclo (rendimiento, si no latencia), pero es probable que necesite grandes tablas de búsqueda y, por lo tanto, áreas inusualmente grandes de bienes raíces de silicio para hacerlo. .
¿Por qué no sería factible?
Al diseñar CPU, hay muchas compensaciones que hacer. La funcionalidad, la complejidad (número de transistores), la velocidad y el consumo de energía están interrelacionados y las decisiones tomadas durante el diseño pueden tener un gran impacto en el rendimiento.
Un procesador moderno probablemente podría tener una unidad de punto flotante principal que dedique suficientes transistores en el silicio para realizar una división de punto flotante en un solo ciclo , pero es poco probable que sea un uso eficiente de esos transistores.
El punto flotante multiplicado hizo esta transición de iterativo a no iterativo hace una década. En estos días, la multiplicación de ciclo único e incluso la acumulación múltiple son comunes, incluso en procesadores móviles.
Antes de convertirse en un uso eficiente del presupuesto de transistores, la multiplicación, como la división, a menudo se realizaba mediante un método iterativo. En aquel entonces, los procesadores DSP dedicados podían dedicar la mayor parte de su silicio a una sola unidad de acumulación múltiple (MAC) rápida . Una CPU Core2duo tiene una latencia múltiple de coma flotante de 3 (el valor sale de la tubería 3 ciclos después de entrar), pero puede tener 3 multiplicaciones en vuelo a la vez, lo que resulta en un rendimiento de ciclo único, mientras que su unidad SSE2 puede bombea múltiples multiplicaciones de FP en un solo ciclo.
En lugar de dedicar grandes áreas de silicio a una unidad de división de ciclo único, las CPU modernas tienen múltiples unidades, cada una de las cuales puede realizar operaciones en paralelo, pero están optimizadas para sus propias situaciones específicas. De hecho, una vez que tenga en cuenta las instrucciones SIMD como SSE o los gráficos integrados de CPU del Sandy Bridge o CPU posteriores, puede haber muchas unidades de división de punto flotante en su CPU.
Si la división genérica de punto flotante fuera más importante para las CPU modernas, entonces podría tener sentido dedicar suficiente área de silicio para hacer un solo ciclo, sin embargo, la mayoría de los fabricantes de chips obviamente han decidido que pueden hacer un mejor uso de ese silicio al usar esas compuertas para otras cosas . Por lo tanto, una operación es más lenta, pero en general (para escenarios de uso típicos) la CPU es más rápida y / o consume menos energía.
fuente