Domanda

Questa è una domanda un po' di basso livello.Nell'assembly x86 ci sono due istruzioni SSE:

MOVDQA xmmi, m128

E

MOVNTDQA xmmi, m128

Il Manuale per gli sviluppatori di software IA-32 afferma che NT in MOVNTDQA sta per Non temporale, e che per il resto è uguale a MOVDQA.

La mia domanda è: cosa fa? Non temporale Significare?

È stato utile?

Soluzione

Le istruzioni SSE non temporali (MOVNTI, MOVNTQ e così via) non seguono le normali regole di coerenza della cache.Pertanto gli archivi non temporali devono essere seguiti da un'istruzione SFENCE affinché i loro risultati possano essere visti tempestivamente da altri processori.

Quando i dati vengono prodotti e non (immediatamente) consumati nuovamente, il fatto che le operazioni di archiviazione della memoria leggano prima l'intera riga della cache e quindi modifichino i dati memorizzati nella cache è dannoso per le prestazioni.Questa operazione spinge fuori dalle cache i dati che potrebbero essere nuovamente necessari a favore di dati che non verranno utilizzati a breve.Ciò è particolarmente vero per strutture dati di grandi dimensioni, come le matrici, che vengono riempite e quindi utilizzate successivamente.Prima che l'ultimo elemento della matrice venga riempito, la dimensione sfratta i primi elementi, rendendo inefficace la memorizzazione nella cache delle scritture.

Per questa e situazioni simili, i processori forniscono supporto per operazioni di scrittura non temporale.Non temporale in questo contesto significa che i dati non verranno riutilizzati a breve, quindi non vi è motivo di memorizzarli nella cache.Queste operazioni di scrittura non temporale non leggono una riga della cache per poi modificarla;invece, il nuovo contenuto viene scritto direttamente in memoria.

Fonte: http://lwn.net/Articles/255364/

Altri suggerimenti

Espo ha praticamente centrato l'obiettivo.Volevo solo aggiungere i miei due centesimi:

La frase "non temporale" significa priva di località temporale.Le cache sfruttano due tipi di località: spaziale e temporale e, utilizzando un'istruzione non temporale, segnali al processore che non prevedi che l'elemento dati venga utilizzato nel prossimo futuro.

Sono un po' scettico riguardo all'assembly codificato manualmente che utilizza le istruzioni di controllo della cache.Nella mia esperienza queste cose portano a bug più dannosi di qualsiasi aumento effettivo delle prestazioni.

Secondo il Manuale per sviluppatori di software per architetture Intel® 64 e IA-32, volume 1:Architettura di base ", Programmazione con Intel Streaming SIMD Extensions (Intel SSE)" Capitolo:

Caching di Temporale vs.Dati non temporali

I dati a cui fa riferimento un programma possono essere temporanei (i dati verranno utilizzati nuovamente) o non temporali (i dati verranno referenziati una volta e non verranno riutilizzati nell'immediato futuro).Ad esempio, il codice del programma è generalmente temporale, mentre i dati multimediali, come l'elenco di visualizzazione in un'applicazione di grafica 3D, sono spesso non temporali.Per utilizzare in modo efficiente le cache del processore, è generalmente preferibile memorizzare nella cache i dati temporali e non i dati non temporali.Il sovraccarico delle cache del processore con dati non temporali viene talvolta definito "inquinamento delle cache".Le istruzioni di controllo della cacheabilità SSE e SSE2 consentono a un programma di scrivere dati non temporali in memoria in modo da ridurre al minimo l'inquinamento delle cache.

Descrizione delle istruzioni di caricamento e memorizzazione non temporali.Fonte:Manuale dello sviluppatore software per architetture Intel 64 e IA-32, volume 2:Riferimento al set di istruzioni

LOAD (MOVNTDQA—Carica suggerimento allineato non temporale a doppia quadword)

Carica una doppia quadword dall'operando di origine (secondo operando) all'operando di destinazione (primo operando) utilizzando un suggerimento non temporale se l'origine della memoria è di tipo memoria WC (combinazione di scrittura) [...]

[...] il processore non legge i dati nella gerarchia della cache, né recupera la corrispondente riga della cache dalla memoria nella gerarchia della cache.

Si noti che, come commenta Peter Cordes, non è utile sulla normale memoria WB (writeback) sui processori attuali perché l'hint NT viene ignorato (probabilmente perché non ci sono prefetcher HW compatibili con NT) e si applica la semantica di caricamento completamente ordinata in modo forte . prefetchnta può essere utilizzato come carico di riduzione dell'inquinamento dalla memoria WB

STORE (MOVNTDQ: memorizza interi compressi utilizzando un suggerimento non temporale)

Sposta gli interi compressi nell'operando di origine (secondo operando) nell'operando di destinazione (primo operando) utilizzando un suggerimento non temporale per impedire la memorizzazione nella cache dei dati durante la scrittura in memoria.

[...] il processore non scrive i dati nella gerarchia della cache, né recupera la corrispondente riga della cache dalla memoria nella gerarchia della cache.

Utilizzando la terminologia definita in Policy e prestazioni di scrittura nella cache, possono essere considerati write-around (no-write-allocate, no-fetch-on-write-miss).

Infine, potrebbe essere interessante rivedere John McAlpin nota sui negozi non temporali.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top