PC-A801のVRAMについて熱く語る

VRAM高速書き込みへの道

ビデオカードのVRAMに高速書き込みを行い、しかも、ビデオチップに依存しない方法を見つけるまでの道のりを述べる。キーワードは、AGP FAST WRITE、そして、ライト・コンバイニングである。

AGP接続のビデオカードの場合、VBEでモード設定をしただけでは、PCI相当の書き込み速度(40〜50MB/s)しか得られない。その理由の一つは、AGPが有効になっていないことである。しかし、有効にしただけでは、AGPデバイスが発行するAGPトランザクションが利用可能になるだけで、プロセッサが読み書きする速度はそのままである。AGPのオプション機能に、corelogic側(チップセットなど)からAGPデバイスへの高速書き込みである、FAST WRITE(#1)がある。AGPを有効にする際にFAST WRITEも有効にすれば、PCI相当の書き込み速度から脱出できる。これらを有効にするには、PCIのconfiguration spaceにある、チップセットおよびAGPデバイスのデバイスレジスタを操作する。

しかし、PCI Express接続のビデオカードや、上のようにAGP FAST WRITEを有効にしたビデオカードであっても、まだ書き込み速度は150〜250MB/sと、期待通りにはならない。その理由を知るには、プロセッサがキャッシュメモリや書き込みバッファを扱う方法(メモリ・タイプ)を理解する必要がある。

VRAMは最初は、メモリ・タイプがキャッシュ不可(UC)に設定されている。その場合、プロセッサが書き込み命令を実行するたびに、データがプロセッサから出力され、AGP経由で実際にVRAMに書き込まれる。そのため、FAST WRITEを有効にしてあっても、書き込み命令のデータサイズ以下しか一度に書き込めず、FAST WRITEの速度が生かせない。一方、メモリ・タイプがライト・コンバイニング(WC)なら、書き込みはライト・コンバイニング・バッファ(Athlon 64とPentium 4では64バイト)に保持され、可能ならまとめてVRAMに書き込まれる。

VRAMのメモリ・タイプをライト・コンバイニング(WC)に設定するには、プロセッサのモデル固有レジスタ(MSR)である、メモリ・タイプ範囲レジスタ(MTRR)を操作する。また、対応する各ページ・テーブル・エントリのPCDビットとPWTビットを0にしておく。これでようやく、実測で1GB/s以上の書き込み速度を得ることができた。

これまでの話はVRAMへの書き込みであり、VRAMからの読み出しは高速化されない。しかし、エミュレータでは、ビデオカードの実VRAMから読み出すことはほとんどないため、問題にならない。

#1: FAST WRITEは、今まで試した限りすべての、AGP4X以上のビデオカードで使用できた。ただし、チップセット側で無効になっていることが多いので、BIOS設定で有効にする必要がある。