2010-10-26 12 views
7

sto lavorando in Visual Studio 2008 e nelle impostazioni del progetto che vedo l'opzione per "attivare esteso set di istruzioni", che è possibile impostare su Nessuno, SSE o SSE2C++ come scrivere codice che il compilatore può facilmente ottimizzare per SIMD?

Così il compilatore cercherà di istruzioni lotti insieme a per fare uso delle istruzioni SIMD?

Ci sono delle regole che è possibile seguire per ottimizzare il codice in modo che il compilatore possa creare un assemblatore efficiente utilizzando queste estensioni?

Ad esempio, attualmente sto lavorando su un raytracer. Uno shader richiede qualche input e calcola dall'ingresso un colore di uscita, in questo modo:

PixelData data = RayTracer::gatherPixelData(pixel.x, pixel.y); 
Color col = shadePixel(data); 

sarebbe per esempio essere utile per scrivere lo shadercode tale che sarebbe ombreggiate 4 pixel differenti all'interno chiamata un'istruzione? qualcosa di simile:

PixelData data1 = RayTracer::gatherPixelData(pixel1.x, pixel1.y); 
... 
shadePixels(data1, data2, data3, data4, &col1out, &col2out, &col3out, &col4out); 

per elaborare più dataunits contemporaneamente. Questo potrebbe essere utile per fare in modo che il compilatore usi le istruzioni SSE?

grazie!

risposta

5

sto lavorando in Visual Studio 2008 e nelle impostazioni del progetto che vedo l'opzione per "attivare esteso set di istruzioni", che è possibile impostare su Nessuno, SSE o SSE2

Quindi il compilatore proverà a raggruppare le istruzioni insieme per utilizzare le istruzioni SIMD?

No, il compilatore non utilizzerà le istruzioni vettoriali da solo. Utilizzerà le istruzioni SSE scalari invece di quelle x87.

Quello che descrivi si chiama "vettorizzazione automatica". I compilatori Microsoft non lo fanno, Intel compilers fare.

Nel compilatore Microsoft è possibile utilizzare intrinsics per eseguire le ottimizzazioni SSE manuali.

+0

quindi per poter utilizzare le istruzioni vettoriali è necessario scrivere assembly? – Mat

+0

Penso che Suma indichi uno di questi: http://software.intel.com/en-us/articles/intel-compilers/ – mkb

+0

@Mat: è possibile utilizzare i componenti intrinseci del compilatore per scrivere il codice SIMD. Vedere http://msdn.microsoft.com/en-us/library/y0dh78ez%28VS.71%29.aspx – celion

0

Il compilatore non è tutto potente e presenta alcune limitazioni. Se è possibile (e se vengono trasmessi i contrassegni giusti), utilizzerà le istruzioni SSE. L'unico modo per vedere cosa ha fatto è esaminare il codice assembly generato dal compilatore.

Un'altra opzione è utilizzare le istruzioni C SSE/SSE2. Per le finestre si possono trovare qui:

http://msdn.microsoft.com/en-us/library/y0dh78ez%28VS.80%29.aspx

3

Tre osservazioni.

  1. Le migliori incrementi nella velocità non sono provenienti da ottimizzazioni ma da buoni algoritmi. Quindi assicurati di avere la parte giusta prima. Spesso questo significa semplicemente usare le librerie giuste per il tuo dominio specifico.

  2. Una volta ottenuti gli algoritmi corretti, è il momento di Misurare. Spesso c'è una regola 80/20 al lavoro. Il 20% del tuo codice impiegherà l'80% del tempo di esecuzione. Ma per trovare quella parte hai bisogno di un buon profiler.Intel VTune può darti il ​​profilo di campionamento da ogni funzione e bei rapporti che identificano i killer delle prestazioni. Un'altra alternativa gratuita è AMD CodeAnalyst se si dispone di una CPU AMD.

  3. La capacità di autovectorization del compilatore non è un proiettile argentato. Anche se proverà davvero molto difficile (in particolare Intel C++), sarà spesso necessario aiutarlo riscrivendo gli algoritmi in forma vettoriale. Spesso puoi ottenere risultati molto migliori producendo piccole parti del codice del collo di bottiglia per utilizzare le istruzioni SIMD. Puoi farlo in codice C (vedi il link di VJo sopra) usando intrinsics o usa assembly inline.

Naturalmente le parti 2 e 3 formano un processo iterativo. Se sei davvero serio riguardo a questo, ci sono alcuni buoni libri sull'argomento di persone come Intel The Software Optimization Cookbook e i manuali di riferimento del processore.

Problemi correlati