IACA(Intel Architecture Code Analyzer) と呼ばれるこの興味深い強力なツールを見つけましたが、それを理解するのが困難です。それで何ができますか、その制限は何ですか?
2019-04:到達[〜#〜] eol [〜#〜]。 代替案: LLVM-MCA
2017-11:バージョン.リリース済み(2019-05-18現在の最新)
2017-:バージョン2.リリース
IACA(Intel Architecture Code Analyzer) は、(2019:end-of-life)フリーウェアのクローズドソースの静的分析ツールで、Intelが作成したスケジューリングを静的に分析します最新のIntelプロセッサで実行された場合の命令。これにより、特定のスニペットについて、
最適な実行条件を想定する場合(すべてのメモリアクセスがL1キャッシュにヒットし、ページフォールトはありません)。
IACAは、Nehalem、Westmere、Sandy Bridge、Ivy Bridge、Haswell、Broadwell、Skylakeプロセッサのバージョン2.3以降のコンピューティングスケジュールと、Haswell、Broadwell、Skylakeのバージョン3.0以降をサポートしています。
IACAは、ASCIIテキストレポートとGraphvizダイアグラムを生成するコマンドラインツールです。バージョン2.1以下では、32ビットおよび64ビットのLinux、Mac OS XおよびWindowsがサポートされ、32ビットおよび64ビットコード;バージョン2.2以降は、64ビットOSと64ビットコードの分析のみをサポートします。
IACAの入力は、コードのコンパイルされたバイナリで、2つのマーカーが挿入されています:開始マーカーと終了マーカー。マーカーを使用すると、コードを実行できなくなりますが、ツールで関連するコードをすばやく見つけて分析できます。
システムでバイナリを実行する機能は必要ありません。実際、コードに挿入されたマーカーが存在するため、IACAに提供されたバイナリは実行できません。 IACAには、分析するバイナリを読み取る機能のみが必要です。したがって、IACAを使用すると、Pentium IIIマシンでFMA命令を使用してHaswellバイナリを分析できます。
CおよびC++では、#include "iacaMarks.h"
を使用してマーカーを挿入するマクロにアクセスできます。ここで、iacaMarks.h
は、include/
サブディレクトリのツールに付属するヘッダーです。
次に、次のように、マーカーをinnermost関心のあるループ、または関心のある直線のチャンクの周りに挿入します。
/* C or C++ usage of IACA */
while(cond){
IACA_START
/* Loop body */
/* ... */
}
IACA_END
その後、最適化を有効にした場合と同様に、アプリケーションが再構築されます(Visual StudioなどのIDEのユーザー向けのリリースモード)。出力は、アプリケーションが実行不可能になるマークの存在を除いて、リリースビルドとすべての点で同一のバイナリです。
IACAは、マークを過度に並べ替えないコンパイラーに依存しています。そのため、そのような分析ビルドでは、マークを並べ替えて最も内側のループ内にない無関係のコードを含めるか、ループ内のコードを除外する場合、特定の強力な最適化を無効にする必要があります。
IACAのマーカーは、コード内の正しい位置に挿入されたマジックバイトパターンです。 CまたはC++でiacaMarks.h
を使用する場合、コンパイラーは、ヘッダーで指定されたマジックバイトを正しい場所に挿入します。ただし、アセンブリでは、これらのマークを手動で挿入する必要があります。したがって、次のことを行う必要があります。
; 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
C/C++プログラマーにとって、コンパイラーがこれと同じパターンを実現することは重要です。
例として、 Haswellアーキテクチャーでの以下のアセンブラーの例 を分析します。
.L2:
vmovaps ymm1, [rdi+rax] ;L2
vfmadd231ps ymm1, ymm2, [rsi+rax] ;L2
vmovaps [rdx+rax], ymm1 ; S1
add rax, 32 ; ADD
jne .L2 ; JMP
.L2
ラベルの直前に開始マーカーを追加し、jne
の直後に終了マーカーを追加します。次に、ソフトウェアを再構築してIACAを呼び出します(Linuxでは、bin/
ディレクトリがパスにあり、foo
がIACAマークを含むELF64オブジェクトであると想定しています)。
iaca.sh -64 -Arch HSW -graph insndeps.dot foo
、したがって、Haswellプロセッサで実行したときの64ビットバイナリfoo
の分析レポートと、Graphvizで表示可能な命令依存関係のグラフを生成します。
レポートは標準出力に出力されます(ただし、-o
スイッチを使用してファイルに送信される場合があります)。上記のスニペットについてのレポートは次のとおりです。
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
このツールは、現在、ボトルネックがHaswellフロントエンドとポート2および3のAGUであることを指摘しています。この例では、ポート7で処理されていないストアとして問題を診断し、修正措置を講じることができます。
IACAは、分析で無視される特定のいくつかの命令をサポートしていません。 Nehalemより古いプロセッサをサポートせず、スループットモードで最も内側でないループをサポートしません(どのブランチがどの頻度でどのパターンで実行されるかを推測する機能がありません)。