メモリアクセス解決編:Tualatin と K6-III の場合

2001 年 8 月 25 日初版
2002 年 1 月 02 日改訂

1. はじめに

前の二つの記事( Part I, Part II で,どうやらテーブル・ルックアサイド・バッファ (TLB) が問題らしいということが分かってきた. そこに注意しながら,さらに違う CPU も調べてみよう.

2. K6III-450

まずは AMD K6-III 450MHz で試す. マザーボードは FIC VA503+ で,チップセットは VIA MVP3, メモリは PC100 SDRAM 128MB である. FSB100MHz の 4.5 倍速で動作. OS は FreeBSD2.2.8R で,少し古い. K6-III のキャッシュは,一次キャッシュが命令 32KB+データ 32KB の 合計 64KB で,それに二次キャッシュが 256KB ついている. この二次キャッシュの大きさは N = 181 に対応する.

K6III-450

一見した特徴は,N = 181 の左右での性能の落差が, 他の CPU に比べて少ないことである. これは K6-III CPU の FPU の性能が他の CPU と比べて低く, かえってメモリの速度とバランスがとれていることを示す. コード B では,二次キャッシュに収まるときでも 33MFLOPS 位しか でないが,N が 1000 に近いときでも 28MFLOPS 位でている. コード A では,N〜260 で K7 に似たひざが現れている. ここは行列サイズ 512KB に相当する. K6-III のデータ TLB は 128 エントリあるので 4KB/ページで ちょうど計算が合う. N〜1000 でも 20MFLOPS 程度でており, これは FSB133MHz の Athlon に匹敵する.

3. Tualatin-1.13G

Tualatin-1.13G は,PentiumIII の最終版であり,Coppermine にはなかった 主記憶のハードウエア先読み機構を備えている. 次のグラフは,行列演算のような規則的なメモリアクセスについて, 先読み機構が極めて効果的に働いていることを示す.

Tualatin-1.13G

アクセスを連続化したコード B では,行列を大きくしても 150MFLOPS 位でており,これは同クロックの Athlon の二倍である. コード A でも 50MFLOPS はコンスタントに出ており, やはり Athlon の二倍でている. マザーボードは ASUSTeK TUSL2-C,チップセットは intel 815EP であり, メモリはただの PC133 CL3 SDRAM である. それが,DDR の Athlon より速いのである. 主記憶が,単なるスループットでは判断できないことが分かる.

4. 解決編

Athlon の演算性能が K6-III はもちろん,Pentium 3 に比べても 高いことは認められている. それにも関らず SETI@home や SUPER_PI などメモリアクセスの 頻繁なプログラムで同クロックの Pentium 3 に負ける場合がある. これは,いままで漠然と「intel のチップセットが優秀だから」と いわれてきたが,実はそうではなく, Athlon CPU のメモリアーキテクチャの問題だったのである. それは二点ある.

  1. 二次 TLB が二次キャッシュと分離していること.
  2. キャシュラインが長いこと.

4.1. TLB の構造

Thunderbird までの Athlon のブロックダイアグラムを見ると, Data TLB は一次キャッシュと二次キャッシュの両方の中にある. 二次キャッシュとは独立な二次 TLB を持つのならば, ページテーブルのキャッシングは禁止されていると考えられる. 探しているページが 24 エントリの一次 TLB になければ, 256 エントリある二次 TLB を探しにいく. 二次 TLB にもなければ,主記憶上にあるページテーブルをアクセスしにいく. 1 ページは 4kB の大きさだから,TLB 経由でアクセスできる メモリ領域は 1MB までである. プロセスのワーキングセット(ある期間内にアクセスされるメモリ領域の合計) が 1MB を越えると,TLB ミスが起こる. すると一つのデータにアクセスするために複数回主記憶を読む ことになり,性能が大幅に落ちる.

Pentium 3 プロセサは二次 TLB を持たないが, その代わりページテーブルは他のデータと同じくキャッシュされる. よって一次 TLB ミスがおきても,ページテーブルの該当部分が二次キャッシュ 上にあれば,二次 TLB がヒットしたのとおおよそ同じことになる. 二次キャッシュの容量は十分大きく,数メガバイトくらいのワーキングセット のためのページテーブルは十分保持できる.

Athlon が独立した二次 TLB を持つ理由を想像すると,

  1. 二次キャッシュはライン単位でアクセスしないといけないが, TLB ならそういう制約はないので,ヒットする限りアクセスが速くできる.
  2. 二次キャッシュの実質容量をふやしたい.
というところであろうか.

4.2. キャッシュライン長

K6 シリーズと Pentium3 のキャッシュラインが 32Bytes であるのに対し, Athlon は 64Bytes である. つまり K6/P3 では主記憶への一回のアクセスで 8Bytes データが 四回バースト転送されるのに対し,Athlon では八回になる. データがシーケンシャルにアクセスされる場合には, バースト長が長い方がアクセス回数が減り, スループットには有利になる. しかし,1アクセスあたりの転送時間が長いため, ランダムアクセスには不利になる. 特に,ページテーブルへのアクセスは連続転送ではないので, 無駄なデータ転送をしている間,表を引いて解決した データアドレスへのアクセスは待たされる. つまりバースト長が長い Athlon は,

  1. ランダムアクセスが不利
  2. TLB ミス時の物理アドレス解決が不利
という二重苦をしょっていることになる. 二次キャッシュがオンダイになった Thunderbird で ランダムアクセス性能がかなり上がったのは, このへんに理由があるのだろう. さらに,CuMine CPU で TLB ミスが性能に響かないのは, intel がいうところの ATC の効果もあるかも知れない. 一次--二次キャッシュ間を 256Bit 幅のバスで結んだため, 一キャッシュラインの転送が一回の転送でできるのである. Pentium 4 プロセサ(Netburst architecture)も キャシュラインを 64bytes に伸ばしたので, やはりランダムアクセスは苦手である.

4.3. Athlon の改良

そうはいっても,DDR メモリと Palomino コア(XP/MP) の組合せに なってからは,Athlon が P3/P4 を問わず,intel CPU に負けることは 少なくなってきた. それは,いくつかの改良点が功を奏しているいるためである.
  1. DDR メモリが使われるようになって八回の転送に四クロックで 済むようになり,1 アクセスあたりの転送時間の不利が消えた.
  2. TLB の改良.一次 TLB が 24 エントリから 32 エントリとなり, 二次 TLB と排他制御されることになって,有効な TLB のエントリ は 288 になった (その他にほとんど使われないラージページが 8 エントリある). TLB に保持される記憶領域は 1152KB と 12.5% 増えた.
  3. 投機的プリフェッチがデータと TLB の両方でなされるようになって, 見かけのアクセスレイテンシが短くなった. この機能は Tualatin Pentium 3 プロセサも備えている.