Prácticamente cualquier "optimización de código" realizada por un compilador, que computa la respuesta más rápidamente que el código no optimizado, es "ahorro de energía". (Como observó otro cartel, evitar errores de caché es una gran victoria). Entonces, la verdadera pregunta es, "¿qué optimizaciones están explícitamente destinadas a ahorrar energía, frente a reducir el tiempo de ejecución?" (Nota: algunas "optimizaciones" reducen el tamaño de la huella del código (al abstraer secuencias de código en subrutinas, etc.), lo que en realidad puede costar más energía).
Una inusual, que no he visto en ningún compilador, está cambiando la representación de los datos. Resulta que el costo de almacenar/transmitir un bit cero es diferente del costo de almacenar un bit. (Mi experiencia con TTL y CMOS es "cero" son más caros, porque se implementan en hardware como una especie de "pull-down activo" a través de una resistencia de la fuente de alimentación, causando flujo de corriente y calor, mientras que "ones" son implementado dejando que una señal "flote alto" a través de la misma extracción). Si hay un sesgo, entonces uno debe implementar el código del programa y los datos para maximizar el número de bits, en lugar de cero bits.
Para datos, esto debería ser relativamente sencillo de hacer. Vea this paper para una muy buena encuesta y análisis del valor encontrado en la memoria; contiene algunos cuadros bastante maravillosos. Un tema común es Una gran cantidad de ubicaciones de memoria están ocupadas por miembros de un pequeño conjunto de valores distintos. De hecho, solo un número muy pequeño de valores (hasta 8) ocupan hasta el 48% de las ubicaciones de memoria, a menudo son números muy pequeños (los documentos muestran para algunos programas que una fracción significativa de las transferencias de datos son pequeñas valores, por ejemplo, 0 a 4, siendo cero el valor más común). Si los ceros son realmente más caros de almacenar/transferir que unos, los valores comunes pequeños sugieren almacenar valores en su formato de complemento. Esta es una optimización bastante fácil de implementar. Dado que los valores no son siempre los N naturales más pequeños, uno podría reemplazar el Nth valor más frecuente en la memoria con N y almacenar el complemento de N, haciendo una búsqueda del valor real más cercano al procesador. (El autor del artículo sugiere una caché de "reutilización de valor" de hardware, pero eso no es una optimización del compilador).
Esto es un poco difícil de organizar para el código de programa, ya que el conjunto de instrucciones determina lo que puede decir, y generalmente el conjunto de instrucciones se diseñó independientemente de cualquier medición de energía. Sin embargo, uno podría elegir diferentes secuencias de instrucciones (eso es lo que hacen los optimizadores) y maximizarse para un bit en la secuencia de instrucciones. Dudo que esto sea muy efectivo en los códigos de operación de las instrucciones convencionales. Una vez, sin duda, podría colocar variables en ubicaciones cuya dirección tiene un gran número de bits, y prefiere usar registros con números más altos en lugar de inferiores (en el x86, EAX es el número de registro binario 000 y el EDI es el número de registro 111). hasta el punto de diseñar un conjunto de instrucciones de acuerdo con las frecuencias de ejecución de instrucciones, asignando código de operación con números mayores de un bit a las instrucciones ejecutadas frecuentemente.
Un ejemplo es dividir por la potencia de 2, lo que se puede hacer mediante el desplazamiento a la derecha. Tanto la división como un cambio a la derecha toman una sola instrucción en x86, pero estoy casi seguro de que los cambios a la derecha utilizarán circuitos más simples que a su vez consumirán menos memoria. Ese es el ejemplo más simple, pero no conozco ni un compilador que optimice exactamente el consumo de energía ni ninguna hoja de datos para ningún procesador que mencione implícitamente el consumo de datos para instrucciones específicas. – sharptooth
¿Por qué ves esos votos favorables? Eso es porque la pregunta es genial. – sharptooth