assembly - 指令表中缺少延迟
问题描述
我目前正在查看 Agner Fog 的指令表,以了解常见指令的延迟。
我希望我没有错过文档中这个问题的答案,但是任何人都可以向我解释为什么对于某些说明,没有延迟条目?
例如,带有操作数 r、r、m 的 PEXT 指令的延迟对于 Skylake 是否留空?
缺少延迟的解释是什么?为什么首先很难获得延迟(如果是这种情况)?
解决方案
IDK 为什么 Agner 在他的电子表格中将一些单元格留空。我认为这些都是手动输入的,因为至少有几个相当清晰的错字,例如,5
而不是0.5
为了某些东西的吞吐量(内存源 vinserti128 或其他东西,IIRC)。
解释是,除了您可以从 CPU 通常的工作方式中推断出的信息之外,还有零信息。即通常有一个单独的加载uop 为ALU uop 供电,它通常与带有寄存器源的ALU uop 相同。但是一些指令可以使用广播加载,例如vpsrld
具有内存源移位计数(低元素适用于所有)的 Skylake 看起来它使用广播加载 uop 而不是其通常的 ALU shuffle 来提供可变移位 uop(如vpsrlvd
1 uop 用于 p01)。
对于具有多个输入的多指令,Agner 仍然只列出 1 个延迟数。那不是一张完整的图片。有时第一个 uop 只需要一个输入,因此延迟来自a -> result
> b -> result
。例如,他将vpsrld
(SKL 上 p01 p5 的 2 微指令)列为 1c 吞吐量/1c 延迟。这显然是不可能的两个输入都为 1c 的结果。据推测,Agner 测量了数据输入 -> 输出延迟,轮班计数的广播超出了关键路径。(我从它只是 p5 的事实推断 p5 uops 正在做什么:洗牌端口。并且 SKL 有 1 个 uop 可变计数移位。而且它不需要从内存中进行移位计数。明显的结论是这是一个广播洗牌或加载。)
要获得更完整的延迟数据,请参阅https://www.uops.info/table.html
它有一个完整的延迟细分pext r64, r64, m64
:
- 测量: 延迟:
- 延迟操作数 2 → 1: 3
- 延迟操作数 3 → 1(地址):8
- 延迟操作数 3 → 1(内存):≤7
到目前为止,他们只有大部分英特尔 CPU(但也有 Zen),但数据来自自动化测试,并分别测试每个输入到每个输出。并列出 IACA 数据。 对于每条指令的每种形式,都有一个指向其详细测试结果的链接。
此外,他们对多指令指令的 uop 故障更加小心,例如movbe r64, m64
,不是 2p0156 + p23,而是 p06 p15 p23(就像bswap r64
Agner 确实正确的那样)。
推荐阅读
- javascript - 上传文件和图像显示的简单预览不起作用
- go - 如何从 Cobra 根命令内部运行子命令
- java - 无法解析符号“名称”和“标识”
- r - function that plot bar chart and histogram base on selected column data type
- c - MISRA C:类型转换和 <<,& 位运算符错误
- swift - IOS & WatchOS后台通信
- laravel - 如何将 laravel 7.1.3 项目转换为在 laravel 8.0.0 上运行?
- sql - 如何在一个 SQL 查询中计算几个表中的相同列
- linux - rm 一个随机文件后不再显示文件
- image - 在不损失质量的情况下将 SVG 转换为 PNG 和 PDF?