Kontext: Ich habe mehrere Schleifen in einer Objective-C-Bibliothek, die ich schreibe, die sich mit der Verarbeitung großer Text-Arrays befassen. Ich kann sehen, dass es jetzt in einem einzigen Thread läuft.
Ich verstehe, dass LLVM nun in der Lage ist, Schleifen automatisch zu vektorisieren, wie es bei Apples Sitzung auf der WWDC beschrieben wurde. Es ist jedoch sehr vorsichtig in der Art, wie es das tut, ein Grund dafür ist die Möglichkeit, Variablen aufgrund von CPU-Pipelining zu modifizieren.
Meine Frage: Wie kann ich sehen, wo LLVM meinen Code vektorisiert hat, und, nützlicher, wie kann ich Debug-Meldungen erhalten, die erklären, warum er meinen Code nicht vektorisieren kann? Ich bin mir sicher, wenn es sehen kann, warum es es nicht automatisch vektorisieren kann, könnte es mich darauf hinweisen, und ich könnte die notwendigen manuellen Anpassungen vornehmen, um es vektorisierbar zu machen.
Ich wäre nachlässig, wenn ich nicht darauf hinweisen würde, dass diese Frage schon mehr oder weniger gestellt wurde, aber ziemlich stumpfsinnig, hier .
Die von Xcode bereitgestellte Standard-llvm-Toolchain scheint das Abrufen von Debug-Informationen vom Optimierer nicht zu unterstützen. Wenn du jedoch deinen eigenen llvm rollst und diesen verwendest, solltest du in der Lage sein, Flaggen als oben vorgeschlagenen Mischr zu übergeben. Hier ist der Workflow, den ich verwendet habe:
1. Verwenden Sie Homebrew, installieren Sie llvm
%Vor% Dies sollte die vollständige und relativ aktuelle llvm Toolchain installieren. Es ist in /usr/local/bin/*-3.3
(d. H.% Co_de%) verknüpft. Der tatsächliche Speicherort auf der Festplatte ist verfügbar über clang++-3.3
- wahrscheinlich brew info llvm33
.
2. Erstellen Sie die einzelne Datei, die Sie optimieren, mit homebrew llvm und Flags
Wenn Sie Xcode eingebaut haben, können Sie die Build-Parameter einfach kopieren und einfügen, und verwenden Sie Ihren clang ++ - 3.3 anstelle von Xcodes eigenen Clang.
Wenn Sie /usr/local/Cellar/llvm33/3.3/bin
anhängen, erhalten Sie den automatischen Vektorisierungsbericht. Hinweis: Dies funktioniert wahrscheinlich NICHT mit einem remote komplexen Build, z. wenn Sie PCH haben, aber es ist eine einfache Möglichkeit, eine einzelne CPP-Datei zu optimieren, um sicherzustellen, dass es korrekt vektorisiert.
3. Erstelle ein Compiler-Plugin aus dem neuen llvm
Ich war in der Lage, mein ganzes Projekt mit homebrew llvm zu bauen:
-mllvm -debug-only=loop-vectorize
Das erneute Starten von Xcode sollte dieses Plugin in der Liste der verfügbaren Compiler anzeigen. Zu diesem Zeitpunkt zeigt das /Library/Application Support/Developer/5.0/Xcode/Plug-ins/
-Flag den Auto-Vektorisierungsbericht an.
Ich habe keine Ahnung, warum dies in den Apple-Builds nicht sichtbar ist.
UPDATE : Dies wird in aktuellen (8.x) Versionen von Xcode angezeigt. Sie müssen lediglich eines oder mehrere der -mllvm -debug-only=loop-vectorize
Flags aktivieren.
Identifiziert Loops, die erfolgreich vectorized
:
Identifiziert Schleifen, bei denen die Vektorisierung fehlgeschlagen ist und zeigt an, ob die Vektorisierung angegeben wurde:
%Vor%Identifiziert die Anweisungen, die zum Fehlschlagen der Vektorisierung geführt haben:
%Vor%Quelle: Ссылка
Angenommen, Sie verwenden opt
und Sie haben einen Debug-Build von llvm, können Sie dies folgendermaßen tun:
opt -O1 -loop-vectorize -debug-only=loop-vectorize code.ll
Dabei steht code.ll
für die IR, die Sie vektorisieren möchten.
Wenn Sie clang
verwenden, müssen Sie das -debug-only=loop-vectorize
-Flag mit -mllvm
-Option übergeben.
Tags und Links c objective-c llvm loops vectorization