La latenza della memoria è uno dei problemi fondamentali studiati nella ricerca sull'architettura informatica.
Esecuzione speculativa
L'esecuzione speculativa con problema di istruzioni fuori servizio è spesso in grado di trovare lavoro utile da fare per colmare la latenza durante un hit della cache L1, ma di solito si esaurisce il lavoro utile dopo circa 10 o 20 cicli o giù di lì. Ci sono stati diversi tentativi per aumentare la quantità di lavoro che può essere fatto durante una mancanza a lunga latenza. Un'idea era quella di provare a fare previsioni di valore (Lipasti, Wilkerson e Shen, (ASPLOS-VII): 138-147, 1996). Questa idea è stata molto di moda nei circoli di ricerca dell'architettura accademica per un po 'ma sembra non funzionare nella pratica. Un ultimo tentativo per salvare la previsione del valore dalla pattumiera della storia è stata l'esecuzione di runahead(Mutlu, Stark, Wilkerson e Patt (HPCA-9): 129, 2003). Nell'esecuzione di runahead riconosci che le tue previsioni di valore saranno sbagliate, ma esegui comunque speculativamente e poi butta via tutto il lavoro basato sulla previsione, sulla teoria che almeno avvierai alcuni prefetch per quella che altrimenti sarebbe cache L2 manca. Si scopre che Runahead spreca così tanta energia da non valerne la pena.
Un approccio finale in questo senso che potrebbe avere una certa forza nell'industria comporta la creazione di buffer di riordino estremamente lunghi. Le istruzioni vengono eseguite in modo speculativo in base alla previsione del ramo, ma non viene eseguita alcuna previsione del valore. Invece tutte le istruzioni che dipendono da un carico a lunga latenza mancano di sit sit e attendono nel buffer di riordino. Ma poiché il buffer di riordino è così grande, puoi continuare a recuperare le istruzioni se il predittore di rami sta facendo un lavoro decente, a volte sarai in grado di trovare lavoro utile molto più tardi nel flusso di istruzioni. Un documento di ricerca influente in questo settore è stato il gasdotto a flusso continuo(Srinivasan, Rajwar, Akkary, Gandhi e Upton (ASPLOS-XI): 107-119, 2004). (Nonostante il fatto che gli autori provengano tutti da Intel, credo che l'idea abbia avuto maggiore trazione su AMD.)
Multi-threading
L'uso di più thread per la tolleranza di latenza ha una storia molto più lunga, con un successo molto maggiore nel settore. Tutte le versioni di successo utilizzano il supporto hardware per il multithreading. La versione più semplice (e di maggior successo) di questo è quella che viene spesso chiamata FGMT ( multi-threading a grana fine ) o multi-threading interfogliato . Ogni core hardware supporta più contesti di thread (un contesto è essenzialmente lo stato del registro, inclusi i registri come il puntatore dell'istruzione e tutti i registri dei flag impliciti). In un processore multi-threading grana fine ogni filo viene elaborato in-ordine. Il processore tiene traccia di quali thread sono bloccati in caso di mancanza di carico a lunga latenza e quali sono pronti per le loro istruzioni successive e utilizza una semplice strategia di pianificazione FIFO su ciascun ciclo per scegliere quale thread pronto eseguire quel ciclo. Un primo esempio di questo su larga scala furono i processori HEP di Burton Smith (Burton Smith progettò il supercomputer Tera, che era anche un processore multi-threading a grana fine). Ma l'idea va molto più indietro, negli anni '60, credo.
FGMT è particolarmente efficace sui carichi di lavoro in streaming. Tutte le moderne GPU (unità di elaborazione grafica) sono multicore in cui ogni core è FGMT e il concetto è ampiamente utilizzato anche in altri domini di elaborazione. Il T1 di Sun era anche FMGT multicore, così come lo è Xeon Phi di Intel (il processore che spesso viene ancora chiamato "MIC" e un tempo si chiamava "Larabee").
L'idea del Multithreading simultaneo (Tullsen, Eggers e Levy, (ISCA-22): 392-403, 1995) combina il multi-threading hardware con l'esecuzione speculativa. Il processore ha più contesti di thread, ma ogni thread viene eseguito in modo speculativo e fuori servizio. Uno scheduler più sofisticato può quindi utilizzare varie euristiche per recuperare dal thread che ha più probabilità di avere un lavoro utile ( Malik, Agarwal, Dhar e Frank, (HPCA-14: 50-61), 2008 ). Una certa grande azienda di semiconduttori ha iniziato a usare il termine hyperthreading per il multithreading simultaneo, e quel nome sembra essere quello più utilizzato in questi giorni.
Preoccupazioni microarchitetturali di basso livello
Mi sono reso conto dopo aver riletto i tuoi commenti che sei interessato anche alla segnalazione che passa tra processore e memoria. Le cache moderne di solito consentono a più missioni di essere contemporaneamente eccezionali. Questa è chiamata cache senza Lockup (Kroft, (ISCA-8): 81-87, 1981). (Ma il documento è difficile da trovare online e un po 'difficile da leggere. Risposta breve: c'è un sacco di contabilità ma ci si occupa solo di esso. La struttura di contabilità hardware si chiama MSHR (informazioni mancanti / registro di conservazione dello stato ), che è il nome che Kroft gli ha dato nel suo articolo del 1981).