如何以编程方式禁用硬件预取?

时间:2009-04-23 23:56:50

标签: linux kernel prefetch

我想以编程方式禁用硬件预取。

来自Optimizing Application Performance on Intel® Core™ Microarchitecture Using Hardware-Implemented PrefetchersHow to Choose between Hardware and Software Prefetch on 32-Bit Intel® Architecture, 我需要更新MSR以禁用硬件预取。

以下是相关摘录:

  

“DPL Prefetch和L2 Streaming Prefetch设置也可以通过编程方式进行更改   通过编写设备驱动程序实用程序来更改IA32_MISC_ENABLE中的位   注册 - MSR 0x1A0。这样的实用程序提供启用或禁用预取的功能   机制,无需任何服务器停机。

下表显示IA32_MISC_ENABLE MSR中为了控制DPL和L2 Streaming Prefetch而必须更改的位:

Prefetcher Type MSR (0x1A0) Bit Value 
DPL (Hardware Prefetch) Bit 9 0 = Enable 1 = Disable 
L2 Streamer (Adjacent Cache Line Prefetch) Bit 19 0 = Enable 1 = Disable"

我尝试使用http://etallen.com/msr.html,但这不起作用。 我还尝试直接在wrmsr使用asm/msr.h但是段错误。 我尝试在内核模块中执行此操作...并杀死了计算机。

顺便说一句 - 我使用的是内核2.6.18-92.el5,它在内核中链接了MSR

$ grep -i msr /boot/config-$(uname -r)
CONFIG_X86_MSR=y
...

4 个答案:

答案 0 :(得分:26)

您可以使用msr-tools启用或禁用硬件预取程序 http://www.kernel.org/pub/linux/utils/cpu/msr-tools/

以下启用硬件预取器(通过取消设置第9位):

[root@... msr-tools-1.2]# ./wrmsr -p 0 0x1a0 0x60628e2089 
[root@... msr-tools-1.2]# ./rdmsr 0x1a0 
60628e2089

以下禁用硬件预取器(通过启用位9):

[root@... msr-tools-1.2]# ./wrmsr -p 0 0x1a0 0x60628e2289 
[root@... msr-tools-1.2]# ./rdmsr 0x1a0 
60628e2289

以编程方式,您可以通过打开/dev/cpu/<cpunumber>/msr和以root身份执行此操作 使用pwrite写入0x1a0偏移量的msr“文件”。

答案 1 :(得分:11)

来自英特尔参考:
该指令必须在特权级别0或实地址模式下执行;否则,将生成一般保护异常#GP(0)。在ECX中指定保留或未实现的MSR地址也会导致一般性保护异常
...
CPUID指令应用于确定是否支持MSR(EDX [5] = 1) 在使用本指令之前。

因此,您的错误可能与不支持MSR或使用错误的MSR地址的CPU有关
在内核源代码中有很多使用MSR的例子:

在内核源代码中,对于单个cpu,它演示了在arch / i386 / kernel / cpu / intel.c中禁用Xeon的预取,在函数中:

static void __cpuinit Intel_errata_workarounds(struct cpuinfo_x86 * c)

rdmsr函数参数是msr编号,指向低32位字的指针,以及指向高32位字的指针。
wrmsr函数参数是msr编号,低32位字值和高32位字值
多核或smp系统必须将cpu结构作为第一个参数传递:
void rdmsr_on_cpu(unsigned int cpu,u32 msr_no,u32 * l,u32 * h);
void wrmsr_on_cpu(unsigned int cpu,u32 msr_no,u32 l,u32 h);

答案 2 :(得分:3)

2014年,英特尔发布了关于h / w prefetcher禁用的信息,其中包括Nehalem,Westmere,Sandy Bridge,Ivy Bridge,Haswell,Broadwell(以及可能更新的核心)的0x1a4 msr(1a4 msr)。 bholanath here找到了链接:

https://software.intel.com/en-us/articles/disclosure-of-hw-prefetcher-control-on-some-intel-processors披露部分英特尔处理器的H / W预取控制权 - Vish Viswanathan(英特尔),2014年9月24日

  

本文公开了MSR设置,可用于控制基于以下微体系结构的英特尔处理器上可用的各种h / w预取程序:Nehalem,Westmere,Sandy Bridge,Ivy Bridge,Haswell和Broadwell。

     

上述处理器支持4种类型的h / w预取程序,用于预取数据。有2个预取器与L1数据高速缓存(也称为DCU DCU预取器,DCU IP预取器)相关联,2个预取器与L2高速缓存相关联(L2硬件预取器,L2相邻高速缓存行预取器)

     

每个核心都有一个模型特定寄存器(MSR),地址为0x1A4,可用于控制这4个预取器。该寄存器中的0-3位可用于启用或禁用这些预取器。该MSR的其他位保留。

它们是每个CPU核心的本地核心,可以在msr linux内核驱动程序的帮助下由root进行更改。它们被英特尔用于使用英特尔MLC工具测量NUMA中的内存延迟:

  

例如,英特尔内存延迟检查工具(http://www.intel.com/software/mlc)通过写入MSR 0x1a4来修改预取程序,以测量准确的延迟并在退出时将它们恢复到原始状态。

答案 3 :(得分:2)

我在这里添加一个答案,因为之前的答案可能不适用于所有英特尔处理器。

对于我的Intel Xeon 5650(06_2CH系列)处理器,manual chapter 35指定地址0x1A0的寄存器IA32_MISC_ENABLE的第10位至第8位保留。我想这意味着我无法在MSR上打开和关闭prefetcher。

根据英特尔员工here的回答:“英特尔尚未透露如何禁用Nehalem上的处理器上的预取程序。您需要使用BIOS中的选项禁用预取程序。”