2011-01-20 8 views
18

Es una opinión generalizada de que un código más rápido consumirá menos energía porque se puede poner la CPU en el estado inactivo durante más tiempo, pero cuando hablamos de consumo de energía, está siguiendo una posibilidad:¿Alguien conoce algún compilador que optimice el código de consumo de energía para dispositivos integrados?

Supongamos que hay una secuencia de instrucción que es ejecutado en 1ms y durante el proceso de ejecución, el consumo de corriente promedio fue de 40mA. .y su Vdd es 3.3V

tan total energía consumida = V * I * t = 3,3 * 40 * 10^-3 * 1 * 10^-3 Joules = 13,2 * 10^-6 Joules

y en otro caso hay una secuencia de instrucciones que se ejecuta en 2 ms y durante el proceso de ejecución, el consumo de corriente promedio es de 15 mA. .y Vdd es 3.3V

energey de modo total consumida = V * I * t = 3,3 * 15 * 10^-3 * 2 * 10^-3 Joules = 9,9 * 10^-6 Joules

tan la pregunta viene a. .. ¿Hay alguna arquitectura que tenga diferentes conjuntos de instrucciones para realizar la misma tarea con diferentes consumos actuales?

Y si hay ... ¿hay algún compilador que tenga esto en cuenta y genere un código que sea eficiente desde el punto de vista energético?

+0

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

+0

¿Por qué ves esos votos favorables? Eso es porque la pregunta es genial. – sharptooth

Respuesta

4

No hay ninguno que yo sepa, pero creo que esto debería ser posible usando un marco de compilación como LLVM, adaptando el algoritmo de ponderación del planificador de instrucciones.

Editar: ha habido una conversación sobre Energy Consumption Analytics in LLVM en FOSDEM.

0

En el nivel de instrucción individual, cambiar variables en lugar de multiplicar disminuiría la corriente y el consumo de energía, pero no estoy seguro de que compre el ejemplo de tomar el doble de tiempo pero usando la mitad de la corriente) ¿Reemplazar una multiplicación con un cambio y agregar, que dobla el tiempo, realmente toma la mitad de la corriente? Hay tantas otras cosas sucediendo en una CPU (solo la distribución del reloj en el chip toma corriente) que creo que domina el uso actual de fondo.

Bajar la frecuencia del reloj es probablemente lo más importante que puede hacer para reducir el consumo de energía. Y hacer tanto en paralelo como sea posible es la forma más fácil de reducir la velocidad del reloj. Por ejemplo, usar DMA sobre interrupciones explícitas permite que el procesamiento algorítmico termine en menos ciclos. Si tu CPU tiene modos de direccionamiento raros o instrucciones paralelas (te estoy mirando, TMS320), me sorprendería que no pudieras reducir a la mitad el tiempo de ejecución de los lazos ajustados por debajo del doble de la corriente, lo que daría un ahorro neto de energía. Y en la familia de CPU Blackfin, bajar el reloj le permite reducir el voltaje del núcleo, lo que reduce drásticamente el consumo de energía. Me imagino que esto también es cierto en otros procesadores integrados.

Después de la frecuencia del reloj, apuesto a que el consumo de energía está dominado por el acceso de E/S externo. En entornos de baja potencia, cosas como las fallas de caché te hacen daño dos veces: una vez en velocidad, una vez en ir a la memoria externa. Por lo tanto, desenrollar bucles podría empeorar las cosas, así como duplicar el número de instrucciones que necesita para esa multiplicación.

Todo lo cual quiere decir que la arquitectura del sistema creativo probablemente tendrá un impacto mucho más poderoso que decirle al compilador que favorezca un conjunto de instrucciones sobre otro. Pero no tengo números para respaldar esto, estaría muy curioso por ver algunos.

0

Probar "MAGEEC". No tengo experiencia de primera mano del compilador.Pero la descripción en el sitio web indica que se puede generar un código de eficiencia energética.

1

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.

Cuestiones relacionadas