46

ハードウェアのプリフェッチをプログラムで無効にしたいと考えています。

ハードウェアで実装されたプリフェッチャーを使用したインテル® Core™ マイクロアーキテクチャーでのアプリケーション・パフォーマンスの最適化と、32 ビットのインテル® アーキテクチャーでハードウェアとソフトウェアのプリフェッチを選択する方法から、 MSRを更新してハードウェアのプリフェッチを無効にする必要があります。

関連するスニペットは次のとおりです。

「DPL プリフェッチと L2 ストリーミング プリフェッチの設定は、IA32_MISC_ENABLE レジスタのビットを変更するためのデバイス ドライバ ユーティリティを作成することにより、プログラムで変更することもできMSR 0x1A0ます。このようなユーティリティは、サーバーのダウンタイムを必要とせずに、プリフェッチ メカニズムを有効または無効にする機能を提供します。

次の表に、および L2 ストリーミング プリフェッチ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"

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
...
4

4 に答える 4

27

msr-tools http://www.kernel.org/pub/linux/utils/cpu/msr-tools/を使用して、ハードウェア プリフェッチャーを有効または無効にできます。

次の例では、ハードウェア プリフェッチャーを有効にします (ビット 9 の設定を解除することにより)。

[root@... msr-tools-1.2]# ./wrmsr -p 0 0x1a0 0x60628e2089 
[root@... msr-tools-1.2]# ./rdmsr 0x1a0 
60628e2089

次の例では、ハードウェア プリフェッチャーを無効にします (ビット 9 を有効にすることにより)。

[root@... msr-tools-1.2]# ./wrmsr -p 0 0x1a0 0x60628e2289 
[root@... msr-tools-1.2]# ./rdmsr 0x1a0 
60628e2289

/dev/cpu/<cpunumber>/msrプログラム的には、pwrite を開き、オフセットで msr "ファイル" に書き込むことにより、ルートとしてこれを行うことができます0x1a0

于 2009-04-24T22:10:13.033 に答える
13

Intel リファレンスから:
この命令は特権レベル 0 または実アドレス モードで実行する必要があります。それ以外の場合、一般保護例外 #GP(0) が生成されます。ECX で予約済みまたは実装されていない MSR アドレスを指定すると、一般保護例外も発生します。

...
この命令を使用する前に、CPUID 命令を使用して、MSR がサポートされている (EDX[5]=1) かどうかを判断する必要があります。

そのため、MSR をサポートしていない、または間違った MSR アドレスを使用している CPU に問題がある可能性があります。

カーネル ソースで MSR を使用する例は多数あります。

カーネル ソースでは、単一の CPU に対して、関数内の arch/i386/kernel/cpu/intel.c で Xeon のプリフェッチを無効にする方法を示しています。

static void __cpuinit Intel_errata_workarounds(struct cpuinfo_x86 *c)

rdmsr 関数の引数は、msr 番号、下位 32 ビット ワードへのポインター、および上位 32 ビット ワードへのポインターです。
wrmsr 関数の引数は、msr 番号、下位 32 ビットのワード値、および上位 32 ビットのワード値です。

マルチコアまたは smp システムは、最初の引数として cpu 構造体を渡す必要があります:
void rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h);
void wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h);

于 2009-04-24T09:10:54.933 に答える
2

以前のものはすべての Intel プロセッサに適用できるとは限らないため、ここに回答を追加します。

私の Intel Xeon 5650 (06_2CH ファミリ) プロセッサでは、マニュアルの第 35 章で、アドレス 0x1A0 のレジスタ IA32_MISC_ENABLE のビット 10 から 8 が予約されていると指定されています。これは、MSR を介してプリフェッチャーのオンとオフを切り替えることができないことを意味していると思います。

Intel の従業員からの回答によると、 「Intel は Nehalem 以降のプロセッサでプリフェッチャーを無効にする方法を開示していません。BIOS のオプションを使用してプリフェッチャーを無効にする必要があります。」

于 2014-01-27T14:14:30.680 に答える