2009-03-19 12 views
53

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++

+4

Ho scritto una libreria per fare ottimizzazioni SSE2 facile - https://github.com/LiraNuna/glsl -sse2 – LiraNuna

+0

Ho trovato questo [post di blog] (http://minchechiu.blogspot.com/2009/05/sse.html) con molti link di alta qualità su SSE. – Philip

+0

Ho trovato un documento interessante qui: http://ds9a.nl/gcc-simd/index.html –

risposta

57

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".

8

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.

GCC Online Manual - i386 and x86_64 Options

+5

Nessun assemblatore necessario. GCC ha estensioni per supportare tipi di dati speciali e "chiamate di funzione" per l'utilizzo di MMX/SSE. –

+1

Certo, si tratta di involucri sottilmente mascherati per l'assemblaggio, quindi se non puoi programmare SSE in asm, le estensioni non ti aiuteranno molto. –

+7

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. –

1

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.

19

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).

+0

'-mftree-vectorize' produrrà anche SSE. – LiraNuna

+2

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). –

3

MSDN ha una buona descrizione dei compilatori del compilatore SSE (e quelli integrati sono di fatto standard, funzionano anche in clang/XCode).

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