パフォーマンスの最大の違いは、メモリの広い領域に広い間隔でランダム アクセスを行う場合に発生します。ここで「大きい」とは、TLB 内のすべての小さなページ エントリによってマップできる範囲よりもはるかに大きいことを意味します (通常は最新のプロセッサでは複数のレベルがあります)。
さらに複雑なことに、4kB ページの TLB エントリ数は 2MB ページのエントリ数よりも多くなることがよくありますが、これはプロセッサによって大きく異なります。レベル 2 TLB で使用可能な「ラージ ページ」エントリの数にも、さまざまなバリエーションがあります。
たとえば、AMD Opteron ファミリ 10h リビジョン D (「イスタンブール」) システムでは、cpuid は次のように報告します。
- L1 DTLB: 4kB ページ: 48 エントリ。2MB ページ: 48 エントリ。1GB ページ: 48 エントリ
- L2 TLB: 4kB ページ: 512 エントリ。2MB ページ: 128 エントリ。1GB ページ: 16 エントリ
Intel Xeon 56xx (「Westmere」) システムでは、cpuid は次のように報告します。
- L1 DTLB: 4kB ページ: 64 エントリ。2MB ページ: 32 エントリ
- L2 TLB: 4kB ページ: 512 エントリ。2MB ページ: なし
どちらもレベル 2 TLB ミスが発生する前に小さなページを使用して 2MB (512*4kB) をマップできますが、Westmere システムは 32 個の 2MB TLB エントリを使用して 64MB をマップでき、AMD システムは L1 および L2 で 176 個の 2MB TLB エントリを使用して 352MB をマップできます。 TLB。いずれのシステムも、2MB よりはるかに大きく 64MB 未満のメモリ範囲でのランダム アクセスにラージ ページを使用することで、大幅なスピードアップが得られます。AMD システムは、はるかに大きなメモリ範囲に対して大きなページを使用して、引き続き優れたパフォーマンスを発揮するはずです。
これらすべてのケースで回避しようとしているのは、x86_64 階層アドレス変換の 4 つのレベルすべてをトラバースするという最悪のケース (注 1) のシナリオです。
アドレス変換キャッシング メカニズム (注 2) が機能しない場合は、次のものが必要です。
- 4kB ページにマップされたデータをロードするためのメモリへの 5 回のトリップ、
- 2MB ページにマップされたデータをロードするためのメモリへの 4 回のトリップ、および
- 1GB ページにマップされたデータをロードするためにメモリに 3 回トリップします。
いずれの場合も、メモリへの最後のトリップは要求されたデータを取得することであり、他のトリップはページ変換情報のさまざまな部分を取得するために必要です。私が見た中で最も適切な説明は、AMD の「AMD64 Architecture Programmer's Manual Volume 2: System Programming」(出版物 24593) http://support.amd.com/us/Embedded_TechDocs/24593.pdfのセクション 5.3 にあります。
注 1: 上記の数値は実際には最悪のケースではありません。仮想マシンで実行すると、これらの数値が悪化します。さまざまなレベルのページ テーブルを保持するメモリがディスクにスワップされる環境で実行すると、パフォーマンスが大幅に低下します。
注 2: 残念ながら、このレベルの詳細を知るだけでは十分ではありません。最近のすべてのプロセッサには、ページ変換階層の上位レベルに追加のキャッシュがあるためです。私が知る限り、これらは公に文書化されていません。