我想以编程方式禁用硬件预取.
从使用硬件实现的预取程序优化英特尔®酷睿™微体系结构上的应用程序性能以及 如何在32位英特尔®架构上选择硬件和软件预取,我需要更新MSR以禁用硬件预取.
这是一个相关的片段:
"DPL预取和L2流预取设置也可以通过编写设备驱动程序实用程序来更改
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"
Run Code Online (Sandbox Code Playgroud)
我尝试使用http://etallen.com/msr.html,但这不起作用.我使用也试图wrmsr
在asm/msr.h
直接但段错误.我尝试在内核模块中执行此操作...并杀死了计算机.
顺便说一句 - 我使用的是内核2.6.18-92.el5并且它已MSR
在内核中链接:
$ grep -i msr /boot/config-$(uname -r)
CONFIG_X86_MSR=y
...
Run Code Online (Sandbox Code Playgroud) 我正在为valgrind中的cachegrind/callgrind工具整理一个小补丁,它将使用完全通用的代码,CPU指令和缓存配置自动检测(现在只有x86/x64自动配置,而其他架构不提供CPUID类型配置为非特权代码).此代码需要完全在非特权上下文中执行,即纯用户模式代码.它还需要可以在非常不同的POSIX实现中移植,因此grokking/proc/cpuinfo不会这样做,因为我们的目标系统之一没有这样的东西.
检测CPU的频率,高速缓存的数量,它们的大小,甚至高速缓存行大小都可以使用100%通用POSIX代码完成,该代码没有任何特定于CPU的操作码(只是很多合理的假设,例如添加两个数字在一起,如果没有内存或寄存器依赖性停顿,可能会在一个周期内执行).这部分相当简单.
什么不是那么简单,为什么我问StackOverflow,是如何检测给定缓存的缓存行关联性?关联性是缓存中可以包含来自主内存的给定缓存行的位数.我可以看到可以检测到L1缓存关联性,但L2缓存?当然L1关联性会受到影响吗?
我很欣赏这可能是一个无法解决的问题.但我把它扔到StackOverflow上,并希望有人知道我不知道的事情.请注意,如果我们在这里失败,我将简单地以四方式的关联性默认值进行硬编码,假设它不会对结果产生巨大影响.
谢谢,
尼尔