Independent DRAM Controller(Photo17)
PhenomでのDRAM Controllerの変更点は、
- 2chのメモリを連動して動かすGanged Modeに加え、独立して動作するUnganged Modeをサポートした。
- DDR2-1066をサポートした。ただし実際にDDR2-1066がどの程度の速度で動作するかは、コアの動作周波数に依存する。
- DDR2-800以下に関しては、コアの動作周波数と独立してメモリ速度が決められるようになった
というあたりが、ユーザーから見ての違いとなるだろう。このうち、後の2つに関してはもっぱらオーバークロックに役立つ機能(勿論3つ目に関しては、どんな動作周波数の製品でもメモリのスループットをフルに生かせる様になったというわけで、必ずしもオーバークロックとは関係ないとも言えるが、とりあえずおかせて欲しい)ということで検証は割愛して、このGanged/Ungangedについてもう少し調べてみた。
そもそも2chのMemory Controllerが独立に動作する、という話は最初はGriffin(最近Turion Ultraという名前が決定したらしい)プロセッサで出てきたものだが、GriffinのみならずOpteronやPhenomでも採用されることになった。要するに2chのメモリバスを、連動する形で128bitのメモリが1バンクとして扱うか、64bitづつのメモリが2バンクとして扱うかという違いになる。従来だとCPUのFSBや内部のデータバスが64bit幅だったから、メモリのみを128bit幅にしても本質的にはあまり意味がないという話は当然にあり、実際FSB方式を未だに使っているIntel系の場合、DIMMを2chに1枚づつ挿すのではなく、1chに2枚挿してもそれほど性能が落ちないというのは良く知られた話である。で、どうせ落ちないなら64bit幅の2バンクとすれば、同時にRead/Writeが行えるから性能が上がる可能性がある、という話であり、実際AMDはこれを示唆するかのような資料を出している(Photo18)。
ただ、ちょっと考えるとこれがうまく行くためにはOS側の配慮が必要という事が判る。例えば図5の様なケースを考えよう。2つのCPUコア上でそれぞれプログラムAとBが動作しており、それぞれRegion A/Bという領域をメモリ中で使っているとする。メモリはやはり2本のチャネルにそれぞれDIMMが1枚づつ装着されているという構図だ。同期モードの場合、この2チャネルは一緒に動作するから、プログラム(というか、CPU)からはメモリのどっちにデータがあるとか考える必要は無い。アクセスは128bit単位で行われる事になる。さて、これが非同期モードを使った場合どうなるか?
図5 |
一番理想的なのは、図6の様に綺麗に分離されることだ。こうなると、プログラムAとBはそれぞれ1つのチャネルを完全に独占できるから、他のプログラムのメモリアクセスに影響されずにI/Oが可能になる。
図6 |
逆に、図7の様になるのが最悪である。こうなると、2chのメモリの両方でアクセスの干渉が発生する事になる。問題は、こうしたメモリの割り当てはプログラムではなくOSが管理していることだ。つまりCPUがこうした非同期モードを用意しても、必ずしも最適な管理が行われるとは限らないことだ。悪いことに、現在のOSはこうしたチャネルのパーティショニングに原則として対応していない。
図7 |
なので、図6の様になるのか、あるいは図7の様になるのかはOS自身も判らない状況である。これを真面目にやるためには、Virtual AddressとPhysical Addressの変換の際に、同一プロセスに属するPhysical Addressはなるべく同一Memory Channelに当てる様なインプリメントが必要になるだろうが、そうした機能は少なくともWindowsにはないし、TLBにもそうした情報は今のところ含まれて居ないようだ。強いて言うならば、OSをUMA(Unified Memory Access)モードでなくNUMA(Non-Unified Memory Access)モードにすればあるいは可能かもしれないが(一応Windowsの中にはNUMAに対応したバージョンも存在する)、少なくともデスクトップ向けには非現実的だろう。
もっとも図6のケースでは、同期モードの場合でもやはり干渉が発生するから、非同期化することで高速化できる可能性も若干存在する。このあたりはやってみないと判らない、という部分だ。
もう一つのネックは、これで遅くなる可能性が非常に大きくなることだ。既に見てきたとおり、Phenomではキャッシュからの読み込みが32Bytes/cycle、つまり128bitの帯域でアクセスが行われる事だ。なので、メモリが2chあわせて128bitという同期モードの動作は、内部構成的にはリーズナブルなものである。非同期モードにするとMemoryの帯域が64bitになってしまうから、どこかで128bit⇔64bitの変換が入る事になる。このあたりは純粋に読み込み性能の悪化という形で示されることになりそうだ。