Esiste un semplice tutorial per imparare a utilizzare SSE, SSE2 e SSE3 in GNU C++? Come si può fare l'ottimizzazione del codice in SSE?SSE SSE2 e SSE3 per GNU C++
risposta
Spiacente, non so di un tutorial.
La soluzione migliore (IMHO) è utilizzare SSE tramite le funzioni "intrinseche" che Intel fornisce per avvolgere (generalmente) le singole istruzioni SSE. Questi sono resi disponibili tramite una serie di file di inclusione denominati * mmintrin.h e.g xmmintrin.h è il set di istruzioni SSE originale.
Iniziare a familiarizzare con il contenuto dell'ottimizzazione Intel Reference Manual è una buona idea (vedere la sezione 4.3.1.2 per un esempio di elementi intrinseci) e le sezioni SIMD sono letture essenziali. I manuali di riferimento dei set di istruzioni sono anche molto utili, in quanto la documentazione di ogni istruzione include la funzione "intrinseca" a cui corrisponde.
Fare trascorrere qualche ora di ispezionare l'assembler generato dal compilatore da intrinseche (imparerete molto) e sulla misurazione dei profili/prestazioni (eviterete di sprecare time code SSE-zione per la redditività di sforzo).
Aggiornamento 2011-05-31: V'è una certa molto bello copertura delle intrinseche e vettorializzazione in di Agner Fog optimization PDFs (thanks) anche se è un po 'di diffusione (ad esempio, la sezione 12 della first one e la sezione 5 della second one) . Questi non sono esattamente materiale tutorial (in effetti c'è un avviso "questi manuali non sono per principianti") ma trattano giustamente SIMD (se usato tramite asm, intrinseca o compilazione di vettori) come solo una parte degli strumenti di ottimizzazione più grandi.
Aggiornamento 2012-10-04: A nice little Linux Journal article su gcc vector intrinsic merita una menzione qui. Più generale del semplice SSE (copre anche le estensioni PPC e ARM). C'è una buona raccolta di riferimenti sullo last page, che ha attirato la mia attenzione su Intel "intrinsics manual".
Controllare le opzioni -mtune e -march, -msse * e -mfpmath, naturalmente. Tutti questi consentono a GCC di eseguire ottimizzazioni specifiche per SSE.
Qualunque cosa al di là di questo è il regno di Assemblatore, temo.
Nessun assemblatore necessario. GCC ha estensioni per supportare tipi di dati speciali e "chiamate di funzione" per l'utilizzo di MMX/SSE. –
Certo, si tratta di involucri sottilmente mascherati per l'assemblaggio, quindi se non puoi programmare SSE in asm, le estensioni non ti aiuteranno molto. –
In realtà, le intrinseche sono più che semplici wrapper attorno all'assemblaggio. Consentono al compilatore di riorganizzare il codice per le massime prestazioni. Ma è necessario avere una buona comprensione di come funziona SIMD. –
Un semplice tutorial? Non che io sappia.
Ma qualsiasi informazione sull'utilizzo di MMX o di qualsiasi versione di SSE sarà utile per l'apprendimento, sia per GCC che per ICC o VC.
Per informazioni sulle estensioni vettoriali di GCC, digitare "info gcc" e andare su Node: Vector Extensions.
L'ottimizzazione più semplice da utilizzare è consentire a gcc di emettere il codice SSE.
Flags: -msse, -msse2, -msse3, -march =, -mfpmath = sse
Per un elenco più concisa circa 386 opzioni, vedere http://gcc.gnu.org/onlinedocs/gcc-4.3.3/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options, più la documentazione esatta per la versione specifica del compilatore è lì: http://gcc.gnu.org/onlinedocs/.
Per l'ottimizzazione, controllare sempre Agner Fog's: http://agner.org/optimize/.Penso che non abbia tutorial SSE per gli intrinsechi, ma ha alcuni trucchi std-C++ davvero accurati e fornisce anche molte informazioni sulla codifica dell'assembly SSE (che può essere spesso trascritto in intrinseco).
'-mftree-vectorize' produrrà anche SSE. – LiraNuna
Non necessariamente. Dal manuale: "Eseguire la vettorizzazione del ciclo sugli alberi Questo flag è abilitato per impostazione predefinita su -O3." Quindi il flag non menziona una piattaforma specifica (potrebbe anche elaborare byte più piccoli nei registri standard a 32 bit). –
MSDN ha una buona descrizione dei compilatori del compilatore SSE (e quelli integrati sono di fatto standard, funzionano anche in clang/XCode).
- http://msdn.microsoft.com/en-us/library/26td21ds.aspx
- http://msdn.microsoft.com/en-us/library/kcwz153a.aspx
La cosa bella di quella di riferimento è che mostra pseudocodice equivalente, così per esempio si può imparare che ADDPD istruzione è:
r0 := a0 + b0
r1 := a1 + b1
Ed ecco buona descrizione di un'istruzione di riordino criptico: http://www.songho.ca/misc/sse/sse.html
- 1. Cpu dispatcher per Visual Studio per AVX e SSE
- 2. Estrazione di SSE mischiato a 32 bit con solo SSE2
- 3. istruzioni cpuid su i5-2500k: MMX, SSE, bit SSE2 non impostati
- 4. SSE SIMD Optimization per Loop
- 5. Come abilitare il set di istruzioni SSE/SSE2 in Visual Studio 2008 (utilizzando CMake)?
- 6. Prodotto a punti - SSE2 vs BLAS
- 7. Librerie matematiche SIMD per SSE e AVX
- 8. SSE ritorno registro con SSE disabilitato
- 9. Come determinare se C matematica utilizza SSE2?
- 10. Opzione SSE2 in Visual C++ (x64)
- 11. Set di istruzioni SSE non abilitato
- 12. funzionalità glibc e SSE
- 13. SSE, intrinseche e allineamento
- 14. __attribute__ in GNU C
- 15. SSE2 ottimizzazione del codice
- 16. SSE funziona lentamente dopo l'utilizzo di AVX
- 17. Differenze tra GNU C++ e Microsoft Visual C++
- 18. L'aritmetica in virgola mobile SSE è riproducibile?
- 19. gcc -mno-SSE2 arrotondamento
- 20. Messaggi di errore GNU C++
- 21. Signedness enum in C/C99/C++/C++ x/GNU C/GNU C99
- 22. Esempi ed esercitazioni Intel SSE e AVX
- 23. Determina il supporto del processore per SSE2?
- 24. Swap atomico in GNU C++
- 25. numpy calling sse2 via ctypes
- 26. C++: quali parametri GNU G ++?
- 27. pthreads v. SSE debole ordine di memoria
- 28. Java e GNU gettext per l'internazionalizzazione
- 29. Simulazione della funzionalità packusdw con SSE2
- 30. comportamento diverso unordered_multimap in GNU ++ C++ 0x 11 e
Ho scritto una libreria per fare ottimizzazioni SSE2 facile - https://github.com/LiraNuna/glsl -sse2 – LiraNuna
Ho trovato questo [post di blog] (http://minchechiu.blogspot.com/2009/05/sse.html) con molti link di alta qualità su SSE. – Philip
Ho trovato un documento interessante qui: http://ds9a.nl/gcc-simd/index.html –