什么是IACA以及如何使用它?

时间:2014-09-24 15:53:04

标签: c++ c performance assembly iaca

我发现了这个名为IACA (the Intel Architecture Code Analyzer)的有趣且强大的工具,但我无法理解它。我能用它做什么,有什么限制,我该怎么做:

  • 用它来分析C或C ++中的代码?
  • 用它来分析x86汇编程序中的代码?

1 个答案:

答案 0 :(得分:68)

  

2019-04 :已达到 EOL 建议替代方案LLVM-MCA

     

2017-11 :版本 3.0 发布(最新截至2019-05-18)

     

2017-03 :版本 2.3 已发布

它是什么:

IACA (the Intel Architecture Code Analyzer)是英特尔制造的( 2019:生命终结)免费软件,闭源静态分析工具,用于静态分析现代英特尔处理器执行时的指令调度。这允许它为给定的片段计算

  • 吞吐量模式中,最大吞吐量(假设片段是最内层循环的主体
  • 延迟模式中,从第一条指令到最后一条指令的最小延迟。
  • 跟踪模式中,通过其管道阶段打印指令的进度。

当假设最佳执行条件时(所有内存访问都命中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位操作系统和64位代码分析。

如何使用它:

IACA的输入是您的代码的已编译二进制文件,其中已注入两个标记开始标记结束标记< / em>的。标记使代码不可用,但允许工具快速找到相关的代码片段并进行分析。

您不需要在系统上运行二进制文件;实际上,由于代码中存在注入的标记,提供给IACA 的二进制文件无论如何都可以运行。 IACA只需要能够读取要分析的二进制文件。因此,使用IACA可以在Pentium III机器上分析使用FMA指令的Haswell二进制文件。

C / C ++

在C和C ++中,可以使用#include "iacaMarks.h"访问标记注入宏,其中iacaMarks.hinclude/子目录中工具附带的标题。

然后将标记插入感兴趣的 最里面 循环或感兴趣的直线块周围,如下所示:

/* C or C++ usage of IACA */

while(cond){
    IACA_START
    /* Loop body */
    /* ... */
}
IACA_END

然后重建应用程序,否则将启用优化(在Visual Studio等IDE用户的发布模式下)。输出是一个二进制文件,它在版本构建的所有方面都是相同的,除非存在标记,这使得应用程序不可运行。

IACA依赖于编译器不会过度重新排序标记;因此,对于此类分析,如果对标记重新排序以包括不在最内层循环内的无关代码或排除其中的代码,则可能需要禁用某些强大的优化。

Assembly(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 ++程序员来说,编译器实现相同的模式至关重要。

输出的内容:

举个例子,让我们分析following assembler example on the Haswell architecture

.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前端和Port 2和3的AGU。此示例允许我们将问题诊断为端口7未处理存储,并采取补救措施。

限制:

IACA不支持某些指令,这些指令在分析中被忽略。它不支持比Nehalem更早的处理器,并且不支持吞吐量模式中的非最内层循环(无法猜测采用的频率和模式)。