プログラムでハードウェアのプリフェッチを無効にしたいのですが。
ハードウェア実装のプリフェッチャーを使用したインテル®Core™マイクロアーキテクチャーでのアプリケーションパフォーマンスの最適化 および 2ビットインテル®アーキテクチャーでハードウェアとソフトウェアのプリフェッチを選択する方法 から、更新する必要がありますハードウェアプリフェッチを無効にするMSR。
関連するスニペットは次のとおりです。
「DPLプリフェッチおよびL2ストリーミングプリフェッチ設定は、
IA32_MISC_ENABLE
レジスタ–MSR 0x1A0
のビットを変更するためのデバイスドライバユーティリティを作成することにより、プログラムで変更することもできます。このようなユーティリティは、プリフェッチメカニズムを有効または無効にする機能を提供します。サーバーのダウンタイムを必要とせずに。
次の表は、DPL
およびL2ストリーミングプリフェッチを制御するために変更する必要があるIA32_MISC_ENABLE MSR
のビットを示しています。
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
...
Intelリファレンスから:
この命令は、特権レベル0またはリアルアドレスモードで実行する必要があります。それ以外の場合は、一般保護例外#GP(0)が生成されます。 ECXで予約済みまたは未実装のMSRアドレスを指定すると、一般保護違反も発生します。
.。
CPUID命令は、この命令を使用する前に、MSRがサポートされているかどうか(EDX [5] = 1)を決定するために使用する必要があります。
したがって、障害は、MSRをサポートしていないCPUに関連しているか、間違ったMSRアドレスを使用している可能性があります。
カーネルソースで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);
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を使用して0x1a0
オフセットのmsr「ファイル」に書き込むことでrootとしてこれを行うことができます。
2014年、Intelは、Nehalem、Westmere、Sandy Bridge、Ivy Bridge、Haswell、Broadwell(およびおそらく新しいコア)の0x1a4 msr(1a4 msr)で無効にするハードウェアプリフェッチャーに関する情報を公開しました。リンクは bholanathhere によって見つかりました:
https://software.intel.com/en-us/articles/disclosure-of-hw-prefetcher-control-on-some-intel-processors 一部のIntelでのH/Wプリフェッチャー制御の開示プロセッサー-VishViswanathan(Intel)、2014年9月24日
この記事では、Nehalem、Westmere、Sandy Bridge、Ivy Bridge、Haswell、Broadwellのマイクロアーキテクチャに基づいてIntelプロセッサで使用できるさまざまなh/wプリフェッチャーを制御するために使用できるMSR設定について説明します。
上記のプロセッサは、データをプリフェッチするために4種類のハードウェアプリフェッチャーをサポートしています。 L1データキャッシュに関連付けられた2つのプリフェッチャー(DCUDCUプリフェッチャー、DCU IPプリフェッチャーとも呼ばれます)とL2キャッシュに関連付けられた2つのプリフェッチャー(L2ハードウェアプリフェッチャー、L2隣接キャッシュラインプリフェッチャー)。
これらの4つのプリフェッチャーを制御するために使用できるアドレス0x1A4のすべてのコアにモデル固有レジスタ(MSR)があります。このレジスタのビット0〜3を使用して、これらのプリフェッチャーを有効または無効にすることができます。このMSRの他のビットは予約されています。
これらはすべてのCPUコアに対してローカルであり、msr
linuxカーネルドライバーを使用してrootで変更できます。これらは、IntelMLCツールを使用してNUMAのメモリレイテンシを測定するためにIntelによって使用されます。
たとえば、Intelメモリレイテンシチェッカーツール( http://www.intel.com/software/mlc )は、MSR 0x1a4への書き込みを通じてプリフェッチャーを変更して、正確なレイテンシを測定し、それらを元の状態に復元します。出口。
以前の回答はすべてのIntelプロセッサに適用できるとは限らないため、ここで回答を追加します。
私のIntelXeon 5650(06_2CHファミリ)プロセッサの場合、 マニュアルの第35章 は、アドレス0x1A0のレジスタIA32_MISC_ENABLEのビット10から8が予約されていることを指定します。これは、MSRを介してプリフェッチャーのオンとオフを切り替えることができないことを意味していると思います。
Intelの従業員からの回答によると ここ :「IntelはNehalem以降のプロセッサでプリフェッチャーを無効にする方法を開示していません。BIOSのオプションを使用してプリフェッチャーを無効にする必要があります。」