パート12 メモリ周りのチューンナップ        2003/01/初

 K7T266 Pro2-RUのAMI BIOS V3.5のメモリ設定には、Bank Interleaveなるものがある。これって何だ?
 そういえばメモリ周りの設定はメモリモジュール(DDR SDRAM PC2100 256MB CL2 バルク品)に合わせて、CLを2に変えたぐらいで、他は触っていない。
 ということでメモリ周りのお勉強も兼ねて、少しいじって(チューンナップして?)みることに。
 ※M/Bのマニュアルには「設定を変えた場合の動作は保証の範囲ではない」と書いてあります。
 ※また動作が不安定になる可能性があるとも書いてあります。
 ※以下に記載する内容は、私の環境での話ですので、設定を変える場合は自己責任でお願いします。

1.Bank Interleave

 AMI BIOSではCL(CAS Latency)の他にもいろいろ設定項目がある。その中でも一番気になったのが冒頭でも述べたようにBank Interleaveである。
 気になったというか、単に何のことか全く分からなかったというのが正解ですが^^;
 ちょっと調べてみたら、強引な説明かもしれないがメモリのRAIDみたいなものだということが分かった。
 設定には、Disable/2-Way/4-Wayの3通りあり、4-Wayが2-Wayより高速な設定になるということも分かった。
 でも、ここでふと疑問が。。。
 メモリを1枚挿しても、2枚挿しても4-Way???、K7T266 Pro2-RUにメモリスロットは3つしかないぞ。。。HDDのRAIDとはどうも仕組みが違うようだ。
 ますます疑問が深まる・・・
 メモリ周りはNorth Bridge(VT8366A)が司っている。
 VIAのChipSetについて、調べたところ、VIAのInterleaveは異なるメモリスロットに並列にアクセスするものではなく、同一メモリモジュール内の異なるBankに連続的にアクセスすることによってメモリアクセスの高速化を実現しているようだ。
 なぜ1つのメモリモジュールで高速化できるのかは、SDRAMの動作の仕組みを知らないと理解できそうになかったので、少し勉強してみた。

2.SDRAMの動作原理

 DRAMのRASとかCASは昔に習ったような気がするが、殆ど覚えていないので、再度勉強して以下に纏めてみました。
 ※以下の説明は、にわかじこみの勉強結果ですので、実際のSDRAMの仕組みとは違うかもしれません。
 ※記載内容について保証できませんので、情報の厳密さを求める場合は他の情報源をあたってください^^;

 簡単にDRAMの動作原理を説明すると、Excelのシートのように行(Row)と列(Column)で場所を特定してからデータを取り出すことで動作しています。
 以下のような手順になります。
 
 (1)行アドレスを指定→(2)列アドレスを指定→(3)データを取り出し→(4)PreCharge→次の行指定→・・・

 (1)の先頭で、メモリの行アドレスを指定する信号 RAS(Row Address Strobe)がメモリコントローラからメモリモジュールに対して出力されます。
 次に(2)の先頭で、メモリの列アドレスを指定する信号 CAS(Column Address Strobe)が出力されます。
 (1)と(2)の間、つまりRAS〜CASには、RAS to CAS Delayと呼ばれる待ち時間が必要になります。
 これは、DRAMはデータを取り出すとメモリセル上から内容が消えてしまうため、行データを別の記憶回路にバッファしておく必要があり、このバッファリングとRASを検知するのに必要な時間と考えられます。
 (2)と(3)の間、つまりCASが出てからデータが取り出し可能になるまでに必要なクロック数をCL(CAS Latency)と言います。
 メモリモジュールのスペックにあるCLも同じ意味で、CL=2というのはCAS Latencyが2clockで動作することを保証しているのだと思います。
 (3)のデータ取り出し後、次のRASを出すまでに、行(Row)をPrechargeする時間が必要であり、これがRow Precharge Timeです。
 Prechargeとは、一旦取り出したRowデータは消えてしまっているので、元の場所に書き戻す動作になります。
 基本的には上記の動作を繰り返すことで、DRAMは動作しています。SDRAMの動作原理も同様です。
 あと、DRAMは放置しておくと放電してしまうため、充電するためのRefreshという動作も定期的に必要になります。

<補足>
 DRAMはRAS,CASという信号で同期を取りますが、100MHz以上で動作させることは困難とされているようです。
 SDRAMは、Synchronous DRAMの名の通り、外部クロックに同期した動作が可能でDRAMと違いタイミングが取りやすいので100MHz以上の高速なアクセスが可能です。
 SDRAMの場合は、RAS, CASという制御信号をActive, Readのようなコマンドに置き換えたようなイメージになります。
 また、DDR SDRAMは従来のSDRAM(DDRに対してSDR SDRAMと呼ぶ)の1クロックを2クロックと見なしてデータ転送するのでデータ転送速度が2倍になります。
 DDR(Double Data Rate)はその名の通り、データ転送のみ2倍になりコマンド等はそのままです。よって2倍で動作するSDRAMではありません。
 よって、原理的にはSDR SDRAMもDDR SDRAMもDRAMと概ね同様と考えてもよいようです。

