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

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

从使用硬件实现的预取程序优化英特尔®酷睿™微体系结构上的应用程序性能以及如何在32位英特尔®体系结构上进行硬件和软件预取之间进行select ,我需要更新MSR以禁用硬件预取function。

这是一个相关的片段:

“DPL Prefetch和L2 Streaming Prefetch设置也可以通过编写一个设备驱动实用程序来改变IA32_MISC_ENABLE寄存器 – MSR 0x1A0的位,从而以编程方式进行更改,这种实用工具可以启用或禁用预取机制,而不需要任何服务器停机。

下表显示IA32_MISC_ENABLE MSR中为了控制DPL和L2stream预取而必须更改的位:

 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,但没有奏效。 我也尝试直接在asm/msr.h使用wrmsr ,但是那段错误。 我试图在一个内核模块中做这个…并杀死了机器。

顺便说一句 – 我正在使用内核2.6.18-92.el5,它有MSR链接在内核中:

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

从英特尔参考:
该指令必须在特权级别0或实地址模式下执行; 否则会产生一般保护exception#GP(0)。 在ECX中指定保留或未实现的MSR地址也会导致一般保护exception。


在使用此指令之前,应使用CPUID指令来确定MSR是否受支持(EDX [5] = 1)。

所以,你的错误可能与一个不支持MSR或使用错误的MSR地址的CPU相关。

在内核源代码中有很多使用MSR的例子:

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

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);

您可以使用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并使用pwrite写入0x1a0偏移量的msr“文件”来以root身份执行此操作。

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

对于我的英特尔至强5650(06_2CH系列)处理器, 手册第35章规定了地址为0x1A0的寄存器IA32_MISC_ENABLE的位10至8是保留的。 我想这意味着我不能切换预取器打开和closuresMSR。

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

在2014年,英特尔公布了有关Nehalem,Westmere,Sandy Bridge,Ivy Bridge,Haswell,Broadwell(以及可能更新的内核)的0x1a4 msr(1a4 msr)禁用h / w预取器的信息。 链接是由bholanath 在这里find的:

英特尔处理器上的H / W预取器控制的公布 – ,2014年9月24日

本文披露了可用于控制基于以下微架构的英特尔处理器上可用的各种硬件预取程序的MSR设置:Nehalem,Westmere,Sandy Bridge,Ivy Bridge,Haswell和Broadwell。

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

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

它们是每个CPU核心本地的,可以通过msr linux内核驱动程序的root来修改。 英特尔使用它们来测量使用英特尔MLC工具的NUMA中的内存延迟:

例如,Intel Memory Latency Checker工具( http://www.intel.com/software/mlc )通过写入MSR 0x1a4来修改预取程序,以测量精确的延迟,并在退出时将其恢复到原始状态。