Frage

Hat jemand die Vorteile der automatischen Vektorisierung genommen, die gcc tun kann? In der realen Welt (wie zum Beispiel Code Gegensatz)? Dauert es Umstrukturierung der bestehenden Code zu nutzen? Gibt es eine beträchtliche Anzahl von Fällen in jedem Produktionscode, der diese Art und Weise wird vektorisiert können?

War es hilfreich?

Lösung

Ich habe noch entweder GCC oder Intel C ++ automatisch vektorisiert alles andere als sehr einfache Schleifen zu sehen, auch wenn Sie den Code von Algorithmen gegeben, die (und wurden, nachdem ich sie mit SSE intrinsics manuell neu geschrieben) vektorisiert werden.

Ein Teil davon wird konservativ - vor allem, wenn mit möglichen Zeigern Aliasing konfrontiert, kann es für eine C / C ++ Compiler zu ‚beweisen‘ zu sich selbst sehr schwierig sein, dass ein Vektorisierung sicher sein würde, auch wenn Sie als Programmierer wissen, dass es ist. Die meisten Compiler (sinnvollerweise) lieber nicht Code zu optimieren, anstatt zu riskieren, es miscompiling. Dies ist ein Bereich, in dem höhere Sprache hat einen echten Vorteil gegenüber C, zumindest in der Theorie (I in der Theorie sagen, da ich nicht wirklich Kenntnis von automatisch Vektorisierung ML oder Haskell Compiler bin).

Ein weiterer Teil davon einfach analytischen Grenzen - die meisten Forschung in Vektorisierung, ich verstehe, ist ähnlich der klassischen numerische Probleme zu optimieren (fluid dynamics, sagen), die das Brot und Butter von den meisten Vektor-Maschinen war vor ein paar Jahren (wenn wurde zwischen CUDA / OpenCL, AltiVec / SSE und der STI Cell, Vektor-Programmierung in verschiedenen Formen in kommerziellen Systemen weit verbreitet).

Es ist ziemlich unwahrscheinlich, dass Code für einen skalaren Prozessor im Kopf geschrieben leicht sein wird für einen Compiler vektorisieren. viele Dinge, die Sie tun können, glücklich machen es einfacher für einen Compiler zu verstehen, wie es vektorisieren, wie Loop-Fliesen und Teil Schleifenentrollen, auch (tendenziell) Hilfe Leistung auf modernen Prozessoren auch wenn der Compiler nicht aus Abbildung, wie man vektorisiert es.

Andere Tipps

Es ist schwer, in jeder Business-Logik zu verwenden, aber gibt Geschwindigkeit ups, wenn Sie Datenmengen in der gleichen Art und Weise verarbeiten.

Gutes Beispiel ist Ton / Videoverarbeitung, wo Sie den gleichen Vorgang für jede Probe / Pixel anzuwenden. Ich habe VisualDSP dafür verwendet, und Sie mussten die Ergebnisse nach dem Kompilieren überprüfen -. Wenn es wirklich verwendet wird, wo es sein sollte

Vektorisierung für numerische Programme in erster Linie nützlich sein. Vektorisiert Programme können schneller auf Vektor-Prozessoren wie der STI Zellprozessor in PS3 Spielekonsolen verwendet laufen. Dort nutzten die numerischen Berechnungen in, zum Beispiel, wodurch die Spielgrafik eine Menge von Vektorisierung beschleunigt werden kann. Solche Prozessoren sind SIMD (Single Instruction Multiple Data) Prozessoren genannt.

Auf anderen Prozessoren Vektorisierung nicht verwendet werden. Vektorisiert Programme laufen auf einem vektorisiert Befehlssatz, der wird nicht zu einem Nicht-SIMD-Prozessor anwendbar sein.

Intels Nehalem-Prozessor-Serie (Ende 2008 veröffentlicht) implementieren SSE 4.2 Anweisungen, die SIMD-Befehle sind. Quelle: wikipedia

.

Vectorized Anweisungen sind nicht auf Handy-Prozessoren beschränkt - die meisten modernen Arbeitsplätzen ähnlichen CPU haben sie (PPC, x86 seit Pentium 3, Sparc, etc ...). Wenn auch für Fließkommaoperationen verwendet wird, kann es helfen, eine ganze Menge für intensive Aufgaben sehr Berechnung (Filter, etc ...). Nach meiner Erfahrung ist die automatische Vektorisierung nicht so gut funktionieren.

Sie haben vielleicht bemerkt, dass so ziemlich niemand wirklich weiß, wie gut die Verwendung von GCC automatischer Vektorisierung zu machen. Wenn Sie rund um die Web-Suche Leute Kommentare zu sehen, es kommen immer auf die Idee, dass GCC können Sie die automatische Vektorisierung ermöglichen, aber es extrem selten macht tatsächlichen Gebrauch davon, und so, wenn Sie SIMD-Beschleunigung (zB verwenden möchten: MMX, SSE, AVX, NEON, AltiVec), dann haveto Sie im Grunde herausfinden, wie es schreiben Compiler intrinsics oder Assembler-Code.

Aber das Problem mit intrinsics ist, dass man effektiv die Assemblersprache Seite davon verstehen muß, und dann lernt auch die Intrinsics Methode zur Beschreibung, was Sie wollen, was viel weniger effizienten Code führen, als wahrscheinlich ist, wenn Sie es geschrieben in Assembler-Code (wie zB um den Faktor 10x), weil der Compiler geht noch Schwierigkeiten haben, eine gute Nutzung Ihrer inneren Anweisungen!

Zum Beispiel könnten Sie SIMD Intrinsics verwenden, so dass viele Operationen gleichzeitig parallel durchgeführt werden, aber Ihr Compiler wird wahrscheinlich Assembly-Code generieren, die die Daten zwischen den SIMD-Registern übertragen und das normale CPU-Register und zurück, was effektiv Ihr SIMD Code ausführte mit einer ähnlichen Geschwindigkeit (oder sogar langsamer) als normaler Code!

Also im Grunde:

  • Wenn Sie möchten, bis zu 100% speedups (2x Geschwindigkeit), dann kaufen entweder die offizielles Intel / ARM Compiler oder einige Ihres Code umwandeln zu SIMD C / C ++ Intrinsics zu verwenden.
  • Wenn Sie möchten 1000% speedups (10x Geschwindigkeit) ist, dann schreiben Sie es in Assembler-Code unter Verwendung von SIMD-Befehle von Hand. Oder wenn auf Ihrer Hardware, die Verwendung GPU-Beschleunigung statt wie OpenCL oder Nvidias CUDA SDK, da sie ähnliche speedups in der GPU zur Verfügung stellen können, wie SIMD tut in der CPU.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top