3.Bank Interleaveの動作原理

 ※以下の説明も2.と同様に、にわかじこみの勉強結果であり、私なりの推測が入りますので、実際とは異なるかもしれません。
 ※これも記載内容について保証できませんので、情報の厳密さを求める場合は他の情報源をあたってください^^;

 メモリにはRowとColumnがありますが、さらにExcelでいうとシートのようなBankというものがあります。
 Bankごとに独立してアクセス可能であれば、単純に2.に書いた(1)〜(4)が並列実行になり、処理速度は2倍になります。
 しかし、後ほど書きますが、実際は2倍にはなりません。
 いろいろ調べてみたところ、行データを取り出す動作は、別バンクであっても同時に実行できません。
 つまりRAS to CAS Delayは、アクセスするバンク数分は必ず必要になるということだと思います。
 しかし、行データ取り出しが完了していれば、CASを連続的に出して列データの取り出しができます。
 また、1つ前のデータ取り出しに続いて、同一行アドレスで列アドレスだけ動かして、連続的にデータを取り出すことが可能です。
 これをBurstアクセスと呼び、Burstできる最大長をBurst Lengthで設定できるようです。
 AMI BIOSの設定値は4QWと8QW(QWはQuad Word)で、1クロックあたりにワード4個あるいは8個分を転送できる意味のようです。
 最大4*8*16=512bit/clock、確かメモリバス幅は64bitだよな・・・えらく大きい値だなー
 どういう仕組みなのか・・・調べてみたけどよく分からない^^;

 Bank=4、RAS to CAS Delay=3、CL=2、Burst長=4、Row Precharge=3という設定で考えてみると以下のような動作になるのではないかと思います。
 ※BIOS設定のBurst Lengthは単位がQWなので、ここでいうBurst長と違うような気がします。
 Read時とWrite時では動作が異なる(Write時はCLが小さくなる)ようですが、ここではRead時を想定してみました。
 下の記号の意味は、R:RAS、C:CAS、D:データの取り出し です。R=Active、C=Readと読み替えれば、SDRAMになります。Prechargeのタイミングについては後述します。

<Bank Interleave無し>
      <-----------------36--------------->
      0        1         2         3
CLK   1234567890123456789012345678901234567890
Bank0 R  C DDDD                           R
Bank1          R  C DDDD
Bank2                   R  C DDDD
Bank3                            R  C DDDD

<4-Way Interleave>
      <--------------30------------>
      0        1         2         3
CLK   1234567890123456789012345678901234567
Bank0 R           C DDDD            R
Bank1    R            C DDDD
Bank2       R             C DDDD
Bank3          R              C DDDD

<2-Way Interleave>
      <---------------32------------->
      0        1         2         3
CLK   123456789012345678901234567890123456789
Bank0 R     C DDDD                    R
Bank1    R      C DDDD
Bank2                 R     C DDDD
Bank3                    R      C DDDD

 上の図でPrechargeのタイミングを記載していませんが、Burstアクセス中(Burstが終わるまで)に完了すれば良いようですので、Row Precharge=3で考えると、DDDDの2つ目のDのタイミングで行えばよいのではないかと思います。

 Bank Interleave無しの場合、各Bankを順にアクセスして再びBank0にRASを出すまでの時間はCLK=36になります。
 一方、4-Way Interleaveの場合、まずRASを全Bankに出してから連続的にCASを出すと、再びBank0にRASを出すまでに掛かる時間はCLK=30になります。
 これは約15%、4-Way Interleaveの方が速いことになります。
 あと、2-Way Interleaveの場合も考えてみると、再びBank0にRASを出すまでに掛かる時間はCLK=32で、Interleave無しの場合より約10%速いことになります。
 一応、4-Way>2-Way>Disableの順で高速にはなっているが、ん〜〜、これで合ってるのかな〜。誰か詳しい人がいたら正解を教えてほしい^^;
 ※実際はDDRだし、Read/Writeが輻輳する上に、もっと複雑に各Bankにアクセスと思われるため、実際のパフォーマンスは異なる結果になると思います。

 ※2-Wayや4-Wayで動作させるためにはメモリモジュール側に制約があって、VIAのホームページによると少なくともメモリ容量が関係しているみたいです。
 ※私の調べた限りでは、4-Way Interleaveで動作させるには、64MB以上のモジュールであればよいようです。
 ※今使っているモジュールは256MBなので大丈夫そうです。

 <余談>
 なぜ、こんな複雑な動作を必要とするSDRAMを使っているのでしょうか? SRAMではRefresh動作は不要で高速なアクセスが可能です。
 その理由は、SDRAMの方が1つのセルを構成する部品(トランジスタ)の数が少なく(1/4以下)、集積度を稼ぎにくいSRAMよりコストが安いからです。
 確かにメインメモリのモジュールの大きさが今の何倍も大きくなって、何倍も値段が上がったら困る^^;
 ちなみに性能を重視するCPUのキャッシュメモリはSRAMを使っているそうです。
 ふと思ったのですが、サーバー専用マシンは性能重視なんだからメモリにSRAM使えばいいのに、と思うのは私だけでしょうか・・・
 

 BIOS設定には他に
  RAS Pulse Width
   SDRAM 1T Command
  Fast Command
 があります。
 RAS Pulse Widthは、RASの信号長です(そのままですが^^;)。でも、CASの信号長の設定が無いのはなんでだろ???
 SDRAM 1T CommandとFast Commandは、調べましたが、よく分かりませんでした^^;
 

