2019-04: Erreichten Ende. Vorgeschlagene Alternative: LLVM-MCA
2017-11: Ausführung 3.0 herrausgebracht (spätestens vom 18.05.2019)
2017-03: Ausführung 2.3 herrausgebracht
Was es ist:
IACA (der Intel Architecture Code Analyzer) ist ein (2019: Lebensende) Freeware, statisches Closed-Source-Analysetool von Intel zur statischen Analyse der Planung von Anweisungen bei der Ausführung durch moderne Intel-Prozessoren. Dies ermöglicht es, für ein bestimmtes Snippet zu berechnen,
- Im Durchsatzmodusder maximale Durchsatz (Es wird davon ausgegangen, dass der Ausschnitt der Körper einer innersten Schleife ist)
- Im Latenzmodusdie minimale Latenzzeit von der ersten bis zur letzten Anweisung.
- Im Trace-Modusdruckt den Fortschritt der Anweisungen durch ihre Pipeline-Phasen.
wenn optimale Ausführungsbedingungen angenommen werden (alle Speicherzugriffe treffen auf den L1-Cache und es gibt keine Seitenfehler).
IACA unterstützt Rechenzeitpläne für Nehalem-, Westmere-, Sandy Bridge-, Ivy Bridge-, Haswell-, Broadwell- und Skylake-Prozessoren ab Version 2.3 und Haswell, Broadwell und Skylake ab Version 3.0.
IACA ist ein Befehlszeilentool, das ASCII-Textberichte und Graphviz-Diagramme erstellt. Die Versionen 2.1 und darunter unterstützten 32- und 64-Bit-Linux, Mac OS X und Windows sowie die Analyse von 32-Bit- und 64-Bit-Code; Version 2.2 und höher unterstützen nur 64-Bit-Betriebssysteme und die Analyse von 64-Bit-Code.
Wie man es benutzt:
Die Eingabe der IACA ist eine kompilierte Binärdatei Ihres Codes, in die zwei eingefügt wurden Markierungen: ein Startmarkierung und ein Endmarkierung. Die Markierungen machen den Code unausführbar, ermöglichen dem Tool jedoch, die relevanten Codeteile schnell zu finden und zu analysieren.
Sie müssen die Binärdatei nicht auf Ihrem System ausführen können; Tatsächlich wird die Binärdatei an die IACA geliefert kippen trotzdem ausgeführt werden, da die eingefügten Markierungen im Code vorhanden sind. IACA erfordert lediglich die Fähigkeit, die zu analysierende Binärdatei zu lesen. Somit ist es unter Verwendung von IACA möglich, eine Haswell-Binärdatei unter Verwendung von FMA-Anweisungen auf einer Pentium-III-Maschine zu analysieren.
C/C++
In C und C++ erhält man Zugriff auf Markierungs-injizierende Makros mit #include "iacaMarks.h"
wo iacaMarks.h
ist ein Header, der mit dem Tool in der ausgeliefert wird include/
Unterverzeichnis.
Man fügt dann die Markierungen um die herum ein innerste interessierende Schleife oder das interessierende geradlinige Stück wie folgt:
/* C or C++ usage of IACA */
while(cond){
IACA_START
/* Loop body */
/* ... */
}
IACA_END
Die Anwendung wird dann neu erstellt, wie sie es sonst mit aktivierten Optimierungen tun würde (im Release-Modus für Benutzer von IDEs wie Visual Studio). Die Ausgabe ist eine Binärdatei, die in jeder Hinsicht mit dem Release-Build identisch ist, außer dass die Markierungen vorhanden sind, die die Anwendung nicht lauffähig machen.
Die IACA verlässt sich darauf, dass der Compiler die Markierungen nicht übermäßig neu ordnet; Daher müssen für solche Analyse-Builds möglicherweise bestimmte leistungsstarke Optimierungen deaktiviert werden, wenn sie die Markierungen neu anordnen, um irrelevanten Code einzuschließen, der sich nicht in der innersten Schleife befindet, oder Code darin auszuschließen.
Zusammenbau (x86)
Die Markierungen der IACA sind magische Bytemuster, die an der richtigen Stelle innerhalb des Codes eingefügt werden. Beim Benutzen iacaMarks.h
In C oder C++ kümmert sich der Compiler um das Einfügen der magischen Bytes, die durch den Header an der richtigen Stelle angegeben sind. Bei der Montage müssen Sie diese Markierungen jedoch manuell einfügen. Also muss man folgendes tun:
; NASM usage of IACA
mov ebx, 111 ; Start marker bytes
db 0x64, 0x67, 0x90 ; Start marker bytes
.innermostlooplabel:
; Loop body
; ...
jne .innermostlooplabel ; Conditional branch backwards to top of loop
mov ebx, 222 ; End marker bytes
db 0x64, 0x67, 0x90 ; End marker bytes
Für C/C++-Programmierer ist es entscheidend, dass der Compiler dasselbe Muster erreicht.
Was es ausgibt:
Lassen Sie uns als Beispiel das folgende Assembler-Beispiel auf der Haswell-Architektur analysieren:
.L2:
vmovaps ymm1, [rdi+rax] ;L2
vfmadd231ps ymm1, ymm2, [rsi+rax] ;L2
vmovaps [rdx+rax], ymm1 ; S1
add rax, 32 ; ADD
jne .L2 ; JMP
Wir fügen unmittelbar vor dem hinzu .L2
Beschriften Sie die Startmarkierung und unmittelbar danach jne
die Endmarkierung. Wir erstellen dann die Software neu und rufen IACA so auf (Unter Linux wird davon ausgegangen, dass die bin/
Verzeichnis im Pfad sein, und foo
um ein ELF64-Objekt zu sein, das die IACA-Marken enthält):
iaca.sh -64 -arch HSW -graph insndeps.dot foo
wodurch ein Analysebericht der 64-Bit-Binärdatei erstellt wird foo
bei Ausführung auf einem Haswell-Prozessor und ein Diagramm der Befehlsabhängigkeiten, das mit Graphviz angezeigt werden kann.
Der Bericht wird auf der Standardausgabe gedruckt (obwohl er möglicherweise in eine Datei mit einer -o
schalten). Der Bericht für das obige Snippet lautet:
Intel(R) Architecture Code Analyzer Version - 2.1
Analyzed File - ../../../tests_fma
Binary Format - 64Bit
Architecture - HSW
Analysis Type - Throughput
Throughput Analysis Report
--------------------------
Block Throughput: 1.55 Cycles Throughput Bottleneck: FrontEnd, PORT2_AGU, PORT3_AGU
Port Binding In Cycles Per Iteration:
---------------------------------------------------------------------------------------
| Port | 0 - DV | 1 | 2 - D | 3 - D | 4 | 5 | 6 | 7 |
---------------------------------------------------------------------------------------
| Cycles | 0.5 0.0 | 0.5 | 1.5 1.0 | 1.5 1.0 | 1.0 | 0.0 | 1.0 | 0.0 |
---------------------------------------------------------------------------------------
N - port number or number of cycles resource conflict caused delay, DV - Divider pipe (on port 0)
D - Data fetch pipe (on ports 2 and 3), CP - on a critical path
F - Macro Fusion with the previous instruction occurred
* - instruction micro-ops not bound to a port
^ - Micro Fusion happened
# - ESP Tracking sync uop was issued
@ - SSE instruction followed an AVX256 instruction, dozens of cycles penalty is expected
! - instruction not supported, was not accounted in Analysis
| Num Of | Ports pressure in cycles | |
| Uops | 0 - DV | 1 | 2 - D | 3 - D | 4 | 5 | 6 | 7 | |
---------------------------------------------------------------------------------
| 1 | | | 1.0 1.0 | | | | | | CP | vmovaps ymm1, ymmword ptr [rdi+rax*1]
| 2 | 0.5 | 0.5 | | 1.0 1.0 | | | | | CP | vfmadd231ps ymm1, ymm2, ymmword ptr [rsi+rax*1]
| 2 | | | 0.5 | 0.5 | 1.0 | | | | CP | vmovaps ymmword ptr [rdx+rax*1], ymm1
| 1 | | | | | | | 1.0 | | | add rax, 0x20
| 0F | | | | | | | | | | jnz 0xffffffffffffffec
Total Num Of Uops: 6
Das Tool weist hilfreich darauf hin, dass derzeit das Haswell-Frontend und die AGU von Port 2 und 3 der Engpass sind. Mit diesem Beispiel können wir das Problem diagnostizieren, dass der Speicher nicht von Port 7 verarbeitet wird, und Abhilfemaßnahmen ergreifen.
Einschränkungen:
Die IACA unterstützt einige wenige Anweisungen nicht, die bei der Analyse ignoriert werden. Es unterstützt keine Prozessoren, die älter als Nehalem sind, und unterstützt keine nicht innersten Schleifen im Durchsatzmodus (keine Fähigkeit zu erraten, welcher Zweig wie oft und in welchem Muster genommen wird).