La reducción de operaciones para bajo consumo es una técnica de transformación de programas ASIC que se utiliza para reducir el consumo de energía de una aplicación específica. Una transformación de programa es cualquier operación que cambie la estructura computacional, como la naturaleza y el tipo de modelos computacionales, sus interconexiones y la secuencia de operaciones, manteniendo intacto el comportamiento de entrada y salida. Básicamente, utilizamos la reducción de operaciones para reducir la cantidad de operaciones que se deben realizar para realizar una tarea, lo que reduce el hardware requerido y, a su vez, el consumo de energía. Por ejemplo, en un CI específico de una aplicación determinada , al reducir la cantidad de adiciones independientes requeridas, se reducen automáticamente los sumadores necesarios y también la energía consumida.
La sustitución de operaciones es una de las técnicas de reducción de operaciones en la que se sustituyen determinadas operaciones costosas por operaciones relativamente más baratas que reducen el consumo de energía. A continuación se ofrecen algunos ejemplos típicos de técnicas de sustitución de operaciones:
Un ejemplo popular de la operación de sustitución es el ejemplo de la mariposa. En este ejemplo, necesitamos calcular dos valores y r = a r * x r - a i * x i , y i = a i * x r + a r * x i que se pueden hacer calculando secuencialmente los términos como se muestra en las expresiones. Pero usando la operación de sustitución podemos calcularlos usando expresiones, y r = a r * (x i +x r ) - x i * (a i + a r ), y i = a r * (x i +x r ) + x r * (a i -a r ) donde el término (x i +x r ) una vez calculado puede ser usado por ambos cálculos a partir de esto podemos deducir fácilmente que las operaciones cambiaron de número de operaciones cambió de 4 multiplicaciones a 3 y 2 suma/suma a 3. La ruta crítica en el primer método era de longitud 2 mientras que en el último es 3. Entonces, nuevamente, esto es un equilibrio entre demora y potencia.
En función de la frecuencia de cambio de entrada, podemos modelar el programa de modo que se produzcan menos cambios de actividad, es decir, si ciertas entradas cambian con menos frecuencia, se las debe hacer funcionar en un solo módulo para que el módulo en particular sea relativamente pasivo en comparación con otros. A+B+C+D se puede calcular como (A+B)+C+D o (A+B)+(C+D). El primero alimenta C,D a dos sumadores separados, pero si cambian con relativa lentitud, entonces alimentarlos al mismo sumador es más rentable.
Toda síntesis consta de tres partes: asignación (número y tipo de recursos), programación (programación de operaciones) y vinculación (construcción del circuito). Podemos programar las operaciones en un orden determinado en función de qué valor del programa activa cuántos módulos. Siempre queremos que las operaciones que requieren que se completen más operaciones antes se programen más tarde.
Considere el siguiente fragmento de código:
si (C > 0) { :A = A * C}
Supongamos que el perfil ha demostrado que lo más probable es que el valor de C sea 2. Por lo tanto, como C y C son independientes y mutuamente excluyentes, podemos modificar el código para que sea
si (c == 2) { A = A << 1}de lo contrario si (C > 0) { :A = A * C;}
Aquí la multiplicación se sustituye por una operación de desplazamiento, que se activa en la mayoría de los casos y es mucho más barata que la multiplicación.