しかし、キャッシュのアクセス時間という点では、図1.24の構造はタグとデータアレイを並列にアクセスするので、ほぼデータアレイのアクセス時間でデータが得られるのに対して、図1.25の構造ではタグアレイの読み出しとタグマッチ、それからデータアレイの読み出しが順次実行されるので2段の動作となり、おおよそ2倍のアクセス時間が掛かることになる。また、タグマッチの結果を記憶するFFやIndexを記憶するパイプラインレジスタなどが必要となり、回路的にも多少、複雑になる。

このため、高速を要求される1次キャッシュでは前者のタグ、データの並列アクセスをする構造を使用し、大容量である程度アクセス時間の増加が許容できる2次キャッシュや3次キャッシュでは後者の省電力構成を用いるという使い分けを行うのが一般的である。これは、1次キャッシュは2次、3次キャッシュと比較するとWay数が少なく、また、容量も小さいので、全部のデータアレイを読んでも、消費電力はたかが知れている。これに対して、Way数が多く、容量も大きい2次、3次キャッシュでは、ムダなWayの読み込みを省くことによる消費電力削減効果が大きいからである。

というのが、一般的なアプローチであったが、2010年8月のHot Chips 22で発表されたAMDのハイエンドプロセサ向けのBulldozerコアの1次データキャッシュではWay予測という技術を使って、タグもデータも予測した1つのWayだけをアクセスすることにより電力を減らすという。予測を行うと、当然、予測外れがあり、その場合のキャッシュアクセス電力はムダになる。そして、予測外れの回復機構が必要になり、回復のためにも電力が必要になるが、これらのロスを考慮してもWay予測した方が電力が得になるというのは驚きの発表であった。

また、同じ2010年のHot Chipsで発表されたAMDのモバイルPC向けプロセサのBobcatコアでは、Out-of-Order処理のためのリネームを行うレジスタとアーキテクチャレジスタを一体化した構造を取っている。

一般的には各命令の実行結果を入れるレジスタは、リネームされてリオーダバッファに割り当てられ、命令が完了してコミットするタイミングでリオーダバッファから読み出されてアーキテクチャレジスタにコピーするというマイクロアーキテクチャのプロセサが多いのであるが、この構造では、命令のコミット時に64ビットのレジスタの読み書きが必要であり、かなりの電力を消費する。

図1.26 リオーダバッファを用いるOut-of-Order実行機構

これをBobcatでは、図1.27のように1つの大きな物理レジスタファイルにまとめていると考えられる。アーキテクチャレジスタR1が物理レジスタP10に対応している状態で、結果をR1に格納する命令がデコードされると、例えば、R1を空き物理レジスタP38にリネームし、レジスタリネーム表のR1の対応をP38に書き換える。これで次の命令以降でR1を入力オペランドとして使う命令ではP38が読まれることになる。

そして、このP38に結果を書き込む命令がコミットすると、その命令以前にR1に対応していたP10は不要になるので、これをフリーリストに戻して再利用可能とする。一方、P38に結果を書き込む命令が、例外が発生したなどのためにコミットできない場合は、最後にリネームした命令から以前の物理レジスタ対応を逆順で復元していけば、以前の状態に戻ることができる。ただし、この方法では、1命令ずつ元に戻す必要があり、時間が掛かるので、適当な間隔でレジスタリネーム表などのコピーを作っておき、それを復元することで、ジャンプして戻るなどの機構を加えて復元を高速化することが多い。

図1.27 単一物理レジスタファイルを使うOut-of-Order実行機構

図1.27の構造は筆者の推測で、Bobcatの構造と一致しているかどうかは不明であるが、要するに、このタイプのマイクロアーキテクチャを使うと、命令がコミットした時点での64ビットのレジスタの読み書きは不要で、比較的ビット数の少ないリネーム状態の書き換えだけで済むので、消費電力が少なくなるという。

また、フリーリストはFIFO(First In First Out)で、通常はシフトレジスタで作るが、シフトを行うと全ビットが読み書きされ消費電力が大きい。これに対して、Bobcatでは、FIFOなどの構造を作る場合は、シフトレジスタは極力使わず、レジスタファイルと先頭、末尾のポインタを使い、データの移動を極力避ける構造として消費電力を減らしているという。

このように、マイクロアーキテクチャまで踏み込んで、回路の動作を減らす構造とするというのが省電力化の新しい動きである。