Frage

ich arbeite in Visual Studio 2008 und in den Projekteinstellungen Ich sehe die Option für „erweiterten Befehlssatz aktivieren“, die mich auf Keinem, SSE oder SSE2 festlegen

So ist die Compiler Batch-Befehle zusammen, um zu nutzen SIMD-Befehle versuchen wird?

Gibt es irgendwelche Regeln ein, wie zur Optimierung der Code folgen kann, so dass der Compiler effiecient Assembler mit diesen Erweiterungen machen?

Zum Beispiel zur Zeit arbeite ich an einem Raytracer. Ein Shader nimmt eine Eingabe und berechnet aus dem Eingang eines Ausgangs Farbe, wie folgt aus:

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

wäre es beispielsweise vorteilhaft sein, die shadercode zu schreiben, so dass es würde Schatten 4 verschiedene Pixel innerhalb einer Anweisung Anruf? so etwas wie folgt aus:

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

mehr dataunits auf einmal zu verarbeiten. würde dies für die Herstellung der Compiler Verwendung SSE-Befehle von Vorteil sein?

Danke!

War es hilfreich?

Lösung

  

ich arbeite in Visual Studio 2008 und in den Projekteinstellungen Ich sehe die Option für „erweiterten Befehlssatz aktivieren“, die mich auf Keinem, SSE oder SSE2 festlegen

     

So ist die Compiler Batch-Befehle zusammen, um zu nutzen SIMD-Befehle versuchen wird?

Nein, wird der Compiler nicht Vektorbefehle auf eigene verwenden. Es wird anstelle von x87 diejenigen Skalar SSE-Befehle verwenden.

Was Sie beschreiben, ist „automatische Vektorisierung“ genannt. Microsoft-Compiler dies nicht tun, Intel Compiler tun.

Ein Microsoft-Compiler können Sie verwenden intrinsics Handbuch SSE Optimierungen vorzunehmen, .

Andere Tipps

Drei Beobachtungen.

  1. Die besten speedups nicht von Optimierungen kommen, sondern von guten Algorithmen . So stellen Sie sicher, dass Sie sich zuerst, dass ein Teil bekommen. Oft verwenden diese Mittel nur die richtigen Bibliotheken für Ihre spezifische Domain.

  2. Wenn Sie Ihre Algorithmen bekommen Recht ist es Zeit, Maßnahme . Oft gibt es eine 80/20 Regel bei der Arbeit. 20% des Codes wird 80% der Ausführungszeit nehmen. Aber um diesen Teil zu finden, benötigen Sie einen guten Profiler. Intel VTune können Sie Profil geben Abtasten von jeder Funktion und schöne Berichte , die die Performance-Killer lokalisieren. Eine weitere kostenlose Alternative ist AMD Codeanalyst , wenn Sie eine AMD CPU haben.

  3. Der Compiler autovectorization Fähigkeit ist kein Allheilmittel. Obwohl es wirklich hart versuchen wird (vor allem Intel C ++ ) werden Sie oft müssen sie helfen, indem sie die Algorithmen in Vektorform neu zu schreiben. Sie können oft viel bessere Ergebnisse erhalten, indem kleine Portionen des Engpasses Code handcrafting SIMD-Befehle zu verwenden. Sie können mit intrinsics oder Verwendung Inline-Montage in C-Code (VJo den Link oben) zu tun.

Natürlich Teile 2 und 3 bilden einen iterativen Prozess. Wenn Sie wirklich ernsthaft dann darüber gibt es einige gute Bücher über das Thema von Intel Leute wie Die Handbücher Software Optimization-Kochbuch und der Prozessor Referenz.

Der Compiler ist nicht alles mächtig, und es hat einige Einschränkungen. Wenn es kann (und wenn es richtig Fahnen an sie übergeben werden), wird es SSE-Befehle verwenden. Der einzige Weg, um zu sehen, was es tat, ist der Assembler-Code durch den Compiler erzeugt zu untersuchen.

Eine weitere Option ist C SSE / SSE2 Anweisungen. Für Fenster können Sie hier finden:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top