4.メモリベンチマーク

 K7T266 Pro2-RUのAMI BIOS V3.5のメモリ周りの設定項目は以下の通りです。

  CAS Latency 2/2.5
  Row Precharge 2T/3T
  RAS Pulse Width 5T/6T
  RAS to CAS Delay 2T/3T
  Bank Interleave Disable/2-Way/4-Way
  Burst Length 4QW/8QW
  SDRAM 1T Command Enable/Disable
  Fast Command Enable/Disable

 全項目の組み合わせは大変な数になるので、気になっているBank Interleaveに着眼して測定しました。
 尚、各ベンチマークを行う前に、Memtest86 V2.8でメモリの動作チェックをしておきました。
 ※新しいメモリモジュールを導入する時のチェックに使っています。初期不良があれば、これで分かると思います。
 Memtest86でエラーは出なかったので、いよいよベンチマークしてみることに。
 ベンチマークはいつものようにHDBench V3.40です。

 
BIOS設定項目 BIOS設定値 MemoryR MemoryW  MemoryRW
ベンチマーク(基準)
 メモリモジュールはCL=2なので2.5→2に変更
 その他はすべてデフォルト設定
CAS Latency 
Row Precharge 
RAS Pulse Width 
RAS to CAS Delay 
Bank Interleave 
Burst Length 
SDRAM 1T Command 
Fast Command 
2
3T
6T
3T
Disable
4QW
Disable
Disable
22981
22374
28865
ベンチマーク1
 ベンチマーク(基準)から
 Bank Interleaveだけ2-Wayに設定
CAS Latency 
Row Precharge 
RAS Pulse Width 
RAS to CAS Delay 
Bank Interleave 
Burst Length
SDRAM 1T Command 
Fast Command
2
3T
6T
3T
2-Way
4QW
Disable
Disable
23083
23432
29060
ベンチマーク2
 ベンチマーク(基準)から
 Bank Interleaveだけ4-Wayに設定
CAS Latency 
Row Precharge 
RAS Pulse Width 
RAS to CAS Delay 
Bank Interleave 
Burst Length
SDRAM 1T Command 
Fast Command 
2
3T
6T
3T
4-Way
4QW
Disable
Disable
23183
24200
29286
ベンチマーク3(※)
 パフォーマンスが最も向上すると思われる設定
CAS Latency
Row Precharge 
RAS Pulse Width 
RAS to CAS Delay 
Bank Interleave
Burst Length 
SDRAM 1T Command 
Fast Command 
2
2T
5T
2T
4-Way
8QW
Enable
Enable
25489
30400
41356
表中の太字はデフォルト設定から変更した個所です。
 Bank Interleaveの違いに着眼して、ベンチマーク(基準)とベンチマーク2を比較してみると、確かにBank Interleaveが4-Wayのベンチマーク2の方がよい成績ですが、その差はごく僅かで、「約1%」です。
 『ほとんど効果なし』です。なんだこれ〜。
 上記の3.でいろいろと調べてみた結果と随分違う。。。もっと違いがあると思ったのですが ^^;;;
 ついでに最速と思われる設定(ベンチマーク3)も測定してみましたが、最大40%アップすることが分かりました。(MemoryRW時)
 どの設定が効いているのかよく分かりません。その他の設定については、暇があれば調べてみることにします。
 

5.まとめ

 Bank Interleaveの設定変更だけではほとんど性能アップしないことが分かりました。色々と調べたり考えたりした割には無駄だったようで・・・あ〜〜疲れた^^;;
 また、他の設定を変えると最大で40%も性能アップすることが分かりました。あくまでメモリのベンチマークでですが。
 試しに、TMPGEncを使ってソフトエンコード時間を測ってみましたが、数%しか速くなりませんでした。
 でも、折角なので、しばらく最速設定で様子を見ますが、そのうちCL=2だけを残して元に戻すと思います。
 デフォルト設定でも結構いい性能が出ているし、最速設定でも動作するということは、きっと、K7T266 Pro2-RUというかVIA Apollo KT266Aの出来がいいのでしょう。
 ※私の環境ではたまたまメモリ周りを最速設定にしても動作しましたが、CLやPrecharge Timeを小さくすることは、CPUのOverClockと同様で、速くなる反面、動作が不安定になる危険性を持っています。もし設定を変える場合は自己責任でお願いします。

 しかし、メモリって複雑な動作をしていて、むずかしいですね〜^^; また機会があれば情報追加や間違い修正等していこうと思います。
 次回は、パート11の続きをやってみたいと思います。静音を保ちつつの冷却。どこまでできるか・・・