Quando devo usare la versione di streaming e quando SSE2 vs _mm_load_si128? Qual è il trade-off delle prestazioni?SIMD intrinsec: _mm_stream_load_si128 vs _mm_load_si128
risposta
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.
- 1. SIMD vs Architetture vettoriali
- 2. newbie SIMD/SSE: semplice filtraggio di immagini
- 3. SIMD array add per lunghezze arbitrarie di array
- 4. Vettorializzazione (SIMD) Funzionamento dell'albero
- 5. Linguaggi di programmazione SIMD
- 6. Buona libreria SIMD portatile
- 7. OpenMP SIMD su Power8
- 8. SIMD il seguente codice
- 9. Throughput di latenza SIMD
- 10. Tecniche SIMD comuni
- 11. ARM NEON SIMD versione 2
- 12. (SIMD Extensions) SSE sostegno gcc
- 13. SSE SIMD Optimization per Loop
- 14. Tabella di ricerca utilizzando SIMD
- 15. Come posso utilizzare AES-NI intrinsec su un Mac?
- 16. Rotazione a 128 bit usando ARM Neon intrinsec
- 17. I tipi di vettore OpenCL usano SIMD
- 18. Tipi di SIMD vettoriali in Swift
- 19. Librerie matematiche SIMD per SSE e AVX
- 20. SSE (SIMD): moltiplicare il vettore per scalare
- 21. RyuJIT non utilizza completamente le intrinseche SIMD
- 22. Qual è il limite dell'ottimizzazione con SIMD?
- 23. Haskell esegue automaticamente le ottimizzazioni SIMD?
- 24. Come abilitare SIMD in un nuovo .NET Framework 4.6?
- 25. È possibile l'inversione della matrice 3x3 utilizzando le istruzioni SIMD?
- 26. ottimizzata 2x2 moltiplicazione matriciale: assemblaggio lenta rispetto SIMD veloce
- 27. SIMD e differenza tra doppia precisione compatta e scalare
- 28. In che modo i programmi Android utilizzano NEON SIMD?
- 29. Algoritmo SIMD ottimale per ruotare o trasporre una matrice
- 30. SIMD ne vale la pena? C'è un'opzione migliore?
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
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