尝试在Core i7系统中禁用硬件预取程序时出现错误。我按照链接How do I programmatically disable hardware prefetching?
关注该方法在我的系统中
grep -i msr / boot / config - $(uname -r)
CONFIG_X86_DEBUGCTLMSR = Y
CONFIG_X86_MSR = Y
CONFIG_SCSI_ARCMSR = M
这是我的错误消息
root @ ./rdmsr 0x1a0
850089
[root @ ./wrmsr -p 0 0x1a0 0x850289(禁用Core i7中的硬件预取器)
wrmsr:pwrite:输入/输出错误
我因为禁用相邻的缓存行预取而得到同样的错误
知道如何解决这个问题吗?提前谢谢。
答案 0 :(得分:4)
MSR规范特定于英特尔处理器系列,如Intel Architectures Software Developer Manuals第35章所述。因此,您必须首先检查您是否可以通过MSR禁用CPU的预取器,然后检查哪些位注册必须切换它。
对于我的处理器,Intel Xeon 5650(06_2CH系列)手册指定保留地址0x1A0的寄存器IA32_MISC_ENABLE的第10位至第8位。我想这意味着我无法通过MSR打开和关闭预取器。根据英特尔员工here的回答:"Intel has not disclosed how to disable the prefetchers on processors from Nehalem onward. You'll need to disable the prefetchers using options in the BIOS."
在我的工作站上,运行
sudo wrmsr -p 0 0x1a0 0x850289
结果:
wrmsr: CPU 0 cannot set MSR 0x000001a0 to 0x0000000000850289
但是
sudo wrmsr -p 0 0x1a0 0x850088
作品。
这似乎证实我无法使用MSR禁用预取。请注意,此错误与您的错误不同,并且在阅读上面第35.9章提到的英特尔手册后,您的处理器似乎也无法使用MSR消除预取器。我不知道为什么我们没有相同的错误消息,你的msr模块和Linux内核的版本是什么? (modinfo msr
)
因此,BIOS可能是禁用不同预取程序的唯一方法,就像我的Xeon 5650一样。
答案 1 :(得分:3)
事实证明,0x1A0位9和19是奔腾4和其他一些旧型号的正确MSR /位,但 0x1A4位0-3 是几个最近的模型的正确MSR位Nehalem开始。我用Skylake服务器测试了0x1A4,它运行良好,而0x1A0没有。
此处提供快速文档:Disclosure of H/W prefetcher control on some Intel processors
在开发人员手册的第3卷中有关于此和其他MSR的更完整的文档:(click here)。该文件还确认在较旧的处理器型号中使用了0x1A0位9和19,但0x14A用于更新的型号。
其他MSR看起来也非常有趣,也可以进行实验('禁用L3缓存'任何人?)。只需确保在正确的处理器系列下寻找MSR!