web-dev-qa-db-ja.com

IACAとは何ですか?どのように使用しますか?

IACA(Intel Architecture Code Analyzer) と呼ばれるこの興味深い強力なツールを見つけましたが、それを理解するのが困難です。それで何ができますか、その制限は何ですか?

  • CまたはC++でコードを分析するために使用しますか?
  • それを使用してx86アセンブラーのコードを分析しますか?

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++

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は、マークを過度に並べ替えないコンパイラーに依存しています。そのため、そのような分析ビルドでは、マークを並べ替えて最も内側のループ内にない無関係のコードを含めるか、ループ内のコードを除外する場合、特定の強力な最適化を無効にする必要があります。

アセンブリ(x86)

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よ​​り古いプロセッサをサポートせず、スループットモードで最も内側でないループをサポートしません(どのブランチがどの頻度でどのパターンで実行されるかを推測する機能がありません)。