Domanda

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 cercherà di istruzioni lotto insieme al fine di fare uso di istruzioni SIMD?

Ci sono delle regole si possono seguire su come ottimizzare il codice in modo che il compilatore può fare assemblatore effiecient utilizzando queste estensioni?

Per 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 scrivere lo shadercode tale che sarebbe ombra 4 pixel differenti all'interno di una chiamata di istruzioni? qualcosa di simile a questo:

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

di elaborare più dataunits in una sola volta. Questo sarebbe utile per rendere l'uso del compilatore istruzioni SSE?

grazie!

È stato utile?

Soluzione

  

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 cercherà di istruzioni lotto insieme al fine di fare uso di istruzioni SIMD?

No, il compilatore non utilizzare le istruzioni vettoriali da solo. Userà istruzioni SSE scalare invece di x87 quelli.

Ciò che si descrive è chiamato "vettorializzazione automatica". compilatori Microsoft non lo fanno, Intel compilatori fanno.

In Microsoft compilatore è possibile utilizzare intrinseche per eseguire manualmente le ottimizzazioni SSE .

Altri suggerimenti

Tre osservazioni.

  1. Le migliori incrementi nella velocità non sono provenienti da ottimizzazioni ma da buoni algoritmi . Quindi assicuratevi di avere quella parte prima a destra. Spesso questo significa semplicemente utilizzando le librerie giuste per il tuo dominio specifico.

  2. Dopo aver ottenuto i algoritmi di destra è il momento di Misura . Spesso v'è una regola 80/20 al lavoro. Il 20% del codice avrà l'80% del tempo di esecuzione. Ma al fine di individuare quella parte è necessario un buon profiler. Intel VTune può dare campionamento profilo da ogni funzione e le relazioni belle che individuare gli assassini di prestazioni. Un'altra alternativa libera è AMD CodeAnalyst se si dispone di una CPU AMD.

  3. La capacità autovettorizazione compilatore non è un proiettile d'argento. Anche se cercherà davvero difficile (soprattutto Intel C ++ ) si vuole spesso la necessità di farne a meno riscrivendo gli algoritmi in forma vettoriale. Spesso è possibile ottenere risultati molto migliori da artigianale piccole porzioni del codice collo di bottiglia per utilizzare le istruzioni SIMD. È possibile farlo in codice C (vedi link di VJO sopra) utilizzando intrinseche o l'uso in linea di montaggio.

Naturalmente le parti 2 e 3 costituiscono un processo iterativo. Se siete veramente sul serio questo poi ci sono alcuni libri buoni sull'argomento da gente Intel come Software Optimization Cookbook e manuali di riferimento del processore.

Il compilatore non è onnipotente, e ha alcune limitazioni. Se può (e se le bandiere di destra sono passati ad esso), userà istruzioni SSE. L'unico modo per vedere quello che ha fatto è quello di esaminare il codice assembly generato dal compilatore.

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

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top