救いの手はどこに?(投機的マルチスレッドの衝撃、その3)





前回に引き続き、投機的マルチスレッドアーキテクチャの性能について 考えてみることにする。

題材として、次期パーソナルユース向けCPUとして投入が予定されている 投機的スレッド対応Pentium4を考えてみよう。 スレッドの分割はCALL命令で行うとする。 そうすると、分割点の検出ハードウエアは非常に簡単になる。

さて、バリュー予測の中身であるが、正直 ちょっと難しすぎてたるさんの手には負えない。 従って、予測の内容には目をつぶって、バリュー予測のヒット率を固定して 計算してみよう。

計算上の仮定は下記の通りである。

1.投機的スレッドのコードは、例えバリュー予測がはずれても、
  メインスレッドがその部分に到達すれば、必ず実行される。
  (バリュー予測がヒットした場合ば、結果を取り込みさらに先に進む。)
  従って、投機スレッド部分のキャッシュ内容は、
  バリュー予測がはずれた場合でも、決して無駄にはならず、
  後に必ずヒットすると仮定する。

2.投機スレッド部分の検出と結果の結合には、ハードウエアを投入する。
  従って、これを短時間で行うことができ、メインスレッドの実行に
  遅延を生ずることはない。

3.メインスレッドに対して十分な数の投機スレッドを発生させることができる。

4.粒度の細かいマルチスレッド処理1)方式を採用し
  粒度の荒いマルチスレッド処理2)方式は用いない。


計算の元になったテーブルは前回と同じだ。



この図から、投機的マルチスレッドの場合、 従来型アーキテクチャとNetBurstアーキテクチャの差が、 普通のマルチスレッド処理の場合 より少ないことが見て取れる。 投機的マルチスレッド処理の場合は、絶対性能でもNetBurstアーキテクチャが 激しく追い込みをかけているのである。

次に、前回同様それぞれのアーキテクチャにおける1スレッドタイプを基準とした、 比較性能を見てみよう。自分自身の1スレッドタイプを基準とすると、いかなる場合も NetBurstアーキテクチャの方が伸び率が大きい。 つまり、顕在性能ではかろうじて辛勝したたるさん流従来型アーキテクチャも、 潜在能力ではNetBurstアーキテクチャに歯が立たず、 もはやこの場合はNetBurstアーキテクチャの 欠点が見あたらなくなっていることに気づかれるだろう。 しかも、もっとも重視すべき事は、投入した投機スレッド数が増えるに従って、 絶対性能の差が少なくなる事である。



では、実際に投機的マルチスレッド処理の演算能力はどれくらいになるのであろうか? 投機的スレッドのバリュー予測ヒット率を横軸にして、 2スレッド同時実行の場合の性能を求めてみたのが下図である。



粒度の細かいマルチスレッド処理の場合、性能がUPするかどうかは、 ひとえに投機スレッドのヒット率(実質的にはバリュー予測のヒット率) 次第であることがわかる。 また、そのヒット率と性能向上率との関係が、ほぼ比例関係にあることが読みとれる。 1次キャッシュのヒット率等の場合では、ヒット率が100%に近づくにつれ、 急速に性能UPする(逆に言えば、低ヒット率では少々のヒット率UPは 全く意味がない。)場合が多い。

分かりやすく言うと、キャッシュヒット率の場合、ヒット率50%と51%では ほとんど差がないが、99%と100%では雲泥の差が生じると言うことである。 ( 1次キャッシュヒット率と処理能力の図 を見ていただきたい。その関係は決して比例関係ではない。)

ところが、見ての通り、投機的マルチスレッドには救いがあって、 ヒットすればヒットするほど、素直に性能が上がるのである。 これは、バリュー予測機構にとっては福音であろう。 分岐予測やキャッシュと違って、予測機構の性能が未熟でも、 ある基準ヒット率さえ満たせば、それなりの性能向上が得られるからである。

もっとも、問題点もある。キャッシュの場合ヒット率が0%でも、 性能UPしないだけで、ペナルティーは無い。 (厳密に言うとタグラム参照時間分のロスが生じるので、性能は若干低下する。) しかし、粒度の細かいマルチスレッドでは、投機的スレッドのヒット率が メインスレッドのパイプライン充填率以上に達しない場合、 逆に性能が低下してしまう。 メインスレッドに割り込ませた投機的スレッドが破棄ばかりされていれば、 当然レジスタや各ステージの実行効率が低下するわけである。

たとえて言うならば、メインスレッドに対する投機スレッドは、会社経営で言う 委託業務のようなものである。委託業務(投機スレッド)の業務効率が 本業(メインスレッド)の効率より低ければ、例えパイプラインバブルが発生しても そのままシングルで動かした方が効率がよい。 投機スレッドと言えど、パイプラインのリソースを消費するからである。

その点では、粒度の荒いマルチスレッド処理方式の方が有利かもしれない。 こいつは、投機スレッドのヒット率が例え0%でも メインスレッドの処理効率は低下させない。 一般論としては、粒度の細かいマルチスレッド処理の方が IPC向上の効果が大きいと言われている。 このため、今回はこの方式を採用したが、機会があれば粒度の荒いマルチスレッド処理 方式についても検討してみたい。

と言うわけで、この段階でまとめてみよう。

まとめ

1.投機的マルチスレッド処理におけるNetBurstアーキテクチャの 性能向上率を予測した。
  理想状態での性能向上率は下記の通り。


全投入スレッド数
性能向上率 %(1スレッド比) 44.8 70.1 86.5 97.9
※ただし、バリュー予測失敗によるスレッド破棄によって、 実効性能向上率はこれ以下にとどまる。

2.実際の性能向上はバリュー予測のヒット率次第である。
  その際、性能はヒット率に対してリニアに向上する。
  「投機的マルチスレッドの成否=バリュー予測の成否」と言っても過言ではない。

3.NetBurstアーキテクチャは、従来型アーキテクチャと比較すると、 より投機的マルチスレッド処理向けである。

4.次期投機的マルチスレッド対応Pentium4の予測性能
  2スレッド分解タイプと考えた場合、バリュー予測ヒット率80%と仮定して、
  従来型Pentium4の30.3%UPであると予測する。



1)
粒度の細かいマルチスレッド処理
1CPUマルチスレッド処理には2つの実現方法がある。その一つがこれで、 パイプラインのステージに交互に各スレッドを投入してゆく。

この場合、各スレッドから見たパイプライン段数が減ったように見えるため、 パイプラインバブルのオーバーヘッドが見かけ上減り、効率が上がる。 分岐予測に失敗たり、キャッシュミスが発生しても、 破棄するステージが減るためである。

2)
粒度の荒いマルチスレッド処理
メインスレッドにパイプラインバブルが発生した場合、その穴に 投機スレッドを挿入する方式。

投機スレッドがバリュー予測に失敗しても、メインスレッド自体は シングルと変わらない状態で動いているので、 1)と異なり、性能が低下する事はない。 しかし、各スレッドから見たパイプライン段数は変わらないので、 (粒度の細かいマルチスレッドでは1/スレッド数になる。) その意味での効率改善は無い。

1)と2)のどちらが有利かは条件次第であるが、1)の方が有利とする説が多い。 もっとも、両者は決して排他的なアーキテクチャではない。 今後の研究によって、将来的には両者の「良いとこ取り」になるハズである。