Nelle schede madri x86 / x64 di oggi si possono trovare IOMMU di Intel e AMD. Consentono ai dispositivi periferici di eseguire operazioni DMA (accesso diretto alla memoria) nella RAM di sistema utilizzando indirizzi di memoria virtuali anziché fisici.
Supponiamo ora che il dispositivo periferico che esegue l'operazione DMA utilizzando IOMMU contenga memoria per memorizzare nella cache la RAM di sistema, al fine di ottimizzare l'elaborazione dei dati a cui si accede frequentemente. Come è possibile garantire la coerenza della memoria tra la cache del dispositivo periferico e la RAM di sistema in questo caso? Ogni volta che il dispositivo periferico modifica alcuni dati nella sua cache senza riscriverli nella RAM di sistema, qualsiasi accesso alla stessa memoria dalla CPU toccherebbe i dati obsoleti.
L'unica opzione efficiente che posso vedere è che il dispositivo periferico dice a IOMMU di invalidare ogni pagina che legge dalla RAM di sistema, poiché questa pagina sarebbe da quel momento in poi memorizzata nella cache dal dispositivo periferico. Ogni volta che la CPU accede a qualsiasi pagina precedentemente letta dal dispositivo periferico, viene generato un errore di pagina. Di conseguenza, un gestore di errori di pagina si occuperebbe di svuotare la pagina dalla cache del dispositivo periferico e di rileggerla nella RAM di sistema.
È possibile qualcosa del genere? In particolare, il modello di programmazione HSA imminente mi fa credere, poiché una delle sue caratteristiche principali è uno spazio di memoria unificato che è condiviso tra le CPU e le unità di elaborazione periferiche. Dato che quelle unità di calcolo avranno probabilmente delle cache, il problema della coerenza della memoria deve essere già stato risolto in qualche modo.
Grazie per il tuo aiuto!
David