La località è importante anche per la DRAM stessa, anche per il caching. Una scrittura burst di 64 byte contigui per una cache line sporca è molto più veloce di 16 scritture da 4B a 16 indirizzi diversi. O per dirla in un altro modo, scrivere di nuovo un'intera linea di cache non è molto più lento di scrivere solo pochi byte modificati in una linea di cache.
What Every Programmer Should Know About Memory, di Ulrich Drepper, spiega molte cose su come evitare i colli di bottiglia della memoria durante la programmazione. Include alcuni dettagli sull'indirizzamento DRAM. I controller DRAM devono selezionare una riga e quindi selezionare una colonna. L'accesso a un'altra pagina di memoria virtuale può anche causare una mancanza TLB.
DRAM dispone di un comando di trasferimento a raffica per il trasferimento di un blocco sequenziale di dati. (Ovviamente progettato per il beneficio delle CPU che scrivono le linee della cache). Il sistema di memoria nei computer moderni è ottimizzato per il modello di utilizzo della scrittura di intere linee di cache, perché è quello che succede quasi sempre.
Le linee della cache sono l'unità su cui le CPU tracciano tracce di sporco o meno. Sarebbe possibile tracciare lo sporco con una linea più piccola rispetto alle linee cache attuali o non, ma ciò richiederebbe transistor aggiuntivi e non ne vale la pena. I livelli multipli di cache sono impostati per trasferire intere linee di cache, in modo che possano essere il più veloci possibile quando è necessario leggere un'intera riga della cache.
Esistono letture/scritture non temporali (movnti/movntdqa
) che ignorano la cache. Questi sono per l'uso con i dati che non saranno toccati di nuovo fino a quando non sarebbero stati sfrattati dalla cache comunque (da qui il non temporale).Sono una cattiva idea per i dati che potrebbero trarre vantaggio dalla memorizzazione nella cache, ma consentirebbero di scrivere 4 byte in memoria, anziché un'intera riga della cache. A seconda del MTRR per quell'intervallo di memoria, la scrittura potrebbe o non potrebbe essere soggetta a combinazioni di scrittura. (Questo è rilevante per le regioni di I/O mappate in memoria, dove due scritture 4B adiacenti non sono le stesse di una scrittura 8B.)
L'algoritmo che tocca solo due linee di cache ha certamente il vantaggio su quel punteggio, a meno che ci vuole molto più calcolo, o soprattutto ramificazione, per capire quale memoria scrivere. Forse fai una domanda diversa se vuoi aiutare a decidere. (vedi i link a https://stackoverflow.com/tags/x86/info, esp Agner Fog's guides, per informazioni che ti aiuteranno a decidere da solo.)
Vedere la risposta di Cornstalks per gli avvertimenti sui pericoli di avere più thread su diverse CPU che toccano la stessa memoria. Questo può portare a rallentamenti maggiori rispetto alle scritture extra per un programma a thread singolo.
Perché i downvotes? Questa è una bella domanda! – inf
@inf Un problema con la domanda è l'uso del termine "CPU Intel Xeon" non fa una distinzione utile qui. Il marchio Xeon è stato applicato alle CPU Intel x86 dall'architettura Pentium II. Tecnicamente non denota in realtà un tipo diverso di processore, tanto più che denota un diverso tipo di cliente verso il quale i processori sono commercializzati. Limitando la domanda solo alle CPU di "classe enterprise", è meno utile di quella che si è appena posta sulle CPU Intel x86 in generale. La risposta sarà la stessa in entrambi i casi. –
@RossRidge Bene, quindi, semplicemente chiedere chiarimenti a quale architettura si sta riferendo e non andare su una follia di downvote. – inf