linux-如何以编程方式禁用硬件预取?
我想以编程方式禁用硬件预取。
从使用硬件实现的预取器优化英特尔®酷睿™微体系结构上的应用程序性能如何在32位英特尔®架构的硬件和软件预取之间进行选择,我需要更新MSR以禁用硬件预取。
以下是相关片段:
“ DPL预取和L2流预取设置也可以通过编程方式进行更改 通过编写设备驱动程序实用程序来更改MSR中的位 register – asm/msr.h.这样的实用程序提供启用或禁用预取的功能 机制,无需任何服务器停机时间。
下表显示了在MSR中必须更改的位,以控制asm/msr.h和L2流预取:
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中使用MSR,但这会引起段错误。我尝试在内核模块中执行此操作……并杀死了计算机。
顺便说一句-我正在使用内核2.6.18-92.el5,它在内核中链接有MSR:
$ grep -i msr /boot/config-$(uname -r)
CONFIG_X86_MSR=y
...
Carlos asked 2020-07-13T12:40:22Z
4个解决方案
26 votes
您可以使用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//msr以root身份执行此操作,然后使用pwrite在0x1a0偏移量处写入msr“文件”。
Carlos answered 2020-07-13T12:42:07Z
11 votes
从英特尔参考中:
该指令必须在特权级别0或实地址模式下执行; 否则,将生成一般保护异常#GP(0)。 在ECX中指定保留的或未实现的MSR地址也会导致一般保护异常。
...
应该使用CPUID指令来确定是否支持MSR(EDX [5] = 1)在使用此指令之前。
因此,您的故障可能与不支持MSR或使用错误MSR地址的CPU有关。
在内核源代码中有许多使用MSR的示例:
在内核源代码中,对于单个cpu,它演示了在arch / i386 / kernel / cpu / intel.c中通过以下功能禁用Xeon的预取:
静态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);
Chris answered 2020-07-13T12:41:33Z
3 votes
2014年,英特尔发布了有关使用0x1a4 msr(1a4 msr)禁用Nehalem,Westmere,Sandy Bridge,Ivy Bridge,Haswell,Broadwell(可能还有更新的内核)的硬件预取器的信息。 链接是由bholanath在这里找到的:
[https://software.intel.com/zh-cn/articles/disclosure-of-hw-prefetcher-control-on-some-intel-processors]在某些Intel处理器上公开的硬件预取器控制-Vish Viswanathan( 英特尔),2014年9月24日
本文介绍了MSR设置,该设置可用于控制基于以下微体系结构的Intel处理器上可用的各种硬件预取器:Nehalem,Westmere,Sandy Bridge,Ivy Bridge,Haswell和Broadwell。
上面提到的处理器支持4种类型的硬件预取器,用于预取数据。 有2个与L1数据高速缓存关联的预取器(也称为DCU DCU预取器,DCU IP预取器)和2个与L2高速缓存关联的预取器(L2硬件预取器,L2相邻高速缓存行预取器)。
每个内核上都有一个地址为0x1A4的模型专用寄存器(MSR),可用于控制这4个预取器。 该寄存器中的位0-3可用于启用或禁用这些预取器。 该MSR的其他位保留。
它们对于每个CPU内核都是本地的,可以在msr linux内核驱动程序的帮助下由root进行更改。 英特尔使用它们使用英特尔MLC工具在NUMA中测量内存延迟:
例如,英特尔内存延迟检查器工具([http://www.intel.com/software/mlc)]通过对MSR 0x1a4的写操作来修改预取器,以测量准确的延迟并将其恢复到退出时的原始状态。
osgx answered 2020-07-13T12:42:55Z
2 votes
我在这里添加一个答案,因为以前的答案可能不适用于所有英特尔处理器。
对于我的Intel Xeon 5650(06_2CH系列)处理器,手册第35章指定保留地址0x1A0处的寄存器IA32_MISC_ENABLE的位10至8。 我想这意味着我无法通过MSR打开和关闭预取器。
根据一位英特尔员工在这里的回答:“英特尔尚未披露如何从Nehalem开始禁用处理器上的预取器。您需要使用BIOS中的选项来禁用预取器。”
Manuel Selva answered 2020-07-13T12:43:24Z