"Coalescenza" può anche riferirsi a modelli di accesso alla memoria a coalescenza . In questo utilizzo, coalescenza viene utilizzata per assicurarsi che i thread vengano eseguiti contemporaneamente, provare ad accedere alla memoria che si trova nelle vicinanze. Questo di solito perché:
- La memoria viene in genere recuperata in blocchi di grandi dimensioni dalla RAM.
- Alcune unità di elaborazione tenteranno di prevedere futuri accessi alla memoria e di memorizzare la cache in anticipo, pur elaborando parti più vecchie della memoria.
- La memoria viene memorizzata nella cache in una gerarchia di cache successivamente più grandi ma più lente.
Pertanto, è importante creare programmi in grado di utilizzare modelli di memoria prevedibili. È ancora più importante con un programma thread, in modo che le richieste di memoria non saltino dappertutto; in caso contrario l'unità di elaborazione attenderà che le richieste di memoria siano soddisfatte.
Diagrammi ispirati all'introduzione alla programmazione parallela: lezione GPU Hardware 2 e schemi di comunicazione parallela :
Sotto: quattro thread, con accesso uniforme alla memoria. Il rettangolo tratteggiato nero rappresenta una singola richiesta di memoria di 4 parole.
Gli accessi alla memoria sono vicini e possono essere recuperati in un colpo / blocco (o il numero minimo di richieste).
Tuttavia, se aumentiamo la " falcata " dell'accesso tra i thread, richiederà molti più accessi alla memoria. Sotto: altri quattro thread, con un passo di due.
Qui puoi vedere che questi 4 thread richiedono 2 richieste di blocchi di memoria. Più piccolo è il passo, meglio è. Maggiore è il passo, maggiori sono le richieste potenzialmente richieste.
Naturalmente, peggio di un grande passo di memoria è un modello di accesso alla memoria casuale. Questi saranno quasi impossibili da pipeline, cache o prevedere.
Fonti TikZ: