我想以编程方式禁用硬件预取.
从使用硬件实现的预取程序优化英特尔®酷睿™微体系结构上的应用程序性能以及 如何在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) 什么是现代的Linux实现的同样的效果最快,最好的方法fork- execve组合从一个大的过程?
我的问题是,分叉过程大约为500MBy,并且一个简单的基准测试只能从该过程中获得大约50个分叉/秒(参见最小尺寸过程的~10000分叉/秒),这对于预期的应用来说太慢了.
一些谷歌搜索出现了,vfork因为它被发明为这个问题的解决方案......但也警告不要使用它.现代Linux似乎已经获得了相关clone和posix_spawn呼叫; 这些可能会有所帮助吗?什么是现代的替代品vfork?
我在i7上使用64位Debian Lenny(如果posix_spawn有帮助,该项目可以转移到Squeeze ).
在单核计算机上,一次执行一个线程.在每个上下文切换上,调度程序检查要调度的新线程是否与前一个线程处于同一进程中.如果是这样,则不需要对MMU(页面表)进行任何操作.在另一种情况下,需要使用新的流程页表更新页表.
我想知道多核计算机上是怎么发生的.我猜每个核心上都有一个专用的MMU,如果同一进程的两个线程同时在2个核心上运行,则每个核心的MMU只需引用相同的页面表.这是真的 ?你能指点我对这个问题的好的参考吗?
虽然我已经阅读了关于movntdqa的相关说明,但已经找到了一种表达内存范围不可缓存或读取数据的简洁方法,以免污染缓存.我想从gcc做到这一点.我的主要目标是交换到大型阵列中的随机位置.希望通过避免缓存来加速此操作,因为数据恢复非常少.
我想估计由于运行Linux的x86-64(Intel Nehalem)机器上的TLB未命中而导致的性能开销.我希望通过使用一些性能计数器得到这个估计.有没有人对什么是估计这个的最佳方法有一些指示?
谢谢Arka
我正在尝试优化我的代码,利用多核处理器来复制任何操作大型密集阵列.
对于复制:我有一个大密集阵列(大约6000x100000),我需要从中拉出15x100000子阵列,在管道上进行多次计算.该管道由许多线性代数函数组成,这些函数由blas处理,这是多核的.与线性代数相比,提取数据的时间是否真的重要是一个悬而未决的问题,但我要谨慎一点,并确保数据复制得到优化.
对于操作:我有许多不同的函数,通过元素或行来操作数组.如果每个都做多核,那将是最好的.
我的问题是:最好是使用正确的框架(OpenML,OpenCL)并让编译器发生所有的魔术,还是有更好的功能/库可以更快地完成这项工作?