# Organización de datos para baja potencia

El consumo de energía en relación con el tamaño físico del hardware electrónico ha aumentado a medida que los componentes son más pequeños y están más densamente empaquetados. Esto, unido a las altas frecuencias de funcionamiento, ha llevado a niveles inaceptables de disipación de energía. La memoria representa una alta proporción de la energía consumida, y esta contribución puede reducirse optimizando la organización de los datos, es decir, la forma en que se almacenan los datos.

## Motivación

La optimización de la potencia en sistemas electrónicos de alta densidad de memoria se ha convertido en uno de los mayores retos para dispositivos como teléfonos móviles, sistemas integrados y dispositivos inalámbricos. A medida que aumenta el número de núcleos en un solo chip, también aumenta el consumo de energía de los dispositivos. Los estudios sobre la distribución del consumo de energía en los teléfonos inteligentes y los centros de datos han demostrado que el subsistema de memoria consume alrededor del 40% de la energía total. En los sistemas de servidores, el estudio revela que la memoria consume alrededor de 1,5 veces el consumo de energía de los núcleos.

## Organización de datos de memoria del bus de direcciones de baja energía

Los buses a nivel de sistema como los buses off-chip o los largos buses on-chip entre bloques IP son a menudo fuentes importantes de consumo de energía debido a su gran capacidad de carga. Los resultados experimentales han demostrado que la actividad del bus para el acceso a la memoria puede reducirse al 50% mediante la organización de los datos. Considere el caso de la compilación del código escrito en lenguaje C:
La mayoría de los compiladores de C existentes colocan un arreglo multidimensional en forma de fila mayor, es decir, fila por fila: esto se muestra en la columna "no optimizada" de la tabla adyacente. Como resultado, ningún acceso a la memoria durante la ejecución de este código tiene acceso a la memoria secuencial porque los elementos en las columnas son accedidos secuencialmente. Pero es posible cambiar la forma en que se colocan en la memoria para maximizar el número de accesos secuenciales desde la memoria. Esto se puede lograr ordenando los datos como se muestra en la columna "optimizado" de la tabla. Esta redistribución de los datos por parte del compilador puede reducir significativamente el consumo de energía debido al acceso a la memoria.
| unoptimized | Optimizado |
| Un[0][0] | Un[0][0] |
| Un[0][1] | B[0][0] |
| Un[0][2] | Un[1][0] |
| Un[0][3] | B[0][1] |
| Un[0][0] | Un[2][0] |
| Un[1][0] | B[0][2] |
| Un[1][1] | Un[3][0] |
| . | B[0][3] |
| . | Un[0][1] |
| B[0][0] | B[1][0] |
| B[0][1] | Un[1][1] |
| B[0][2] | B[1][1] |
| B[0][3] | . |
| B[1][0] | . |
| . | Un[3][3] |
| B[3][3] | B[3][3] |

## Transformaciones de estructura del dato

Este método implica transformaciones del código fuente o bien modifican la estructura de datos incluida en el código fuente, o bien introducen nuevas estructuras de datos o, posiblemente, modifican el modo de acceso y las rutas de acceso con el fin de reducir el consumo de energía. Se utilizan ciertas técnicas para realizar tales transformaciones.

### Clasificación de declaración de arreglo

La idea básica es modificar el orden de declaración de los arreglos locales, de forma que los arreglos a los que se accede con mayor frecuencia se coloquen en la parte superior de la pila, de tal forma que las ubicaciones de memoria que se utilizan con mayor frecuencia sean accedidas directamente. Para conseguir esto, las declaraciones de los arreglos se reorganizan para colocar en primer lugar los arreglos a los que se accede con más frecuencia, lo que requiere una estimación estática o un análisis dinámico de la frecuencia de acceso de los arreglos locales.

### Modificación del alcance de los arreglos (de local a global)

En cualquier programa de cálculo, las variables locales se almacenan en la pila de un programa y las variables globales se almacenan en la memoria de datos. Este método implica la conversión de los arreglos locales en arreglos globales para que se almacenen en la memoria de datos en lugar de en la pila. La ubicación de una matriz global se puede determinar en tiempo de compilación, mientras que la ubicación de la matriz local sólo se puede determinar cuando se llama al subprograma y depende del valor del puntero de la pila. Por consiguiente, se accede a las matrices globales con el modo de direccionamiento de offset con la constante 0, mientras que a las matrices locales, excluyendo la primera, se accede con un offset constante diferente de 0, y con ello se consigue una reducción de energía

### Re-dimensionamiento de la matriz (inserción temporal de la matriz)

En este método, los elementos a los que se accede con mayor frecuencia se identifican mediante la elaboración de perfiles o consideraciones estáticas. Una copia de estos elementos se almacena en un arreglo temporal al que se puede acceder sin que falte ninguna caché de datos. Esto resulta en una reducción significativa de la energía del sistema, pero también puede reducir el rendimiento.

## Utilizando memoria scratchpad

Las cachés en el chip utilizan RAM estática que consume entre el 25% y el 50% de la potencia total del chip y ocupa alrededor del 50% del área total del chip. La memoria del scratchpad ocupa menos área que las cachés en chip. Esto normalmente reducirá el consumo de energía de la unidad de memoria, porque un área menor implica una reducción de la capacitancia total conmutada. Los procesadores embebidos actuales, particularmente en el área de aplicaciones multimedia y controladores gráficos, tienen memorias de scratchpad en el chip. En los sistemas de memoria cache, el mapeo de los elementos de programa se hace durante el tiempo de ejecución, mientras que en los sistemas de memoria de scratchpad esto se hace ya sea por el usuario o automáticamente por el compilador usando un algoritmo adecuado.