Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何以编程方式禁用硬件预取?_Linux_Kernel_Prefetch - Fatal编程技术网

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

Linux 如何以编程方式禁用硬件预取?,linux,kernel,prefetch,Linux,Kernel,Prefetch,我想以编程方式禁用硬件预取 从和 , 我需要更新MSR以禁用硬件预取 以下是一个相关的片段: “DPL预取和L2流预取设置也可以通过编程方式更改 通过编写用于更改IA32\u MISC\u ENABLE中位的设备驱动程序实用程序 寄存器–MSR 0x1A0。此类实用程序提供启用或禁用预取的功能 无需任何服务器停机的机制 下表显示了IA32_MISC_ENABLE MSR中必须更改的位,以便控制DPL和二级流预取: Prefetcher Type MSR (0x1A0) Bit Value DP

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

从和 , 我需要更新MSR以禁用硬件预取

以下是一个相关的片段:

“DPL预取和L2流预取设置也可以通过编程方式更改 通过编写用于更改
IA32\u MISC\u ENABLE中位的设备驱动程序实用程序
寄存器–
MSR 0x1A0
。此类实用程序提供启用或禁用预取的功能 无需任何服务器停机的机制

下表显示了
IA32_MISC_ENABLE MSR
中必须更改的位,以便控制
DPL
和二级流预取:

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"
我试着用了,但没用。 我还试着直接在
asm/msr.h
中使用
wrmsr
,但这会出错。 我试着在一个内核模块中这样做…然后杀死了机器

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

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

从英特尔参考资料:
此指令必须在特权级别0或实地址模式下执行;否则,将生成一般保护异常GP(0)。在ECX中指定保留或未实现的MSR地址也将导致一般保护异常。


CPUID指令应用于确定是否支持MSR(EDX[5]=1) 在使用本说明之前。

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

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

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

静态无效\uuu cpuinit英特尔\u勘误表\u变通方法(结构cpuinfo\ux86*c)

rdmsr函数参数是msr编号、指向低32位字的指针和指向高32位字的指针。
wrmsr函数参数是msr编号、低32位字值和高32位字值。

多核或smp系统必须将cpu结构作为第一个参数传入:
cpu上的无效rdmsr_(无符号整数cpu,u32 msr_编号,u32*l,u32*h);
cpu上的无效wrmsr_(无符号整数cpu,u32 msr_编号,u32 l,u32 h);


您可以使用msr工具启用或禁用硬件预取器

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

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

通过编程,您可以以root用户身份打开
/dev/cpu//msr

使用pwrite在
0x1a0
偏移量处写入msr“文件”。

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

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


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

2014年,英特尔发布了有关使用0x1a4 msr(1a4 msr)禁用h/w预取器的信息Nehalem、Westmile、Sandy Bridge、Ivy Bridge、Haswell、Broadwell(以及可能较新的岩心)的链接由以下人员发现:

披露某些英特尔处理器上的H/W预取器控制-维什·维斯瓦纳坦(英特尔),2014年9月24日

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

上述处理器支持4种类型的h/w预取器用于预取数据。有2个预取器与一级数据缓存关联(也称为DCU DCU预取器、DCU IP预取器),还有2个预取器与二级缓存关联(二级硬件预取器、二级相邻缓存线预取器)

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

它们是每个CPU内核的本地版本,可以在
msr
linux内核驱动程序的帮助下由root用户更改。Intel使用它们通过Intel MLC工具测量NUMA中的内存延迟:

例如,“英特尔内存延迟检查工具”(Intel Memory Latency Checker tool)通过写入MSR 0x1a4来修改预取器,以测量准确的延迟,并在退出时将其恢复到原始状态


这将是一件痛苦的事情,并且会让你的性能陷入地狱(好吧,你的应用程序可能会进行显式预取——但是机器上会有其他东西吗,比如内核?)请注意,那篇关于在预取技术之间进行选择的文章只提到了P4;较新的芯片与NetBurst非常不同!这让我想知道您是否确定必须这样做,或者您只是在摸索其他方法。我的实际目标是通过比较总线带宽来确定有用的改进量年龄(BUS_TRAN_BURST.SELF events),有预取和没有预取。很抱歉我的无知(从未在内核级别做过事情),但我觉得这是件坏事(tm)要禁用预取,也就是说,它存在是有原因的,所以不要弄乱它…..globl_start.text_start:pusha mov msr_pf,%ecx//32 rdmsr mov%edx,hi mov%eax,lo popa mov$1,%eax;//终止进程mov$0,%ebx;//结果状态int$0x80;//系统调用.data.align 8,0xff lo:.word 0 hi:.word 0 msr_pf:.word 0x1A0将所有内容保存在一个文件中:rdmsr.s然后:作为rdmsr.s-o
[root@... msr-tools-1.2]# ./wrmsr -p 0 0x1a0 0x60628e2089 
[root@... msr-tools-1.2]# ./rdmsr 0x1a0 
60628e2089
[root@... msr-tools-1.2]# ./wrmsr -p 0 0x1a0 0x60628e2289 
[root@... msr-tools-1.2]# ./rdmsr 0x1a0 
60628e2289