Erste Schritte mit Intel x86-SSE SIMD-Befehle
Ich will lernen, mehr über die Verwendung der SSE.
Welche Möglichkeiten gibt es, um zu lernen, neben den offensichtlichen Lesen der Die Intel® 64 und IA-32 Architectures Software Developer ' s Manuals?
Hauptsächlich bin ich interessiert an der Arbeit mit den GCC X86 Built-in-Funktionen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste, die ich nicht empfehlen auf die Verwendung der built-in-Funktionen - Sie sind nicht tragbar (über Compilern der gleichen Architektur).
Verwenden Interna, GCC macht einen wunderbaren job Optimierung SSE Interna in noch mehr optimierten code. Sie können immer einen Blick auf die Versammlung und sehen, wie Sie mit SSE, um das volle Potenzial.
Interna einfach nur wie normale Funktionsaufrufe:
Verwenden
_mm_load_ps
oder_mm_loadu_ps
zum laden von Daten aus arrays.Natürlich gibt es viel mehr Möglichkeiten, SSE ist wirklich mächtig und meiner Meinung nach relativ leicht zu erlernen.
Siehe auch https://stackoverflow.com/tags/sse/info für Sie einige links zu guides.
immintrin.h
. Es war eine gute Idee, Sie zu ersetzenxmmintrin.h
(denn das definiert nur SSE1-Interna), obwohl.Seit Ihr gefragt für Ressourcen:
Ein praktischer Leitfaden für die Verwendung von SSE mit C++: Guter überblick über das Konzept zur Verwendung der SSE-effektiv, mit Beispielen.
MSDN Auflistung von Compiler-Interna: Umfassende Referenz für alle Ihre intrinsischen Bedürfnisse. Es ist, MSDN, aber so ziemlich alle Interna hier aufgelistet die unterstützt werden von GCC und ICC als gut.
Christopher Wright SSE-Seite: Schnelle Referenz auf die Bedeutung der SSE-opcodes. Ich denke, die Intel-Handbücher können, dienen die gleiche Funktion, doch dieser ist schneller.
Wahrscheinlich ist es am besten zu schreiben, die meisten Ihrer code-Interna, aber überprüfen Sie die objdump deine compiler-Ausgabe, um sicherzustellen, dass es die Herstellung von effizienten code. SIMD-code-Generierung ist immer noch eine relativ neue Technologie und es ist sehr gut möglich, dass der compiler könnte es falsch in einigen Fällen.
Ich finde Dr. Agner Fog Forschung & optimization-guides sehr wertvoll! Er hat auch einige Bibliotheken & Test-tools, habe ich noch nicht ausprobiert.
http://www.agner.org/optimize/
Schritt 1: schreiben einige assembly manuell
Ich empfehlen, dass Sie zuerst versuchen, zu schreiben, Ihre eigenen Montage manuell zu finden-und genau kontrollieren, was passiert, wenn Sie anfangen, zu lernen.
Dann stellt sich die Frage, wie zu beobachten, was passiert im Programm, und die Antworten sind:
print
undassert
DingeVerwendung der C-standard-Bibliothek selbst erfordert ein wenig Arbeit, aber nicht viel. Ich habe zum Beispiel diese Arbeit getan, schön für Sie unter Linux in das folgende Dateien von meinem test-setup:
Mit diesen Helfern habe ich dann anfangen zu spielen, um mit den Grundlagen, wie:
addpd.S
GitHub upstream.
paddq.S
GitHub upstream.
Schritt 2: schreiben Sie einige Interna
Für die Produktion Codes jedoch, Sie werden wahrscheinlich wollen, verwenden Sie die bereits bestehenden Interna statt raw assembly erwähnt: https://stackoverflow.com/a/1390802/895245
So, jetzt versuche ich zum konvertieren der vorherigen Beispiele in mehr oder weniger äquivalenten C-code-Interna.
addpq.c
GitHub upstream.
paddq.c
GitHub upstream.
Schritt 3: gehen Sie und optimieren code und benchmark es
Das Letzte, und die meisten wichtiger und schwieriger Schritt, ist natürlich, um tatsächlich die Interna, um Ihren code zu schnell, und dann vergleichen Sie Ihre Verbesserung.
Tun so, wird wahrscheinlich verlangen, dass Sie lernen, ein wenig über die x86-Mikroarchitektur, die ich nicht kenne mich. CPU-vs. E /a-gebunden wird wahrscheinlich eines der Dinge, kommt: Was bedeuten die Begriffe "CPU-bound" und "I/O bound" bedeuten?
Erwähnt: https://stackoverflow.com/a/12172046/895245 dies wird fast zwangsläufig Lesen von Agner Fog in der Dokumentation, die scheinen zu sein besser als alles, was Intel selbst veröffentlicht hat.
Hoffentlich werden jedoch die Schritte 1 und 2 dienen als Grundlage, um zumindest experiment mit der funktionellen nicht-performance-Aspekte und schnell sehen, was für Anweisungen sind zu tun.
TODO: erstellen Sie eine minimale Interessantes Beispiel einer solchen Optimierung hier.
kernel_fpu_begin()
/_end()
um Ihre SIMD-code. Ein LKM ist der Letzte Ort, den Sie erwarten würden, um zu finden, SIMD, und der härteste Ort, um es zu testen, so scheint es vielleicht verwirrend zu bringen, die als erste Schritte in einem intro-to-SIMD-Antwort.kernel_fpu_begin()
. Ich hackte ein Beispiel für Spaß hier.