【问题标题】:What is IACA and how do I use it?什么是 IACA 以及如何使用它?
【发布时间】:2014-11-19 05:00:27
【问题描述】:

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

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

【问题讨论】:

    标签: c++ c performance assembly iaca


    【解决方案1】:

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

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

    2017-03:版本 2.3 发布

    它是什么:

    IACA (the Intel Architecture Code Analyzer) 是(2019:生命终结)免费软件,由 Intel 开发的闭源静态分析工具,用于静态分析现代 Intel 处理器执行时的指令调度。这允许它计算,对于给定的 sn-p,

    • 吞吐量模式下,最大吞吐量(sn-p 假定为最内层循环的主体
    • 延迟模式下,从第一条指令到最后一条指令的最小延迟。
    • 跟踪模式中,打印指令通过其流水线阶段的进度。

    假设最佳执行条件时(所有内存访问都命中 L1 缓存并且没有页面错误)。

    IACA 从 2.3 版开始支持 Nehalem、Westmere、Sandy Bridge、Ivy Bridge、Haswell、Broadwell 和 Skylake 处理器以及从 3.0 版开始的 Haswell、Broadwell 和 Skylake 计算调度。

    IACA 是一个命令行工具,可生成 ASCII 文本报告和 Graphviz 图。 2.1 及以下版本支持 32 位和 64 位 Linux、Mac OS X 和 Windows 以及 32 位和 64 位代码分析; 2.2 及以上版本仅支持 64 位操作系统和 64 位代码分析。

    使用方法:

    IACA 的输入是您的代码的编译二进制文件,其中注入了两个标记:一个开始标记和一个结束标记。标记使代码无法运行,但允许工具快速找到相关的代码片段并对其进行分析。

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

    C/C++

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

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

    /* C or C++ usage of IACA */
    
    while(cond){
        IACA_START
        /* Loop body */
        /* ... */
    }
    IACA_END
    

    然后重新构建应用程序,就像启用优化的其他方式一样(对于 Visual Studio 等 IDE 的用户,在发布模式下)。输出是一个二进制文件,在所有方面都与 Release 版本相同,除了存在标记,这使应用程序无法运行。

    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++ 程序员来说至关重要。

    它的输出:

    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 开关的文件)。上面sn-p给出的报告是:

    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 更早的处理器,也不支持吞吐量模式下的非最内层循环(无法猜测哪个分支被采用的频率和模式)。

    【讨论】:

    • IACA 是否要求您拥有硬件?我的意思是你可以编译例如fma3 并在只有 SSE2 的 core2 系统上使用 IACA 对其进行测试?而相反。如果我想测试仅 SSE2 的代码,我可以使用 Haswell 系统执行此操作吗?如果 IACA 读取计数器,我认为这是不可能的。但由于 IACA 不需要 root/admin,我认为这意味着它不需要硬件。
    • @Zboson 它不需要硬件;它是一个静态分析工具,因此从不实际运行代码。唯一真正的要求是要分析的二进制文件;您甚至不需要运行所述二进制文件来分析它。事实上,由于注入了标记,要分析的二进制文件无法运行。
    • 你没有在听我在说什么。我在看iacaMarks.h!您指的是适用于 C/C++ 的定义。这不适用于 NASM。看看标题的末尾。有一个注释块,以“/**************** asm *****************”开头的块中的汇编代码是您与 NASM 一起使用的。
    • 有趣的工具 :-} 我有一个内部汇编程序块,其中包含一些具有 两个 出口的内部分支。我将开始标记放在顶部,将结束标记放在 both 出口上。当我运行它时(它工作!很好!)它选择两个出口中的 一个 并向我显示所选路径的结果。 a) 它似乎在有条件但很少执行的块内拾取代码;我如何让它忽略它,以及 b)我如何分析两条路径? (我将尝试删除一个分支上的标记,但担心该工具会跟随该分支进入它导致的无限代码供应......
    • @halivingston 现代英特尔 CPU 不仅是 流水线(多条指令在不同的完成阶段同时执行的概念),而且超标量(在同一完成阶段执行多条指令的概念)。英特尔处理器获取的(多条)指令随后被解码为 0+ 个微操作,并将这些微操作分派到能够处理它们的端口。调整良好的代码可确保所使用的指令均匀地饱和端口,因此一切都高效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2015-03-13
    • 2013-10-25
    • 1970-01-01
    • 2011-11-01
    相关资源
    最近更新 更多