Questo tipo di gestione della memoria: dire alla cpu (in anticipo) a quale contenuto si accede frequentemente, è davvero difficile da fare per una vasta gamma di problemi di programmazione, in cui le strutture dati implicano puntatori e simili.
Eppure è (per confronto) più facile da fare per alcuni algoritmi a fette parallele, come nel dominio grafico. Nel dominio della grafica, hai a che fare con grossi pezzi di dati contigui (numerici) e con un numero di puntatori decisamente inferiore.
Quindi, le moderne CPU optano per la gestione della cache automaticamente, utilizzando cache multilivello che alla fine finiscono con la memoria basata su disco. Ogni livello della cache nota la frequenza con cui viene utilizzata una porzione di memoria memorizzata nella cache e utilizza tali informazioni quando decide di rimuovere qualcosa dal livello della cache. Ogni livello ha una diversa dimensione di "pagina" (chiamata dimensione della linea nei livelli superiori).
Quindi, non c'è praticamente alcun modo per un programmatore di informare la CPU di cosa tenere e cosa eliminare, a causa della combinazione di dimensioni multilinea e di cache di ogni livello. Ok, quindi è già abbastanza brutto, ma ora, getta dentro che lo stesso programma vuole essere eseguito su più cpus differenti di prestazioni diverse (dove gran parte della differenza di prestazioni deriva dall'aumento delle dimensioni della cache, del numero di livelli di cache, ecc.), E , quindi questo diventa un problema intrattabile per il programmatore che si occupa di algoritmi e strutture dati generali.
Ciò che un programmatore può fare, quindi, invece di informare la cpu su cosa mantenere / sfrattare, è cercare di co-localizzare gli elementi correlati (ad esempio A e B) in modo che attraverso tutte le possibili variazioni di cpu e cache multi-livello, se A è nella cache, allora lo è anche B. (Ci sono altre cose che i programmatori possono tentare di mantenere i programmi cache friendly, puoi google "cache friendly" struttura dati o algoritmi.)
Un'altra differenza è che la memoria della GPU è separata dalla memoria della CPU, quindi la programmazione della GPU implica necessariamente lo spostamento della memoria avanti e indietro. Mentre la CPU ha errori di cache e di pagine che caricano automaticamente la memoria che non è vicina alla CPU, la GPU (storicamente) non ha questi meccanismi ei programmatori della GPU devono costantemente istruire la GPU per copiare la memoria avanti e indietro tra la memoria della GPU e la memoria della CPU. Questo è stato ed è sempre più un problema poiché usiamo le GPU per risolvere più problemi, quindi alla fine vedremo sempre più hardware abbattere la barriera tra la memoria della CPU e la memoria della GPU, con conseguente unificazione a livelli più alti della gerarchia della cache.