¿Es posible mejorar el rendimiento computacional aprovechando la necesidad de menor precisión?

“Sí” es fácil, “cómo” es difícil y depende del problema.

Un ejemplo simple son las operaciones vectoriales. En arquitecturas Intel, las instrucciones SIMD (SSE2) pueden funcionar con palabras de 128 bits. Estas palabras pueden dividirse en dos números de coma flotante de 64 bits, cuatro números de coma flotante de 32 bits, ocho enteros de 16 bits o dieciséis enteros de 8 bits. Entonces, por ejemplo, si solo necesita 8 bits de datos, puede realizar 16 operaciones de este tipo en paralelo, obteniendo 8 veces el rendimiento de hacer el mismo cálculo en cantidades de 64 bits.

Uno podría imaginar una arquitectura que también le permita operar en tamaños irregulares (sin potencia de dos), aunque no conozco ningún ejemplo práctico.

Incluso en una arquitectura sin paralelización explícita, puede obtener cierta paralelización de cantidades de 3 bits a través de técnicas de software. Agregar en paralelo es fácil. La multiplicación paralela por la misma cantidad también es fácil. La multiplicación paralela por diferentes cantidades es algo más difícil, pero se pueden usar técnicas de golpes de bits o algo de álgebra para implementarlo.

Por ejemplo, [matemáticas] (a2 ^ {32} + b 2 ^ {16} + c) (d2 ^ {8} + e2 ^ {4} + f) = ad2 ^ {40} + ae2 ^ {36} + af2 ^ {32} + bd2 ^ {24} + be2 ^ {20} + bf2 ^ {16} + cd2 ^ {8} + ce2 ^ {4} + cf [/ matemáticas]

Entonces, si todos los resultados no son más de 4 bits, podemos leer cualquier multiplicación por pares que necesitemos.

Las funciones como extraer raíces cuadradas o calcular funciones trigonométricas utilizan rutinas que producen unos pocos bits a la vez, por lo que es beneficioso terminarlos antes de tiempo si se necesitan pocos bits. Esto es fácil en software; No sé de nuevo de ninguna arquitectura de hardware que permita especificar.

Un peligro al tratar de proporcionar muchos anchos de bits diferentes en hardware de propósito general es que puede interferir con las ganancias deseadas en eficiencia, debido a la lógica de control adicional. Sin embargo, en un FPGA, los sumadores y multiplicadores pueden hacerse exactamente tan grandes como sea necesario para el problema en cuestión.

Ciertamente es una idea válida, y uno podría imaginar una arquitectura en la que partes de la ALU y tal vez la unidad de punto flotante pudieran cerrarse para reducir el consumo de energía o aumentar la frecuencia de operación. Es probable que deba combinarse con un modelo de programación modificado o una implementación de compilador / tiempo de ejecución inteligente que permita el uso de precisión variable.

Debería ser posible implementar esto con cierto esfuerzo, por lo que la respuesta a la pregunta “¿es posible …” es definitivamente un sí. Una pregunta más importante hoy podría ser “¿por qué deberíamos hacer esto?” O “¿quién pagará por ello?”. El diseño de una arquitectura deliberadamente paralizada para un pequeño porcentaje de mejora del rendimiento probablemente no tenga sentido en el mercado actual: su CPU de menor precisión debería ofrecer algo más valioso que un rendimiento marginalmente mejorado; tales como bienes de ultra bajo costo o bienes de silicio.

También es posible que desee buscar el concepto de “informática estocástica”, un concepto que recientemente ha sido investigado por Rakesh Kumar y su grupo de investigación. La computación estocástica es más o menos lo que había imaginado: un procesador y un paradigma informático asociado que permite una precisión más baja e incluso un error computacional ocasional.

Google usó esta idea para construir su propio hardware personalizado para entrenar redes neuronales. Esta publicación de blog describe cómo funciona: una mirada en profundidad a la primera Unidad de procesamiento de tensor (TPU) de Google.

Las predicciones de redes neuronales a menudo no requieren la precisión de los cálculos de coma flotante con números de 32 bits o incluso de 16 bits. Con un poco de esfuerzo, puede usar enteros de 8 bits para calcular una predicción de red neuronal y aún así mantener el nivel de precisión adecuado.

El cuadro a continuación muestra el efecto de esta y otras mejoras en el rendimiento, medido en términos de la potencia requerida.

Tenga en cuenta que esto está en una escala logarítmica; la TPU es 83 veces más eficiente que una CPU y 29 veces más eficiente que una GPU.

Su computadora de escritorio o portátil típica y moderna está optimizada para hacer operaciones aritméticas de 64 bits. Básicamente pueden hacer sumas y multiplicaciones en un ciclo de reloj más o menos.

Incluso las funciones integradas, como las funciones trigonométricas, el registro, la raíz cuadrada, etc., están optimizadas en hardware para la aritmética de 64 bits.

Por lo tanto, no vale la pena intentar obtener un mejor rendimiento cuando necesita menos precisión que 64 bits.


Sin embargo, si está haciendo aritmética con números enteros grandes o números de coma flotante, puede ahorrar tiempo usando solo la precisión que necesita. Por ejemplo, en criptografía, se usan comúnmente enteros con 1024 y 2048 bits. En estos casos, ahorraría tiempo utilizando solo la precisión necesaria.

Y, de hecho, el software utilizado para calcular con números tan grandes está optimizado para manejar cualquier tamaño que sea necesario.

A2A: Sospecho que, en lugar de “una necesidad de menor precisión”, se refería a “un requisito de precisión que es menor que la precisión predeterminada”. (Dudo en editar la pregunta por temor a que un moderador me acuse de cambiar el significado). En ese caso, la respuesta puede ser sí si la máquina admite la precisión más baja y usted tiene una manera efectiva de imponer su uso. Digo “puede ser” porque la forma en que su compilador implementa la precisión más baja no necesita implicar ninguna ganancia de rendimiento. Sin embargo, MMX definitivamente proporciona dicho acceso a nivel de hardware en arquitecturas de CPU x86. Ha existido durante mucho tiempo y se ha extendido en arquitecturas x86 e imitado en otros.