【发布时间】:2010-10-21 12:10:17
【问题描述】:
我想以编程方式禁用硬件预取。
来自Optimizing Application Performance on Intel® Core™ Microarchitecture Using Hardware-Implemented Prefetchers 和 How to Choose between Hardware and Software Prefetch on 32-Bit Intel® Architecture, 我需要更新 MSR 以禁用硬件预取。
这是一个相关的sn-p:
"DPL Prefetch 和 L2 Streaming Prefetch 设置也可以通过编程方式更改 通过编写设备驱动程序实用程序来更改
IA32_MISC_ENABLE中的位 注册——MSR 0x1A0。这样的实用程序提供了启用或禁用预取的能力 无需任何服务器停机时间的机制。
下表显示了IA32_MISC_ENABLE MSR 中为控制DPL 和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 中使用wrmsr,但是会出现段错误。
我尝试在内核模块中执行此操作......并杀死了机器。
顺便说一句 - 我使用的是内核 2.6.18-92.el5,它在内核中链接了 MSR:
$ grep -i msr /boot/config-$(uname -r)
CONFIG_X86_MSR=y
...
【问题讨论】:
-
这会很痛苦,而且会把你的表现送入地狱(好吧,你的应用可能会进行显式预取——但是机器上的任何东西else,像内核一样?)。请注意,关于在预取技术之间进行选择的文章只提到了 P4;较新的芯片与 NetBurst 非常不同!这让我想知道您是否确定您必须这样做,或者您是否只是在摸索其他事情。
-
我的实际目标是通过比较有无预取的总线带宽使用情况(BUS_TRAN_BURST.SELF 事件)来确定有用的 prefecting 数量。
-
对不起我的无知(从未在内核级别做过任何事情)但我的印象是禁用预取是一件坏事(tm),即它的存在是有原因的,所以不要'别惹它....
-
.globl _start .text _start: pusha mov msr_pf,%ecx // OF 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 然后: as rdmsr.s -o rdmsr.o ld rdmsr. o -o rdmsr 如果你可以在 ring 0 中运行它,它会工作得很好。
-
所以你的前提是预取的额外内存实际上没有用?
英特尔详细讨论了这个问题:software.intel.com/en-us/articles/…>