2015-08-18 12 views

risposta

5

Il carico di streaming intrinseco (mm_stream_load_si128) esegue il caricamento "utilizzando un suggerimento di memoria non temporale" (in base allo Intel Intrinsics Guide). Ciò significa che il valore caricato non causerà l'espulsione dalla cache.

Questo è utile se si assemblano molti dati insieme su cui si intende operare immediatamente e non si guardano più per un "lungo" tempo. Più comunemente questo accade durante le operazioni di streaming. L'ho usato quando so che sto eseguendo una semplice operazione su un grande set di dati, dove so che i dati verranno rapidamente sfrattati dalla cache comunque. Anche operazioni come memcpy rientrano in questa categoria.

Il carico non di streaming (mm_load_si128) recupererà il valore e sarà soggetto alle normali regole di memorizzazione nella cache. Può rimuovere le vecchie voci della cache, se necessario, e sarà in grado di essere recuperato dalla cache fino a quando non sarà sfrattato.

Se si prevede di utilizzare nuovamente i dati prima che si verifichi uno svuotamento della cache normale, viene preferito il carico non di streaming. Se si sta operando su un set di dati di grandi dimensioni in cui non è previsto l'accesso a una determinata porzione di dati prima che venisse eseguito il kickout dalla cache, viene preferito il carico di streaming.

+0

Non capisco, perché questo è utile per memcpy di altri codici che accedono a blocchi continui o RAM? La linea cache è 64 byte = 4x __m128i, cioè averla memorizzata nella cache accelera i prossimi 3 carichi di un fattore enorme? – Soonts

+0

Sulla base dell'ultimo commento di un vecchio argomento al riguardo: https://software.intel.com/en-us/forums/intel-isa-extensions/topic/597075 Supponendo che CPU ottimizzi tale lettura su tutti i dati è caricato in un buffer della dimensione della riga della cache, che è separato dalla cache dei dati. Non ci sono molti di questi buffer disponibili in modo ottimale quando il contenuto del buffer viene letto nelle istruzioni successive, altrimenti potrebbe essere perso e necessitava di essere riacquisito con penalità potenzialmente elevate. E la copia in sé non sarà più veloce di quella memorizzata nella cache, ma non eliminerà tutto il working set dalla cache. – user377178