N-yagi PC ManiaX

XeonMP L3キャッシュ検証?

メモリー転送能力を検証する為、MemSpeedVer1.1でチェックしてみました。OSはWindows2000+SP2です。
比較する為、Pentium3−Sのデータも取りました。

CPU:XeonMP 1.6G/L3-1M
FSB:400MHz
マザー:DP400
MEM:PC800-45 128Mx4 Samsung
.
CPU:Pentium3-S 1.26GHz
FSB:133MHz
マザー:P3TDE6-G
MEM:Reg-PC133 CL3? 256Mx4 日立
(グラフのレンジが異なるので注意)

なんだか、P3−Sの方がキャッシュ性能が高い気がするのは気のせいでしょうか?

CPU:XeonMP 1.6G/L3-1M @ 1.866GHz
FSB:533MHz
マザー:DP400
MEM:PC800-45 128Mx4 Samsung
CPU:Pentium3-S 1.40GHz
FSB:133MHz
マザー:P3DRE
MEM:PC800-45 256Mx4 Infineon

FSBの速さから、Xeonの方がアベレージは良いですが、キャッシュの速度はP3−Sの方が安定しているように見えます。

どうも、XeonMPのL3キャッシュはレイテンシがあるとしか思えない結果となりました。2次キャッシュが、 3次キャッシュのレイテンシに引きずられているようにも見えます。

XeonMPのデーターシートを見ると、以下のようになっています。
L2/L3いずれもフルスピードであると書いてあります。 一体、何がいけないのでしょうか。Pentium2時代には、「L2−ECCを有効にすると微妙に遅くなる」 事がありましたが、今回の現象もそうなのでしょうか。

BIOSでL3キャッシュの項目を見ると、有効/無効が選べるだけで、ECCの項目はありません。 とりあえず、L2−ECC項目の有効/無効を切り替えてみましたが変化はありませんでした。 更に、L2の能力を見ようとL3を無効にすると、CPU1のみがL3無効になり、CPU2のL3を無効に出来ませんでした。



仕方が無いので、マザー上のCPUを1個にして調べてみました。

1.L3キャッシュの有効性
BIOSで、L3の有効/無効を切り替えてみました。
L3無効L3有効

L3そのものはしっかり機能しているようです。また、L3無効時のグラフからL2も機能はしている模様。 しかし、L1に対してL2が遅くなる事に変化ありません。

2.MPとDPの差?
ハードウェア的にL3の存在しないXeonDPと比較してみました。 (ただし、XeonDP1.7G−ESなので比較対象として適当かどうかは少々怪しいですが)

その結果、MPのL3無効時とほぼ同じ結果(測定誤差程度の差しかなかった)になりました。 MPだからL2が遅いわけではないようです。


キャッシュに関して、NETやデータシートを読み漁ったところ、この傾向はPentium4特有の物でありそうです。 Pentium4のアーキテクチャをもっとよく理解する必要があるようです。



ロードレイテンシ測定プログラムを製作しました。

このプログラムから以下のような結果が得られました。

Processer Information --------------------------------------
CPU Freq = 1865.84 MHz 
Level1 InstructionCache Information
	Instruction TLB, 4K or 2M or 4M pages, fully associative, 64 entries
	Instruction Trace cache, 8-way set associative, 12K uOps
Level1 DataCache Information
	Data cache, sectored, 64 byte cache line, 4-way set associative, 8K
	Data TLB, 4K or 4M pages, fully associative, 64 entries
Level2 UnifiedCache Information
	Unified cache, sectored, 64 byte cache line, 8-way set associative, 256K
Level3 UnifiedCache Information
	Unified cache, sectored, 64 byte cache line, 8-way set associative, 1M

