相关疑难解决方法(0)

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

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

使用硬件实现的预取程序优化英特尔®酷睿™微体系结构上的应用程序性能以及 如何在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,但这不起作用.我使用也试图wrmsrasm/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)

linux kernel prefetch

45
推荐指数
2
解决办法
1万
查看次数

为什么JVM不在Windows x86上发出预取指令

正如标题所述,为什么OpenJDK JVM不会在Windows x86上发出预取指令?请参阅OpenJDK Mercurial @http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/c49dcaf78a65/src/os_cpu/windows_x86/vm/prefetch_windows_x86.inline.hpp

inline void Prefetch::read (void *loc, intx interval) {}
inline void Prefetch::write(void *loc, intx interval) {}
Run Code Online (Sandbox Code Playgroud)

没有评论,我发现除了源代码之外没有其他资源.我问,因为它对Linux x86这样做,请参阅http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/c49dcaf78a65/src/os_cpu/linux_x86/vm/prefetch_linux_x86.inline.hpp

inline void Prefetch::read (void *loc, intx interval) {
#ifdef AMD64
  __asm__ ("prefetcht0 (%0,%1,1)" : : "r" (loc), "r" (interval));
#endif // AMD64
}

inline void Prefetch::write(void *loc, intx interval) {
#ifdef AMD64

  // Do not use the 3dnow prefetchw instruction.  It isn't supported on em64t.
  //  __asm__ ("prefetchw (%0,%1,1)" : : "r" (loc), "r" (interval));
  __asm__ …
Run Code Online (Sandbox Code Playgroud)

java x86 assembly jvm jvm-hotspot

8
推荐指数
2
解决办法
356
查看次数

标签 统计

assembly ×1

java ×1

jvm ×1

jvm-hotspot ×1

kernel ×1

linux ×1

prefetch ×1

x86 ×1