研究 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 个字节开始。)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...