Compromessi software hardware
Esistono molti metodi per ridurre il costo dell'hardware. Un metodo consiste nell'integrare l'assistenza alla comunicazione e la rete in modo meno stretto nel nodo di elaborazione e aumentare la latenza e l'occupazione delle comunicazioni.
Un altro metodo consiste nel fornire la replica automatica e la coerenza nel software anziché nell'hardware. Quest'ultimo metodo fornisce replica e coerenza nella memoria principale e può essere eseguito con una varietà di granularità. Consente l'uso di parti di base standard per i nodi e l'interconnessione, riducendo al minimo il costo dell'hardware. Questo mette sotto pressione il programmatore per ottenere buone prestazioni.
Modelli di consistenza della memoria rilassata
Il modello di consistenza della memoria per uno spazio di indirizzi condiviso definisce i vincoli nell'ordine in cui le operazioni di memoria nelle stesse o diverse posizioni sembrano essere eseguite l'una rispetto all'altra. In realtà, qualsiasi livello di sistema che supporta un modello di denominazione dello spazio di indirizzi condiviso deve avere un modello di coerenza della memoria che include l'interfaccia del programmatore, l'interfaccia del sistema utente e l'interfaccia hardware-software. Il software che interagisce con quel livello deve essere consapevole del proprio modello di consistenza della memoria.
Specifiche di sistema
La specifica di sistema di un'architettura specifica l'ordinamento e il riordino delle operazioni di memoria e quante prestazioni possono essere effettivamente ottenute da esso.
Di seguito sono riportati i pochi modelli di specifica che utilizzano i rilassamenti nell'ordine del programma:
Relaxing the Write-to-Read Program Order- Questa classe di modelli consente all'hardware di sopprimere la latenza delle operazioni di scrittura che è stata persa nella memoria cache di primo livello. Quando la scrittura mancata è nel buffer di scrittura e non è visibile ad altri processori, il processore può completare le letture che hanno colpito nella sua memoria cache o anche una singola lettura che manca nella sua memoria cache.
Relaxing the Write-to-Read and Write-to-Write Program Orders- Consentendo alle scritture di ignorare le precedenti scritture in sospeso in varie posizioni, è possibile unire più scritture nel buffer di scrittura prima di aggiornare la memoria principale. Pertanto, più scritture mancano da sovrapporre e diventano visibili fuori ordine. La motivazione è di ridurre ulteriormente l'impatto della latenza di scrittura sul tempo di interruzione del processore e di aumentare l'efficienza della comunicazione tra i processori rendendo i nuovi valori dei dati visibili ad altri processori.
Relaxing All Program Orders- Nessun ordine di programma è garantito per impostazione predefinita, ad eccezione dei dati e delle dipendenze di controllo all'interno di un processo. Pertanto, il vantaggio è che le richieste di lettura multiple possono essere in sospeso allo stesso tempo, e nell'ordine del programma possono essere ignorate da scritture successive e possono esse stesse completate fuori ordine, permettendoci di nascondere la latenza di lettura. Questo tipo di modelli è particolarmente utile per processori programmati dinamicamente, che possono continuare le letture perse in passato su altri riferimenti di memoria. Consentono molti dei riordinamenti, anche l'eliminazione degli accessi effettuati dalle ottimizzazioni del compilatore.
L'interfaccia di programmazione
Le interfacce di programmazione presumono che gli ordini di programma non debbano essere affatto mantenuti tra le operazioni di sincronizzazione. È garantito che tutte le operazioni di sincronizzazione siano esplicitamente etichettate o identificate come tali. La libreria runtime o il compilatore traduce queste operazioni di sincronizzazione nelle appropriate operazioni di conservazione dell'ordine richieste dalle specifiche del sistema.
Il sistema garantisce quindi esecuzioni coerenti in sequenza anche se può riordinare le operazioni tra le operazioni di sincronizzazione in qualsiasi modo desideri senza interrompere le dipendenze da una posizione all'interno di un processo. Ciò consente al compilatore una flessibilità sufficiente tra i punti di sincronizzazione per i riordini che desidera e garantisce anche al processore di eseguire tutti i riordinamenti consentiti dal suo modello di memoria. All'interfaccia del programmatore, il modello di coerenza dovrebbe essere debole almeno quanto quello dell'interfaccia hardware, ma non è necessario che sia lo stesso.
Meccanismi di traduzione
Nella maggior parte dei microprocessori, tradurre le etichette in meccanismi di mantenimento dell'ordine equivale a inserire un'istruzione di barriera di memoria adatta prima e / o dopo ogni operazione etichettata come sincronizzazione. Salverebbe le istruzioni con i singoli carichi / negozi indicando quali ordini applicare ed evitando istruzioni aggiuntive. Tuttavia, poiché le operazioni sono solitamente poco frequenti, questo non è il modo in cui la maggior parte dei microprocessori ha preso finora.
Superamento dei limiti di capacità
Abbiamo discusso i sistemi che forniscono replica automatica e coerenza nell'hardware solo nella memoria cache del processore. Una cache del processore, senza prima essere replicata nella memoria principale locale, replica i dati allocati in remoto direttamente su riferimento.
Un problema con questi sistemi è che l'ambito della replica locale è limitato alla cache hardware. Se un blocco viene sostituito dalla memoria cache, deve essere recuperato dalla memoria remota quando è nuovamente necessario. Lo scopo principale dei sistemi discussi in questa sezione è risolvere il problema della capacità di replica, fornendo comunque coerenza nell'hardware e granularità fine dei blocchi della cache per l'efficienza.
Cache terziarie
Per risolvere il problema della capacità di replica, un metodo consiste nell'utilizzare una cache di accesso remoto grande ma più lenta. Ciò è necessario per la funzionalità, quando i nodi della macchina sono essi stessi multiprocessori su piccola scala e possono essere semplicemente ingranditi per le prestazioni. Conterrà anche blocchi remoti replicati che sono stati sostituiti dalla memoria cache del processore locale.
Cache-only Memory Architectures (COMA)
Nelle macchine COMA, ogni blocco di memoria dell'intera memoria principale ha un tag hardware ad esso collegato. Non esiste un nodo fisso in cui è sempre garantito lo spazio allocato per un blocco di memoria. I dati migrano dinamicamente o vengono replicati nelle memorie principali dei nodi che li accedono / li attraggono. Quando si accede a un blocco remoto, viene replicato nella memoria dell'attrazione e portato nella cache, ed è mantenuto coerente in entrambi i punti dall'hardware. Un blocco dati può risiedere in qualsiasi memoria di attrazione e può spostarsi facilmente da uno all'altro.
Riduzione dei costi hardware
Ridurre i costi significa spostare alcune funzionalità dell'hardware specializzato nel software in esecuzione sull'hardware esistente. È molto più facile per il software gestire la replica e la coerenza nella memoria principale che nella cache dell'hardware. I metodi a basso costo tendono a fornire replica e coerenza nella memoria principale. Affinché la coerenza sia controllata in modo efficiente, ciascuno degli altri componenti funzionali dell'assistenza può trarre vantaggio dalla specializzazione e dall'integrazione dell'hardware.
Gli sforzi di ricerca mirano a ridurre i costi con approcci diversi, ad esempio eseguendo il controllo dell'accesso in hardware specializzato, ma assegnando altre attività a software e hardware di base. Un altro approccio consiste nell'eseguire il controllo degli accessi nel software ed è progettato per assegnare un'astrazione coerente dello spazio di indirizzamento condiviso su nodi e reti commodity senza supporto hardware specializzato.
Implicazioni per il software parallelo
Il modello di consistenza della memoria rilassata richiede che i programmi paralleli etichettino gli accessi in conflitto desiderati come punti di sincronizzazione. Un linguaggio di programmazione fornisce il supporto per etichettare alcune variabili come sincronizzazione, che verrà quindi tradotta dal compilatore nell'istruzione di conservazione dell'ordine adatta. Per limitare il riordino degli accessi alla memoria condivisa da parte dei compilatori, il compilatore può utilizzare le etichette da solo.