问题标签 [iaca]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 什么是 IACA,我如何使用它?
我发现了这个有趣且强大的工具,称为IACA(英特尔架构代码分析器),但我无法理解它。我可以用它做什么,它有什么限制,我可以如何:
- 用它来分析 C 或 C++ 中的代码?
- 用它来分析 x86 汇编器中的代码?
assembly - 微融合和寻址模式
使用英特尔® 架构代码分析器(IACA) ,我发现了一些意想不到的东西(对我来说)。
以下指令使用[base+index]
寻址
根据 IACA,不进行微熔断。但是,如果我[base+offset]
这样使用
IACA 报告说它确实融合了。
英特尔优化参考手册的第 2-11 节以“所有解码器可以处理的微融合微操作”为例给出以下内容
Agner Fog 的优化组装手册也给出了使用[base+index]
寻址的微操作融合示例。例如,参见第 12.2 节“Core2 上的相同示例”。那么正确答案是什么?
c - 为什么我的带有 IACA 标记的程序可以编译,但当我先编译为程序集时却没有?
我正在尝试使用英特尔的 IACA 进行一些代码分析。我已经使用这个 Stack Overflow 问题来设置制造商。我遇到的问题是,如果我使用 gcc 并直接从源代码编译到二进制文件,我很好。程序编译并且 IACA 工作正常。但是,如果我先使用 -S 编译为 asm,然后在其上使用 gcc,则会出现以下错误。
我承认这些是 IACA 注入的指令。但我不知道为什么当我首先编译为 asm 时它们只是一个问题。
我想这样做的原因是我希望能够在 FORTRAN 代码上使用 IACA,所以我无法使用 c 头文件。我应该可以手动将标记放在 asm 中,但之后我无法编译代码。
为了清楚起见,对于我在这里发布的代码,我只使用了头文件并得到了这个错误。我没有在 asm 中添加任何内容。刚编译成asm,然后编译成二进制。
主.c:
生成文件:
make all
工作正常,然后 IACA 接受二进制文件并运行分析。make asm
紧随其后make final
会产生上述错误。
我在 Intel Xeon-2699 和 gcc 4.9.1 上运行 64 位 Ubuntu 14.10。
assembly - 用于 AVX 加载/存储指令的 Intel Broadwell uop fusion
我正在尝试确定内存绑定矢量化循环的性能基线。我在 32 字节对齐的环境中使用带有 AVX2 指令的 Intel Broadwell 芯片执行此操作。
基线循环一次使用 8 个 YMM 寄存器从一个位置加载并非临时存储到另一个位置:
我用 YASM 组装它,然后用英特尔架构代码分析器 (IACA) 进行测试,它告诉我:
我的印象是,我可以在 Broadwell 上一次获得 2 倍负载,同时在端口 2 和 3 上同时加载。为什么没有发生这种情况?
谢谢
更新
根据以下建议,将 pd 替换为 ps,并将地址合并到一个寄存器中,新代码如下所示:
然后 IACA 告诉我:
这告诉我商店现在可以使用端口 7 作为地址并且操作已存储。IACA 告诉我,“块吞吐量”仍然是 8 次操作,因为需要额外操作才能将地址放到单个寄存器上。也许我做错了?
我还是不明白为什么加载操作不能融合
delphi - 将 IACA 与非汇编例程一起使用
我一直在玩IACA(英特尔的静态代码分析器)。
在使用可以手动输入魔术标记字节的程序集片段进行测试时,它可以正常工作,如下所示:
有没有办法用所需的魔法标记为非汇编代码添加前缀/后缀,以便我可以分析编译器生成的代码?
我知道我可以从 CPU 视图复制粘贴生成的程序集并使用它创建一个例程,但我希望有一个更简单的工作流程
编辑
我正在寻找适用于 64 位编译器的解决方案。我知道我可以在 32 位编译器中混合汇编和普通代码。
更新
@Dsm 的建议有效。@Rudy 的把戏没有。
以下虚拟代码有效:
更新 2
如果那里有一个 call 语句,IACA 似乎会炸毁并且不想分析代码。抱怨非法指令。然而,基本的想法是有效的。显然,您需要减去初始ret
成本及其相关成本。
performance - 两个看似等效的汇编代码之间的性能差异
tl;dr:我有两个功能等效的 C 代码,我用 Clang 编译(事实上它是 C 代码并不重要;我认为只有程序集很有趣),IACA 告诉我应该更快,但我不明白为什么,我的基准测试显示两个代码的性能相同。
我有以下 C 代码(暂时忽略#include "iacaMarks.h"
, IACA_START
, IACA_END
):
参考c:
我想知道是否可以通过手动重新调度一些指令来优化它(我很清楚 C 编译器应该产生有效的调度,但我的实验表明并非总是如此)。在某些时候,我尝试了以下代码(它与上面的代码相同,只是没有使用临时变量来存储稍后分配给*r5
and的 XOR 的结果*r6
):
重新调度.c:
我正在使用针对我的 i5-6500 (Skylake) 的 Clang 5.0.0 编译这些代码,并带有标志-O3 -march=native
(我省略了生成的汇编代码,因为它们可以在下面的 IACA 输出中找到,但如果你愿意要直接将它们放在这里,问我,我会添加它们)。我对这两个代码进行了基准测试,并没有发现它们之间的任何性能差异。出于好奇,我对它们运行了 IACA,我惊讶地发现它说第一个版本需要 6 个周期才能运行,而第二个版本需要 7 个周期。以下是 IACA 的产出:
对于第一个版本:
对于第二个版本:
如您所见,在第二个版本中,IACA 表示瓶颈是后端,并且“后端分配因不可用的分配资源而停止”。
两种汇编代码都包含相同的指令,唯一的区别是最后 7 条指令的调度以及它们使用的寄存器。
我能想到的唯一可以解释为什么第二个代码更慢的事实是它xmm0
在最后 4 条指令中写入了两次,从而引入了依赖关系。但由于这些写入是独立的,我希望 CPU 为它们使用不同的物理寄存器。但是,我无法真正证明这个理论。此外,如果像这样使用两次xmm0
是一个问题,我希望 Clang 为其中一条指令使用不同的寄存器(特别是因为这里的寄存器压力很低)。
我的问题:第二个代码应该更慢(基于汇编代码),为什么?
编辑:IACA 跟踪:
第一版:https
://pastebin.com/qGXHVW6a
第二版:https ://pastebin.com/dbBNWsc2
注意:C 代码是 Serpent 密码的第一个 S-box 的实现,由 Osvik在此处计算。
assembly - 英特尔 IACA 分析器会改变装配吗?
我想通过 IACA 分析器运行一些代码,看看它使用了多少微指令——我从一个简单的函数开始,看看它是否工作..
不幸的是,当我插入 IACA 说要使用的宏时,生成的程序集非常不同,因此对其进行任何分析都没有帮助。
这是在没有 IACA 的情况下生成的组件
这是我添加 IACA 宏后它产生的结果..(我正在测试 MSVC 生成的二进制文件,所以我正在使用 IACA_VC64_START 和 IACA_VC64_END 作为手册所说的)。
所以它插入了很多动作,现在我的(希望)融合添加不再融合-..
我希望它能告诉我是否
保持融合,但它一起删除了这段代码..
这是一个已知问题,还是因为我使用的 MSVC 可能不太常见?
有没有办法解决这个问题,或者有更好的与 MSVC 兼容的工具?