CPU負荷とキャッシュの微妙な関係




最近パソコン雑誌を見たり、自作系webサイトを見るに付けて、 ベンチマークがマシンの実体を反映していないという記事をよく見る。 たしかに、CPUを買い換えてベンチの点数を計測すると、数値は速くなっている。 が、ベンチの点数の割に体感速度が変わっていないことを感じて愕然としてしまう。 こんな日には心も財布も北風ピューピューだろう。

よく言われる原因は、ベンチマークがキャッシュに収まってしまう場合が多いので システムトータルの性能指標になっておらず、 いわば瞬間最大風速を測定しているという指摘だろう。 この指摘はたるさんも正しいと思っており、マシンのベンチマークを測定する時は、 どのベンチマークが実際の使用感を表しているのだろうと悩んでしまうことが多い。

また、ベンチマーク開発者もそのことには気が付いていて、最近のベンチマークは ゲームのデモかと見まがうばかりの巨大ソフトとなっている場合が多々ある。 これは評価基準としては正しい方向だが、これらのソフトはたるさんの旧態依然とした パソコンシステムでは動作してくれないことが多い。

さて...では、単純なベンチマークで高負荷時の速度を表す方法は ないものであろうか?

そこで、実際の使用条件に近い環境でベンチを動かすことを考えてみよう。 つまり、CPU負荷をかけた状態でのベンチマークである。

さて、ここで問題になるのはCPUに負荷をかけるためのジョブである。 まずは、たるさんの失敗例から検討してみよう。

最初にやったことは、CPU負荷をかけた状態でベンチをとるために メディアプレイヤーでMPEG1を再生しつつ、標準的なHDBENCHを使って ベンチを取った事だ。その結果分かった問題点は、ベンチの実行中は MPEG1の再生がほぼストップしてしまうことだ。

MPEG1の再生にはCPUパワーが全然不足しており、紙芝居になってしまう。 ベンチの計測方法の問題なのか、または、ベンチの負荷が高すぎて CPUパワーに対するMPEG再生の余力がないためなのかは分からないが、 ベンチの動作によって、本来かかって欲しいCPU負荷が効力を失ってしまっている。 これでは今回の計測目的に関してはベンチを測定する意味がない。

CPUに負荷をかけてベンチを取るという目的から言えば、今回の測定には、 たとえ見かけ上でもベンチとメディアプレイヤーの再生とで、 再生がフォアグランドジョブ、ベンチがバックグランドジョブとして 機能する必要がある。

と言うわけで、webを探し回った結果たどり着いたのがこのCPU Information というベンチだ。こいつはメディアプレイヤーの動作を紙芝居にすることなく 画像優先でMPEG1を正しく再生した上で、ベンチ結果を出してくれる。 今回の目的のためにはきわめて優れものだ。これを使ってメディアプレイヤーの他に 下記に書いたアプリを動作させながらベンチを動かして計測してみた。

動作環境
通常のCPU:PentiumII−266MHz
交換後のCPU:Celeron−266MHz

これはCPUを交換することで2次キャッシュの効果のみを分離して評価するためだ。 本当はBIOSで2次キャッシュをOFFにしたかったのだけれど、 今回使っているDELLジャンクの再生マシンはBIOSが旧フェニックス製で 2次キャッシュON-OFFの設定項目がないのだ。 (前回使ったCleron300Aマシンは友人宅へ嫁入りなさったので...)と言うわけで、 2次キャッシュのあるなしは同クロックのPen2とCeleronで比較することとなった。

メモリ:メモリ256MB−SD−RAM(PC-66動作CL=3)

OS:Windows2000

ダウンロードソフト:News-DecoderはNEWSグループのコンテンツをDLする フリーソフトである。このソフトはDLだけでなく、分割ファイルの合成をやるので IEでのDLより格段に負荷が高いと思われる。なお、負荷を重くする意味で、 テスト時のNEWSの内容は画像ファイルの多いNEWSグループとし、併せて、 分割ファイルの結合処理も行った。

また、通信には外付け56kモデムとUSB接続56kモデムを使用し、 実効通信レートはそれぞれ44kbps、45.2kbpsであった。

使用したMP3ファイル:ネットで落としたお試し版の沖縄民謡で容量は3.6MB
使用したMPEG1ファイル:ホンダの2脚歩行ロボットASIMOの歩行画像。 容量は1.39MBでフルサイズ再生
再生はそれぞれWindows2000標準添付のメディアプレイヤーで行った。

