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

46
我希望能够以编程方式禁用硬件预取。从使用硬件实现的预取器优化Intel® Core™微架构应用程序性能在32位Intel®架构上选择硬件和软件预取的方法中,我需要更新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,但没有成功。 我也尝试直接在asm/msr.h中使用wrmsr,但那会导致段错误。 我试图在内核模块中实现这一点...结果导致机器崩溃。
顺便说一句 - 我正在使用内核版本2.6.18-92.el5,其中已经将MSR链接到了内核中。
$ grep -i msr /boot/config-$(uname -r)
CONFIG_X86_MSR=y
...

这将是一项痛苦的工作,并会使您的性能降至谷底(好吧,您的应用程序可能会进行显式预取 - 但机器上的其他任何东西,比如内核呢?)。请注意,有关选择预取技术的文章仅提到了P4;新的芯片与NetBurst非常不同!这让我想知道您是否确定必须这样做,或者您只是在摸索其他事情。 - kquinn
我的实际目标是通过比较有无预取的总线带宽使用(BUS_TRAN_BURST.SELF 事件)来确定有用的预取量。 - Carlos
很抱歉我的无知(从未在内核层面上做过事情),但我认为禁用预取会是一件糟糕的事情(tm),也就是说,它存在的原因是有意义的,所以不要去对它进行干扰... - Michael Todd
.globl _start .text _start: pusha mov msr_pf,%ecx // OF 32 rdmsr mov %edx, hi mov %eax, lo popamov $1,%eax ; // 终止进程 mov $0,%ebx ; // 返回状态 int $0x80 ; // 系统调用.data .align 8, 0xff lo: .word 0 hi: .word 0 msr_pf: .word 0x1A0将所有内容保存到文件rdmsr.s中:然后执行以下命令: as rdmsr.s -o rdmsr.o ld rdmsr.o -o rdmsr如果可以在ring 0中运行它,那么它会很好地工作。 - Chris
那么你的前提是预取的额外内存实际上没有用处吗?英特尔对此进行了详细讨论:http://software.intel.com/en-us/articles/how-to-choose-between-hardware-and-software-prefetch-on-32-bit-intel-architecture/ - Chris
我并不认为它没有用处。我只是想要测量有用/无用的硬件预取量,并确定任何可以修改代码以提高硬件预取器效果的区域。 - Carlos
4个回答

28
您可以使用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

你可以以root身份编程方式打开/dev/cpu/<cpunumber>/msr,并使用pwrite在0x1a0偏移处写入msr "file"。


5
谢谢,Carlos!在执行此操作之前可能需要运行“modprobe msr”。 - JohnTortugo
1
我得到了 wrmsr: pwrite: 操作不允许。你知道如何解决吗? - St.Antario
msr 0x1a0仅适用于原始Core 2处理器,从Nehalem微架构开始,它更改为msr 0x1a4,将位0-3设置为1可以禁用L2硬件预取器/L2相邻缓存行预取器/DCU硬件预取器/DCU IP预取器,只需在英特尔SDM vol4中搜索“Prefetcher Disable”即可。 - TingQian LI

13

根据英特尔参考文献:
此指令必须在特权级0或实模式下执行;否则,将生成通用保护异常#GP(0)。在ECX中指定保留或未实现的MSR地址也会导致通用保护异常。


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

因此,您的故障可能与不支持MSR的CPU或使用错误的MSR地址有关。

内核源代码中有许多使用MSR的示例:

在内核源代码中,对于单个CPU,它演示了在arch / i386 / kernel / 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);


1
看起来我的内核(2.6.18-92.el5)在msr.h中没有rdmsr_on_cpu或wrmsr_on_cpu。这是在2.6.19中添加的吗? - Carlos
1
就在Debian选择2.6.18后不久,根据lkml.org在2007年1月引入了该补丁:http://lkml.org/lkml/2007/1/18/91 - Chris

4

2014年,英特尔发布了关于禁用硬件预取的信息,使用了0x1a4 msr(1a4 msr)用于Nehalem、Westmere、Sandy Bridge、Ivy Bridge、Haswell、Broadwell(以及可能更高版本的核心)。该链接由bholanath here发现:

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

本文介绍了可以用来控制基于以下微架构的Intel处理器上可用的各种硬件预取器的MSR设置:Nehalem、Westmere、Sandy Bridge、Ivy Bridge、Haswell和Broadwell。
上述处理器支持4种类型的硬件预取器以进行数据预取。其中有2个预取器与L1数据缓存相关(也称为DCU DCU预取器,DCU IP预取器),另外2个预取器与L2缓存相关(L2硬件预取器,L2相邻缓存行预取器)。
每个核心都有一个特定型号寄存器(MSR),地址为0x1A4,可用于控制这4个预取器。该寄存器中的位0-3可用于启用或禁用这些预取器。此MSR的其他位是保留的。
它们是每个CPU核心本地的,并且可以通过msr Linux内核驱动程序由root更改。它们被Intel用于使用Intel MLC工具测量NUMA中的内存延迟。
例如,英特尔内存延迟检查工具(http://www.intel.com/software/mlc)通过写入MSR 0x1a4来修改预取器以测量准确的延迟,并在退出时将其恢复到原始状态。

3
记录一下,我已经确认此方法在Skylake上可以按照描述的方式工作。 - BeeOnRope

2
我在这里添加一个答案,因为之前的答案可能不适用于所有英特尔处理器。
对于我的英特尔 Xeon 5650 (06_2CH家族) 处理器,手册第35章 指定寄存器 IA32_MISC_ENABLE 的地址为 0x1A0 的位 10 到 8 为保留位。我猜这意味着我不能通过 MSR 切换预取器的开关。
根据一位英特尔员工的回答这里:“英特尔没有披露如何在 Nehalem 及以后版本的处理器上禁用预取器。您需要使用 BIOS 中的选项来禁用预取器。”

2
阅读该帖子后,我看到其中一个评论链接到这个新文档,可能适用(具有不同的MSR地址)- https://software.intel.com/en-us/articles/disclosure-of-hw-prefetcher-control-on-some-intel-processors - Leeor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接