La latencia de la memoria es uno de los problemas fundamentales estudiados en la investigación de arquitectura de computadoras.
Ejecución especulativa
La ejecución especulativa con un problema de instrucción fuera de orden a menudo es capaz de encontrar trabajo útil para completar la latencia durante un hit de caché L1, pero generalmente se queda sin trabajo útil después de 10 o 20 ciclos más o menos. Ha habido varios intentos de aumentar la cantidad de trabajo que se puede hacer durante una falta de latencia larga. Una idea era intentar hacer predicciones de valor (Lipasti, Wilkerson y Shen, (ASPLOS-VII): 138-147, 1996). Esta idea estuvo muy de moda en los círculos de investigación de arquitectura académica durante un tiempo, pero parece no funcionar en la práctica. Un último intento de salvar la predicción del valor del basurero de la historia fue la ejecución runahead(Mutlu, Stark, Wilkerson y Patt (HPCA-9): 129, 2003). En la ejecución de runahead, reconoce que sus predicciones de valor van a estar equivocadas, pero ejecute de forma especulativa de todos modos y luego descarte todo el trabajo basado en la predicción, en la teoría de que al menos comenzará algunas captaciones previas para lo que de otro modo sería caché L2 echa de menos Resulta que el runahead desperdicia tanta energía que simplemente no vale la pena.
Un enfoque final en este sentido, que puede estar obteniendo cierta tracción en la industria, implica crear buffers de pedidos enormemente largos. Las instrucciones se ejecutan especulativamente en función de la predicción de rama, pero no se realiza ninguna predicción de valor. En cambio, todas las instrucciones que dependen de una carga de latencia larga omiten sentarse y esperar en el búfer de reordenamiento. Pero dado que el búfer de reordenamiento es tan grande que puede seguir buscando instrucciones si el predictor de bifurcación está haciendo un trabajo decente, a veces podrá encontrar trabajo útil mucho más tarde en la secuencia de instrucciones. Un artículo de investigación influyente en esta área fueron las tuberías de flujo continuo(Srinivasan, Rajwar, Akkary, Gandhi y Upton (ASPLOS-XI): 107-119, 2004). (A pesar del hecho de que todos los autores son de Intel, creo que la idea obtuvo más tracción en AMD).
Multihilo
El uso de múltiples subprocesos para la tolerancia de latencia tiene una historia mucho más larga, con un éxito mucho mayor en la industria. Todas las versiones exitosas utilizan soporte de hardware para subprocesos múltiples. La versión más simple (y más exitosa) de esto es lo que a menudo se llama FGMT (multihilo de grano fino ) o multihilo intercalado . Cada núcleo de hardware admite contextos de subprocesos múltiples (un contexto es esencialmente el estado del registro, incluidos los registros como el puntero de instrucción y cualquier registro de banderas implícito). En un procesador multihilo de grano fino, cada hilo se procesa en-orden. El procesador realiza un seguimiento de qué subprocesos están detenidos en un error de carga de latencia larga y cuáles están listos para su próxima instrucción y utiliza una estrategia de programación FIFO simple en cada ciclo para elegir qué subproceso listo para ejecutar ese ciclo. Un primer ejemplo de esto a gran escala fueron los procesadores HEP de Burton Smith (Burton Smith diseñó la supercomputadora Tera, que también era un procesador multihilo de grano fino). Pero la idea va mucho más atrás, en la década de 1960, creo.
FGMT es particularmente efectivo en las cargas de trabajo de transmisión. Todas las GPU modernas (unidades de procesamiento de gráficos) son multinúcleo donde cada núcleo es FGMT, y el concepto también se usa ampliamente en otros dominios informáticos. El T1 de Sun también era FMGT multinúcleo, y también lo es el Xeon Phi de Intel (el procesador que a menudo todavía se llama "MIC" y solía llamarse "Larabee").
La idea de subprocesamiento múltiple simultáneo (Tullsen, Eggers y Levy, (ISCA-22): 392-403, 1995) combina el subprocesamiento múltiple de hardware con la ejecución especulativa. El procesador tiene múltiples contextos de subprocesos, pero cada subproceso se ejecuta de forma especulativa y fuera de orden. Un programador más sofisticado puede usar varias heurísticas para obtener el hilo que probablemente tenga un trabajo útil ( Malik, Agarwal, Dhar y Frank, (HPCA-14: 50-61), 2008 ). Cierta gran compañía de semiconductores comenzó a usar el término hyperthreading para multithreading simultáneo, y ese nombre parece ser el más utilizado en estos días.
Problemas de microarquitectura de bajo nivel
Después de releer sus comentarios, me di cuenta de que también está interesado en la señalización que se produce entre el procesador y la memoria. Los cachés modernos generalmente permiten que múltiples fallas se destaquen simultáneamente. Esto se llama caché sin bloqueo (Kroft, (ISCA-8): 81-87, 1981). (Pero el documento es difícil de encontrar en línea, y algo difícil de leer. Respuesta breve: hay mucha contabilidad, pero solo hay que lidiar con ella. La estructura de contabilidad de hardware se llama MSHR (registro de retención de información / estado de falta) ), que es el nombre que Kroft le dio en su artículo de 1981).