ベンチの設定
コプロ能力測定における複数命令同時実行機能:OFF
このベンチはコプロ能力も計測するのだが、今回は割愛し、整数演算で評価した。 計測時に転送したベンチマークの単位データ量は8192KBで、 常に一定値である。
コプロ能力測定における演算精度:倍精度
データアライメント:8バイト単位

MPEG1再生 無し 再生 無し 無し 無し 無し 無し
MP3再生 無し 無し 再生 無し 再生 無し 再生
ダウンロード 無し 無し 無し 実行
(外付け)
実行
(外付け)
実行
(USB)
実行
(USB)
Celeron-266MHz 524.29 467.19 425.1 471.86 361.58 314.57 207.41
PentiumII-266MHz 524.29 499.32 491.52 491.52 447.26 349.57 273.54
2次キャッシュの有無による速度差 0% 6.9% 15.6% 4.2% 23.7% 11.1% 31.9%
負荷によるベンチ結果の低下率
Celeron-266MHz
負荷無し 89.1% 81.1% 90.0% 69.0% 60.0% 39.6%
負荷によるベンチ結果の低下率
PentiumII-266MHz
負荷無し 95.2% 93.7% 93.7% 85.3% 66.7% 52.2%
                        *ベンチの単位はMIps/Sec

この結果を考える上でまず明らかにしておきたいのは、ベンチマークの測定結果に 対する負荷の影響である。ベンチ自身を複数立ち上げて同時実行してみよう。 するとベンチの結果がどんどん悪くなり、かつ、ベンチを実行した順でベンチ結果が 悪くなる事がご確認できるだろう。もし、ベンチの使用している計測用タイマーが ベンチのみの負荷を計測しているならば、複数のベンチを立ち上げてもベンチの結果は 変わらないはずだ。したがって、今回のこのテストは 同時実行したアプリの負荷を含んだベンチ結果であると考えられる。

また、負荷なしでの速度が一致することからこのベンチのコア部分は1次キャッシュに 収まるサイズである事が分かる。これはベンチ自身に対する2次キャッシュの効果が 無いことを示しており、純粋に負荷アプリの効果を計測する意味では好都合である。

ダウンロードに関してはモデムの種類によって負荷が異なる結果がでた。 外付けモデムはRS-232C経由でデータを送るため、原理的にモデム内ですべての アナログ処理が終了しているはずだ。事実、タスクマネージャで CPU負荷率を見てみると、外付けモデムでは約2%しかCPU負荷が発生しない。

しかし、USBモデムはどうやらソフトモデムのようだ。 USBモデムは2〜3秒周期で周期的に50%以上(PentiumII-266時)の高負荷が発生する。 この事から考えて、USBケーブル内にはA-D変換しただけの例のピーギャァーという音が 飛び交っていると思われる。

さて、最初にPentiumIIを使った場合における負荷の違いによる ベンチ結果の違いを見てみよう。まず、通常の負荷での効率低下は 5〜6%であると言うことだ。MP3を聞きながらダウンロードってのは もう少し効率が悪く、速度低下は15%程度だ。

次に同じ比較をCeleronで行ってみる。負荷によって得意不得意の差が 若干見られるものの、PentiumIIに比して概して速度低下が大きいことが分かるだろう。 両者のベンチ結果はともにスレッド切り替えによるロス等を含んでいるので、 この比較ではスレッド切り替えのロスは考えなくて良いだろう。 従って、この差をもたらした原因の多くは2次キャッシュの有無によるものと思われる。 つまり、この差が2次キャッシュの効力分となる。

キャッシュは確かに負荷が重くなると効きが悪くなるようだ。 (命令・データの局所性を利用するという動作原理を考えれば当たり前の話だけど。)

ここで、単純な負荷による低下率を掛け合わせて求めた計算上の複合負荷予測数値と、 実験上でのベンチ結果を比較してみよう。

例:たとえばCeleronでMP3再生+USBモデムDL時では...

計算上の予測ベンチ結果 524.29×0.811×0.600=255.12

実験実測値 207.41

どちらのCPUでもそうなのだが、複数のアプリを並列実行した複合負荷の場合は、 単純な負荷から計算で求めた予測数値よりも実験実測値の方が数値が低い。

