メモリその5

今回はちょっとだけ脱線させていただき、「なんでWindows Vistaでは32bitで足りないか」を簡単に説明しておく。これは、もっぱらGPUとの密結合を進めてしまった弊害と言える。

最近のマザーボードの場合、4GBのメモリを積んでも3.5GBとか3.2GBしか認識されない、なんて事を良く聞く。これは実は当然なのであって、PCIやPCI Express、あるいはこれと同じAPIを使うもの(HyperTransport Linkなどもその一例だ)を使う限り、4GBを積んで4GBと認識されることはありえない。論より証拠、先日緊急レビューをやったASUSTeKのMaximus Formula Special Editionの場合、32bit環境では3227MBしかメモリが認識されない。勿論これは32bit版を使った場合「だけ」で、64bit版だときちんと4GBとして認識される。今まで問題にならなかったのは、32bit環境で本当に4GBを積める製品が少なかった(サーバー向けのマザーボード位のものだった)から誰もこういう事態に直面しなかった、というだけの話である。

さて、それでは何が起きているか、だ。Memoryが例えば2GBの場合、Physical Addressのレイアウトは図3の様になる。つまり0からまずPhysical Memoryの分、MemoryがMappingされる。それとは別に、I/O Deviceの分がアドレストップ(4GB)から下る方向にやはりMappingされる。ただトータルで4GBにはならないから、これは問題なく共存できる。

図3:Memory 4GB未満の場合のAddress Layout。

ところが4GB Memoryの場合、図4の様なレイアウトになってしまう。要するにI/O Deviceに食われた分、一部のMemoryが利用不能になってしまうわけだ。I/O DeviceとMemoryではI/O Deviceが優先的にMappingされてしまう(でないと、そのDeviceが利用不能になる)から、Memoryが無駄になるわけだ。特にOnboard Deviceの場合、BIOS SetupでDisableにしていても、初期化はなぜか行われてしまい、結果的にMemoryを占有してしまうものが少なくないため、最近のOnboard Deviceテンコ盛りのハイエンドマザーボードではメモリの減り方が非常に著しい。

図4:Memory 4GBの場合のAddress Layout。

ここまでの話はVistaに限らず、PCI系のAPIを使う全てのマシン(敢えてPCとは呼ばない。Embedded系デバイスなども同じだからだ)に共通の話だが、Vistaは更にこれを悪化させる。それはWDDMに絡んだビデオメモリの仮想化だ。ビデオメモリの仮想化そのものの話はこちらなどを見ていただくとして、ちょっと考えねばいけないのはビデオメモリを効果的にマッピングするための方法だ。一番高速なのは、ビデオメモリを全てPCIのMemory Addressにリニアで割り付けてしまう事だ。そうすればCPUからビデオメモリを直接アクセスできるため、Pagingも高速になる。ここでバンク切り替えなどを使うと、どうしてもオーバーヘッドが無視できない事になるだろうからだ。

さて、PCIのMemory Adressにこれを割り付けたら、それは図3とか4のピンク色の部分に出現することになる。最近だとハイエンドビデオカードが768MBだが、次世代は下手すると1GBとかになりかねない。つまりビデオカードを1枚挿しただけで、Main Memoryが1GB食われる計算になる。これでCrossFireなりSLIなりを構成したら2GB、Quad SLIとかQuad CrossFireだと4GB丸々食われてしまう計算だ。どう考えても、これは話にならない。しかもVista自体が1GBではのた打ち回る感じで、まともに使えるのは2GB以上である。要するにVistaでまともに何かやる環境を作ろうとしたら、32bitではPhysical Addressが全然足りないということになりかねない。ところが64bitに移行すれば、図5の様に4GBメモリを扱うのは十分に余裕である。

図5:64bit環境におけるMemory 4GBの場合のAddress Layout。

幸いに現時点でのWindows VistaではDirectX 10なのでWDDM 1.0ベースであり、まだビデオメモリのPaging機能はごく限られているが、DirectX 10.1で提供されるWDDM 2.x(WDDM-Advancedという名前になったらしい。WDDM 1.0はWDDM-Basicになったようだ)ではハードウェアでこれを処理するようになるので、真剣にPagingが利用される可能性は高く、そうなるとBank切り替えなどで占有するメモリアドレスを減らすという対処は(可能ではあるが)余り好まれないだろう。結果として、Physical Memory Addressが不足するという理由で強制的に64bitへの遷移が、それもハイエンドゲーマーから始まりそうな気配である。