さらに省電力にまつわる話である。AMDはBobcatで、Physical Register Fileを採用したと発表している。これはAMDのみならず、IntelもSandy BridgeでPhysical Register Fileを採用したことを明らかにしており、奇しくも両社ともに省電力を進める中で、データ移動に伴う電力消費が問題になるレベルになってきたことが判ったとも言える(Photo17)。

Photo17: 細かい話だが、シフトレジスタも値をシフトするのではなく、ポインタを書き換える形で対応、なんてのもデータ移動削減の一環であろう。

この、データの移動に伴う消費電力というのは結構昔から言われてきた話である。例えばMicronは2002年にYukonというメモリプロセッサ(?)を発表している。要するにデータをメモリからCPUに移動し、処理を行ってメモリに書き戻すというコンサバティブな方法だと、データの移動に無駄に電力を消費するので、メモリの中に演算器を仕込んでしまえばデータの移動を大幅に削減できる、というものだ。今回のPhysical Register Fileもこれに同じ仕組みである。

通常のCPU Pipelineの場合、基本的には各ユニットの周囲にそれぞれ個別のバッファが置かれる。Register Fileのみならず、ALUやWriteBack、Data Load/Storeといったユニットは必ず自分専用の処理用バッファを持っているのが普通だ。この結果、メモリからデータを読み込んで処理後に書き戻す、なんて処理の場合は、

  1. キャッシュからデータを読み込む(図2)
  2. 読み込んだデータをレジスタファイルに書き込む(図3)
  3. 処理が行われるタイミングでレジスタファイルの内容がALUのバッファに移動する(図4)
  4. ALUは処理に応じてデータを書き換える(図5)
  5. 書き換えた値をWritebackで書き戻し処理を掛ける(図6)
  6. 一旦レジスタファイルに値が戻される(図7)
  7. レジスタファイルからStore Unitに値が移動し、キャッシュへの書き出しが行われる(図8)

図1

図2

図3

図4

図5

図6

図7

図8

という具合に、煩雑に内部のバッファ間でのデータの移動が発生する。このデータの移動に要する消費電力が馬鹿にならないから、省こうというのがPhysical Register Fileである。Physical Register Fileの場合、各ユニットは個別にバッファを持ったりはせず、物理的に一箇所にRegiter Fileが置かれ、ここを各ユニットがアクセスするという形になる。今回の例だと、

  1. キャッシュからデータを読み込み、Register Fileに書き込む(1)
  2. ALUで命令処理のタイミングでRegister Fileから値を取り込み、処理後に再び書き戻す(2)
  3. Store UnitはRegister Fileから値を取り込み、レジスタに書き出す(3)

という形になり、データの移動は最小限に抑えられる形になる。ではRegReadは何をやるかといえば、(1)で取り込まれたデータと対応する命令の関係付けを行う事になるし、WriteBackはというと、Register Fileに書き戻したデータをStore Unit経由でCacheに出力する指示を行う事になる。

こう書けばいいこと尽くめに見えるが、実際にあまり普及してこなかったのは、

  • Regiter Fileの管理を行うための機構が別途必要になり、どうかすると値をコピーする従来の方法の方が効果的だったりしかねない。
  • 特にALUなどでは演算ユニットと格納場所(Register File)の物理的な距離が大きくなり、アクセスに余分な時間がかかったりしかねない。

という問題があったからだ。このあたりの問題を解決するために、相当レイアウトには気を配ったようだ。先のPhoto13で言えば、CPUコア中央にある山吹色の部分にPhysical Register Fileが配されていると思われる。