Tolleranza alla latenza
La velocità dei microprocessori è aumentata di oltre un fattore dieci per decennio, ma la velocità delle memorie commodity (DRAM) è solo raddoppiata, ovvero il tempo di accesso è dimezzato. Pertanto, la latenza dell'accesso alla memoria in termini di cicli di clock del processore cresce di sei volte in 10 anni. I multiprocessori hanno intensificato il problema.
Nei sistemi basati su bus, la creazione di un bus a larghezza di banda elevata tra il processore e la memoria tende ad aumentare la latenza nell'ottenere i dati dalla memoria. Quando la memoria è distribuita fisicamente, la latenza della rete e dell'interfaccia di rete si aggiunge a quella dell'accesso alla memoria locale sul nodo.
La latenza di solito cresce con le dimensioni della macchina, poiché più nodi implicano più comunicazione rispetto al calcolo, più salti nella rete per la comunicazione generale e probabilmente più contese. L'obiettivo principale della progettazione hardware è ridurre la latenza dell'accesso ai dati mantenendo una larghezza di banda elevata e scalabile.
Panoramica sulla tolleranza alla latenza
Il modo in cui viene gestita la tolleranza alla latenza si comprende meglio osservando le risorse nella macchina e come vengono utilizzate. Dal punto di vista del processore, l'architettura di comunicazione da un nodo all'altro può essere vista come una pipeline. Le fasi della pipeline includono interfacce di rete all'origine e alla destinazione, nonché nei collegamenti di rete e negli switch lungo il percorso. Esistono anche fasi dell'assistenza alla comunicazione, del sistema di memoria / cache locale e del processore principale, a seconda di come l'architettura gestisce la comunicazione.
Il problema di utilizzo nella struttura di comunicazione di base è o il processore o l'architettura di comunicazione è occupata in un dato momento e nella pipeline di comunicazione solo uno stadio è occupato alla volta mentre la singola parola trasmessa si fa strada dalla sorgente alla destinazione. L'obiettivo nella tolleranza alla latenza è quello di sovrapporre il più possibile l'uso di queste risorse.
Tolleranza alla latenza nel passaggio di messaggi espliciti
Il trasferimento effettivo dei dati durante il passaggio dei messaggi è in genere avviato dal mittente, utilizzando un'operazione di invio. Un'operazione di ricezione non motiva di per sé i dati da comunicare, ma piuttosto copia i dati da un buffer in entrata nello spazio degli indirizzi dell'applicazione. La comunicazione avviata dal destinatario viene eseguita inviando un messaggio di richiesta al processo che è l'origine dei dati. Il processo quindi restituisce i dati tramite un altro invio.
Un'operazione di invio sincrono ha una latenza di comunicazione pari al tempo necessario per comunicare tutti i dati nel messaggio alla destinazione, al tempo per l'elaborazione della ricezione e al tempo per la restituzione di un riconoscimento. La latenza di un'operazione di ricezione sincrona è il suo sovraccarico di elaborazione; che include la copia dei dati nell'applicazione e la latenza aggiuntiva se i dati non sono ancora arrivati. Vorremmo nascondere queste latenze, comprese le spese generali se possibile, ad entrambe le estremità.
Tolleranza alla latenza in uno spazio di indirizzi condiviso
La comunicazione di base avviene tramite letture e scritture in uno spazio di indirizzi condiviso. Per comodità, si chiama comunicazione di lettura-scrittura. La comunicazione avviata dal destinatario viene eseguita con operazioni di lettura che determinano l'accesso ai dati dalla memoria o dalla cache di un altro processore. Se non è presente la memorizzazione nella cache dei dati condivisi, la comunicazione avviata dal mittente può essere eseguita tramite scritture sui dati allocati nelle memorie remote.
Con la coerenza della cache, l'effetto delle scritture è più complesso: le scritture portano alla comunicazione avviata dal mittente o dal destinatario dipende dal protocollo di coerenza della cache. Che sia avviata dal destinatario o avviata dal mittente, la comunicazione in uno spazio di indirizzi condiviso in lettura e scrittura supportato da hardware è naturalmente a grana fine, il che rende la latenza di tolleranza molto importante.
Blocca il trasferimento dei dati in uno spazio di indirizzi condiviso
In uno spazio di indirizzi condiviso, tramite hardware o software la fusione dei dati e l'avvio di trasferimenti a blocchi possono essere eseguiti esplicitamente nel programma utente o in modo trasparente dal sistema. I trasferimenti a blocchi espliciti vengono avviati eseguendo un comando simile a un invio nel programma utente. Il comando di invio è spiegato dall'assistenza alla comunicazione, che trasferisce i dati in modo pipeline dal nodo di origine alla destinazione. A destinazione, l'assistenza alla comunicazione preleva le parole di dati dall'interfaccia di rete e le memorizza nelle posizioni specificate.
Ci sono due differenze principali dal passaggio di messaggi di invio-ricezione, entrambe derivano dal fatto che il processo di invio può specificare direttamente le strutture dati del programma in cui i dati devono essere collocati a destinazione, poiché queste posizioni si trovano nello spazio degli indirizzi condiviso .
Processo di eventi a lunga latenza passati in uno spazio di indirizzi condiviso
Se l'operazione di memoria viene eseguita senza blocco, un processore può procedere oltre un'operazione di memoria ad altre istruzioni. Per le scritture, questo di solito è abbastanza semplice da implementare se la scrittura viene inserita in un buffer di scrittura e il processore va avanti mentre il buffer si occupa di inviare la scrittura al sistema di memoria e monitorarne il completamento come richiesto. La differenza è che, a differenza di una scrittura, una lettura è generalmente seguita molto presto da un'istruzione che necessita del valore restituito dalla lettura.
Pre-comunicazione in uno spazio di indirizzi condiviso
La pre-comunicazione è una tecnica che è già stata ampiamente adottata nei microprocessori commerciali e la sua importanza è destinata ad aumentare in futuro. Un'istruzione di precaricamento non sostituisce la lettura effettiva dell'elemento dati e l'istruzione di precaricamento stessa deve essere non bloccante, se si vuole raggiungere il suo obiettivo di nascondere la latenza attraverso la sovrapposizione.
In questo caso, poiché i dati condivisi non vengono memorizzati nella cache, i dati precaricati vengono inseriti in una struttura hardware speciale chiamata buffer di precaricamento. Quando la parola viene effettivamente letta in un registro nella successiva iterazione, viene letta dall'intestazione del buffer di prefetch piuttosto che dalla memoria. Se la latenza da nascondere fosse molto maggiore del tempo necessario per calcolare l'iterazione di un singolo ciclo, precaricheremmo diverse iterazioni in anticipo e ci sarebbero potenzialmente diverse parole alla volta nel buffer di prefetch.
Multithreading in uno spazio di indirizzi condiviso
In termini di nascondere diversi tipi di latenza, il multithreading supportato dall'hardware è forse la tecnica versatile. Presenta i seguenti vantaggi concettuali rispetto ad altri approcci:
Non richiede analisi o supporto software speciali.
Poiché viene invocato dinamicamente, può gestire situazioni imprevedibili, come conflitti di cache, ecc. Così come quelle prevedibili.
Come il precaricamento, non cambia il modello di consistenza della memoria poiché non riordina gli accessi all'interno di un thread.
Mentre le tecniche precedenti mirano a nascondere la latenza di accesso alla memoria, il multithreading può potenzialmente nascondere la latenza di qualsiasi evento a latenza lunga con la stessa facilità, purché l'evento possa essere rilevato in fase di esecuzione. Ciò include anche la sincronizzazione e la latenza delle istruzioni.
Questa tendenza potrebbe cambiare in futuro, poiché le latenze stanno diventando sempre più lunghe rispetto alle velocità del processore. Anche con microprocessori più sofisticati che forniscono già metodi che possono essere estesi per il multithreading, e con nuove tecniche di multithreading in fase di sviluppo per combinare il multithreading con il parallelismo a livello di istruzione, questa tendenza sembra certamente subire qualche cambiamento in futuro.