linux数据预取,linux-如何以编程方式禁用硬件预取?

这篇博客讨论了如何在Linux中通过编程方式禁用Intel硬件预取器,包括使用msr-tools工具和直接操作MSR寄存器。作者遇到的问题包括权限错误、不支持的MSR地址以及内核模块导致的系统崩溃。解决方案涉及检查CPU支持,使用CPUID指令,并参考内核源代码中的示例。同时,提到了针对不同Intel处理器型号的MSR地址和控制预取器的不同方法。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值