rdmsr 时序是否取决于寄存器读取?

Does rdmsr timing depend on the register read?

执行 rdmsr 所需的时间是否在很大程度上取决于寄存器读取?

是的,时间在很大程度上取决于寄存器。以下是一些示例(在英特尔酷睿 i7-8700K 上测量):

  • 读取寄存器E8H(IA32_APERF)需要大约91个核心周期。
  • 读取寄存器 1A0 (IA32_MISC_ENABLE) 通常需要 ~500 到 ~550 个核心周期。
  • 读取寄存器 19CH (IA32_THERM_STATUS) 通常需要 ~900 到 ~1050 个核心周期。
  • 读取寄存器 198H (IA32_PERF_STATUS) 通常需要 ~5300 到 ~5700 个内核周期。

这是我用于测量的 nanoBench 命令:

sudo ./kernel-nanoBench.sh -asm "rdmsr" -asm_init "mov RCX, 0xE8"    
sudo ./kernel-nanoBench.sh -asm "rdmsr" -asm_init "mov RCX, 0x1A0"
sudo ./kernel-nanoBench.sh -asm "rdmsr" -asm_init "mov RCX, 0x19C"
sudo ./kernel-nanoBench.sh -asm "rdmsr" -asm_init "mov RCX, 0x198"