如何解决研究 movdir64b 指令延迟的微基准测试
我想在支持此指令的系统上研究指令 movdir64b
的延迟。
如何编写一个简单的微基准来实现这一点?
注意:MOVDIR64B
从源内存地址读取 64 字节,并执行到目标地址的 64 字节直接存储操作。 [详情:https://www.felixcloutier.com/x86/movdir64b]
解决方法
存储部分是 NT(如 movntps
),因此如果延迟很重要,您不应该使用它。如果目标缓存线先前存在,它将强制从缓存中驱逐目标缓存线,因此重新加载将导致缓存未命中一直到 DRAM。
如果您关心(通过此核心)快速重新加载数据,请使用普通的可缓存存储。或者,如果您关心它被另一个内核重新加载,那么另一个内核必须要求该内核共享该行(比 L3 缓存命中慢一些)可能比一直到 DRAM 更快。
请注意,预期用例是针对 PCIe 设备的 MMIO 写入。 (使用另一个 CPU 特性,Sapphire Rapids 中的 ENQCMD = Tiger Lake 的服务器版本(phoronix article),提供了一种更好的方式,让您无需运行另一条 I/O 指令来检查写入是否成功如果成功提交了工作描述符。)
您可以使用一个简单的循环来验证重新加载是否缓慢,该循环使存储和重新加载成为循环携带的依赖链的一部分。使用 AVX-512(例如在同时具有 AVX-512 和 movdir64b 的 Tiger Lake (Willow Cove core uarch) 上),您可以重新加载完整数据并将其存储回源缓冲区,从而创建循环携带的依赖链。
或者您可以使用 movdir64b a,b
/ movdir64b b,a
在交替方向上进行 64 字节的复制。 (然后取循环的平均周期/迭代)。
lea rdi,[rel buf+0]
lea rsi,[rel buf+64]
mov ecx,10000000
.loop:
movdir64b rdi,[rsi]
movdir64b rsi,[rdi]
dec ecx
jnz .loop
(将其放入静态可执行文件中并使用 perf stat
对其计时。)
或者您可以重新加载 movdir64b 目标并将该加载结果用作 movdir64b
的源地址,测试来自地址输入而不是内存数据输入的延迟。 (从包含指向自身的指针的源数据的前 8 个字节开始。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。