この負荷の差は、複合負荷によるスレッド切り替えのロスタイム+キャッシュの ヒット率率低下分によるモノと考えて良いだろう。 タイムスライス(スレッド切り替えまでの単位時間)は20msの標準値で実験したので、 他の要因は相対的に少ないと考えられるからだ。

それにしても、驚くべきは高負荷時の2次キャッシュの効力である。
俗に負荷が大きいほどキャッシュは効かないと言われているが、 MP3再生+USBモデムによるダウンロードという超高負荷条件でも、 PentiumII-266はCeleron-266よりずっと速い。

しかも、注目すべきは 負荷が重くなればなるほど2次キャッシュの有無による差が開く という事実だ。 (タイムスライスによるロスはどちらのCPUでも同様に発生するので、 これによる差とは考えにくい。)

キャッシュのヒット率は負荷が重くなるほど低下するはずなので、 負荷が重くなるほどPentiumII-266とCeleron-266の差は縮まるのではないか? というのがたるさんの事前の予想だった。しかし、 事実はまったく逆であった。

これはどのように考えたらいいのであろうか?

たるさんの見解は下記の通りである。つまり、確かに負荷がかかると 2次キャッシュの効力は低下する。しかし...2次キャッシュ無しでは、 それ以上に激しく1次キャッシュのパフォーマンス(主にヒット率)が低下するのだろう。 キャッシュとしての絶対効力は2次より1次が高く、また、 1次キャッシュの方がよりヒット率の高い命令・データが入っているからだ。

通常は、1次キャッシュのフォローしきれなかった、いわば おこぼれデータをキャッシュしていたのが2次キャッシュである。 しかし、高負荷によって1次キャッシュの取りこぼしが増え (1次キャッシュのヒット率低下)、その結果、2次キャッシュの活躍の場は 増やされる事になる。これにより、負荷増大による2次キャッシュの ヒット率低下より、活躍の場が増やされたことによるヒット率の上昇が上回り (2次キャッシュのヒット率上昇)、これによって回復されるパフォーマンスに 違いがでたというわけである。

これは簡単な数式でも説明できる。キャッシュには容量が2倍になると ミスヒットが30%減るという経験則がある。これをもとに簡単な計算をしてみよう。

まず、低負荷での1次キャッシュのヒット率を 90%と仮定 しよう。(別に何%でもかまいませんが。)すると、Celeronの2次キャッシュは 1次の4倍の容量だから、1次+2次のヒット率は95.1%と計算できる。 つまり、純粋な2次キャッシュのヒット率は 5.1% だ。(1次にヒットしている間は、わざわざ低速な2次キャッシュをアクセスする 必要はないので...)

これが、高負荷により1次キャッシュのヒット率が 80%に低下した と仮定しよう。すると、同様に1次+2次のヒット率は89.8%と低下するが、 純粋な2次キャッシュのヒット率は逆に9.8%と増える。

不思議なようだが、計算上でも負荷が増えると純粋な2次キャッシュの ヒット率は増えるのだ。 つまり、高負荷状態の方が2次キャッシュの効きは良い。 (1次キャッシュのヒット率を変えて計算しても、この傾向に変わりはない。)

と言うわけで...結論である。

2次キャッシュは効果があるのかといった疑問に対しては、 見た目あまり効いていないようでも、負荷が大きくなってマシンパワーが 欲しくなるような局面では、実は結構がんばっていると言えるだろう。

負荷が増えるほどキャッシュの効きは悪くなるが、低下の程度は1次キャッシュの方が 大きい。従って、2次キャッシュが無ければ、よりひどい状況になるからだ。

ちなみに、アスロンMPだとプリフェッチ回路があるのでこれにより高負荷時の 効率がどこまで改善されるかは見物である。キャッシュの場合、併走するソフトが 多いほど効率が低下するのは原理上当然である。が、プリフェッチは予測効率が 高ければ、併走するアプリの数に性能が左右されにくくなるからである。

貧乏人のたるさんは、アスロンMPなどという高級品を持っていないので何とも 言えないが、通常のキャッシュより高負荷時の性能は高くなるという事を 予言しておきたい。(ベンチ以上に実用条件で効くという事を意味する。)





謝辞
今回のデータを取るにあたってHDBENCHの作者 EP82改/かず氏、およびCPU Informationの作者 Yone氏に感謝いたします。