Microarchitectural Optimizations for an Efficient Utilization of Processor Resources
- Alberto Ros Bardisa Director
- Alexandra Jimborean Director
Defence university: Universidad de Murcia
Fecha de defensa: 21 November 2024
- André Seznec Chair
- José Rubén Titos Gil Secretary
- Antonio González Colás Committee member
Type: Thesis
Abstract
Con el tiempo, la complejidad del hardware en los computadores ha aumentado constantemente, siempre en pos de ofrecer un mayor rendimiento. Varios son los mecanismos introducidos con este objetivo, por ejemplo, aumentar el número de etapas del cauce, la ejecución fuera de orden (OoO, por sus siglas en inglés) u optimizaciones en la jerarquía de memoria. El fin común de los mencionados mecanismos es el de ocultar la latencia de acceso a la información almacenada en memoria, tanto referente a instrucciones como a datos. Como resultado se consigue que el procesador siempre esté realizando trabajo útil y por tanto ofrezca un mayor rendimiento. La ejecución fuera de orden (OoO) destaca entre el resto de mecanismos. Esta principalmente se centra en ejecutar las instrucciones en el cauce del procesador de forma no secuencial. En el momento en el que los operandos de una instrucción que se ha introducido al camino de datos están disponibles estas se ejecutan si existe una unidad funcional disponible para ello. De esta forma, las instrucciones se pueden ejecutar en un orden diferente al especificado por el programa. Sin embargo, estas sí deben cambiar el estado arquitectural del procesador en el mismo orden en el que se emitieron. Con este objetivo y para garantizar la corrección, se requiere hacer un registro exhaustivo de las instrucciones “en vuelo” o ya emitidas. Dentro del procesador podemos encontrar varias estructuras que permiten este seguimiento, como son el Reorder Buffer (ROB), Load Queue (LQ), Store Queue (SQ) y Store Buffer (SB). Para cada instrucción se requiere una entrada en el ROB, mientras que las lecturas y los almacenamientos de datos también requieren entradas en la LQ y SQ respectivamente. Estas dos últimas estructuras se utilizan para forzar el mantenimiento del orden de los accesos a memoria tal y como fueron emitidos. Por ello, ambas estructuras admiten búsquedas asociativas. Si cualquiera de estas estructuras llegase a llenarse, el procesador no podría continuar emitiendo instrucciones e irremediablemente debe producirse una parada. Es importante optimizar el tamaño de estas en su diseño para mantener un compromiso entre tamaño y tiempo de acceso. Si las estructuras son demasiado pequeñas, se producirán más paradas, mientras que aumentar su tamaño también aumenta su complejidad a la hora de implementarlas, resultando en búsquedas más lentas y por tanto en una degradación de rendimiento. Para poder utilizar el mecanismo de ejecución fuera de orden de una forma eficiente, el front-end del procesador, adicionalmente, debe ser capaz de proporcionar las suficientes instrucciones al cauce. Por lo general, las instrucciones pueden obtenerse ya sea de la caché de micro-operaciones (μ-op) o desde el nivel más bajo de la caché de instrucciones (L1I). La caché de micro-operaciones inicialmente fue diseñada como un mecanismo útil para reducir la energía disipada por el procesador. Adicionalmente ha demostrado ser beneficiosa para mejorar el rendimiento al reducir el tiempo que tarda el procesador en recuperarse ante un salto mal predicho. Sin embargo, esta caché no siempre puede proporcionar las suficientes instrucciones, siendo un potencial cuello de botella para el rendimiento, particularmente en aplicaciones en las que el rango de direcciones de memoria que se usa para almacenar las instrucciones es lo suficientemente grande. Un ejemplo claro de este tipo de aplicaciones son las cargas de trabajo de servidores y centros de datos, muy comunes a día de hoy en grandes empresas. Esta mejora se traduce en mejoras significativas del rendimiento general y la eficiencia del sistema que se ubican en el rango del 2% al 8%.