Efficient speculative techniques for modern processors
La mayoría de procesadores superescalares modernos ejecutan las instrucciones fuera de orden para maximizar el paralelismo a nivel de instrucción. Sin embargo, el programa impone restricciones sobre el flujo de control y de datos. Para el primero, se han desarrollado técnicas agresivas de predicción de saltos que permiten relajar las restricciones del flujo de control. No obstante, los mecanismos para lidiar con las restricciones del flujo de datos no se han estudiado tan a fondo y algunos de los diseños más eficaces conllevan un gran gasto de espacio o energía.
Las operaciones sobre memoria son, principalmente, de dos tipos: load o carga de un dato desde memoria y store o almacenaje de un dato en memoria. Cuando un load está listo para ser ejecutado, puede tener instrucciones de tipo store más antiguas (en el orden de programa) que aún no ha calculado la dirección en la que debe guardar el dato. Si el load se ejecutase de forma especulativa (es decir, suponiendo que la dirección de memoria donde cogerá el dato no se solapa con la dirección en la que alguno de los stores más antiguos deben almacenar el dato) y más adelanza se descubre que existía un solapamiento o dependencia entre el load y uno de los stores más antiguos sin resolver, se deben volver a ejecutar todas las instrucciones desde el load en adelante.
Si se tiene en cuenta que los procesadores modernos como el Intel Sunny Cove poseen más de 300 instrucciones en ejecución, y que existe una tendencia monótona creciente en el número de instrucciones en ejecución con cada nueva generación de procesadores, se hace evidente la necesidad de una técnica de predicción de dependencia de memoria cuyo diseño y coste sean factibles de implementarse a nivel industrial.
Mejorar las prestaciones de los computadores es necesario, ya que afecta a todo tipo de áreas científicas, de investigación e incluso socio-económicas, tales como biomedicina, Internet de las cosas (IoT), redes sociales o big-data, por nombrar unos pocos ejemplos.
- Mejorar el modelado del camino incorrecto de un simulador de trazas, lo cual aún no se ha propuesto.
- Estudiar el efecto de las optimizaciones del compilador sobre los predictores de dependencia de memoria. Estas optimizaciones son vitales para generar el mejor código ejecutable posible; sin embargo, a veces dan lugar a degradaciones en el tiempo que tarda un programa en ejecutarse.
- Diseñar un predictor de dependencias de memoria que sea eficiente, escalable con la continua evolución de los procesadores y no posea un coste en tamaño o energía que imposibilite su implementación a nivel industrial.