Single DWORD RANDOM access speed -----------------------
    Buffer Size     : Read Latency : Access
 [     1024 bytes ] : 2.05 clock : 3633.51 MB/s
 [     2048 bytes ] : 2.03 clock : 3680.36 MB/s
 [     4096 bytes ] : 2.03 clock : 3682.28 MB/s
 [     8192 bytes ] : 3.32 clock : 2250.32 MB/s
 [    16384 bytes ] : 18.50 clock : 403.37 MB/s
 [    32768 bytes ] : 18.48 clock : 403.82 MB/s
 [    65536 bytes ] : 18.46 clock : 404.28 MB/s
 [   131072 bytes ] : 18.46 clock : 404.20 MB/s
 [   262144 bytes ] : 19.29 clock : 386.85 MB/s
 [   524288 bytes ] : 40.46 clock : 184.47 MB/s
 [  1048576 bytes ] : 54.71 clock : 136.41 MB/s
 [  2097152 bytes ] : 323.28 clock : 23.09 MB/s
 [  4194304 bytes ] : 323.90 clock : 23.04 MB/s
 [  8388608 bytes ] : 323.32 clock : 23.08 MB/s

Single DWORD SEQUENTIAL access speed -------------------
    Buffer Size     : Read Latency : Access
 [     1024 bytes ] : 2.04 clock : 3656.72 MB/s
 [     2048 bytes ] : 2.05 clock : 3633.48 MB/s
 [     4096 bytes ] : 2.02 clock : 3697.41 MB/s
 [     8192 bytes ] : 2.11 clock : 3541.20 MB/s
 [    16384 bytes ] : 2.89 clock : 2581.47 MB/s
 [    32768 bytes ] : 2.64 clock : 2827.91 MB/s
 [    65536 bytes ] : 2.46 clock : 3030.46 MB/s
 [   131072 bytes ] : 2.48 clock : 3007.15 MB/s
 [   262144 bytes ] : 2.80 clock : 2661.31 MB/s
 [   524288 bytes ] : 3.62 clock : 2062.21 MB/s
 [  1048576 bytes ] : 3.83 clock : 1950.92 MB/s
 [  2097152 bytes ] : 5.80 clock : 1287.05 MB/s
 [  4194304 bytes ] : 5.78 clock : 1291.18 MB/s
 [  8388608 bytes ] : 5.77 clock : 1292.68 MB/s
complete!

1次キャッシュアクセス8kまでの2Clockはデータシート通りです。 2次キャッシュアスセスは、18Clockと出ました。しかし、データシートでは7Clockと記されています。 3次キャッシュは、更に20Clockほど余計にかかっています。

何故、このようになるのでしょうか。



Pentium(R) 4 プロセッサのマイクロアーキテクチャ より引用。

Pentium 4 プロセッサは動作周波数が高く、パイプラインの段数も深いため、 ロード・スケジューラから実行に至るまでのクロック数はロードを実行するレイテンシそのものよりも長くなります。 そこで μop スケジューラは、ロード実行が完了する前に、そのロードに依存した命令をディスパッチします。
ほとんどの場合、μop スケジューラはロードが L1 データ・キャッシュにヒットするものと仮定します。

しかし、L1 データ・キャッシュにヒットしない場合は、ロードに依存した命令がパイプライン中を流れることになります。 この命令はすでにスケジューラを離れているため、一時的に無効なデータを使用してしまうことになります。

これはデータ・スペキュレーションと呼ばれる投機実行機能の1つですが、 このような場合、無効なデータを利用する命令を追跡し、再実行します。 これを「リプレイ」と呼びますが、リプレイを行うのは無効なロードに依存した命令だけで、 それ以外の命令はそのまま完了されます。
つまるところ、依存するロード命令のロードがキャッシュにヒットしなかった場合、 「分岐予測が外れてパイプラインが乱れる」事と同じような現象が起こるのです。 Pentium4に場合は、L1命令キャッシュが特殊な為、x86命令をμopに変換する手間を省く事が出来ますが、 命令を再実行しなければならない事には変わりなく、かなりの実行時間ロスになります。

18Clockは、「キャッシュミスから命令の再発行をし、それが実行されるまでのクロック」と言う事になるようです。


N-yagi PC ManiaX