高速化: ハードウェアについて


前節まで見てきたソフトウェアからみた計算機のモデルは、現在では仮想的といっ てよく、実際の計算機ハードウェアとは異なる点も多い。プログラム上でレジス タやメモリにアクセスしていても、実際のハードウェアではレジスタを介さずに 演算器間でデータを授受したり、メモリバスまでアクセスせずにキャッシュを利 用したりする。スーパスカラプロセッサでは命令の実行さえも無秩序な順序で (アウトオブオーダに)行われる。

レジスタアクセスを行うのに比べて、メモリアクセスが遅いのはすでに述べた。 高速なプロセッサが次々開発されるのと比較して、メモリアクセスの 遅延 短縮や バンド幅向上はなかなか進まないでいる。このため命令実行部ので きるだけ近くに容量は少なくてもよいので高速にアクセスできるデータの隠し場 所( キャッシュ)を設けて、遠くの容量の多いメモリへのアクセスを省略す る手法がとられる。キャッシュの状態から遠くにあるメモリの状態まですべてトー タルでみて、前節まで見てきたソフトウェアからみた計算機のモデルにおける 物理メモリが実現される。(つまりソフトウェアが単純な物理メモリだと考え ているものも、実際のハードウェアではキャッシュや 本当の物理メモリを 組み合わせてそのイメージを仮想的に作り上げているのである。) ソフトウェア からみた計算機のモデルにはメモリのどの部分がキャッシュされているかどうか といったことは含まれない。しかし、デバイスから見たメモリとソフトウェアか らみたモデル上のメモリの不一致が生ずる場合などに備えてキャッシュをフラッ シュするようにソフトウェアから指示ができる。

キャッシュについても階層化して、命令実行部に近い最高速・小容量の1次キャッ シュ、少し離れて遅くなるが容量が増えた2次キャッシュなどで構成されている ことが多い。キャッシュは:

で特徴付けられる。TLBが通常 フルアソシアティブなのに対し、キャシュ の連想度は多くても8 程度で、 ダイレクトマッピング方式(連想度1)であ ることも珍しくない。

キャッシュミスを少なくしてプログラムの実行を高速化するには、TLBと同様に メモリアクセスの局所性をよくすればよい。キャッシュミスを少なくすることは 高速化に際して非常に高い効果を持つ。TLB ミスの削減に関する議論がある程度 成り立つので、以下では、TLBとの違いを述べたい。TLBでは管理するページが通 常 8KB 程度なのに対し、キャシュのブロックは通常64B程度である。このため空 間的局所性を生かすには同時期にアクセスするデータをしっかり接近させる必要 がある。

また、連想度が少ないことにも注意が必要である。例えば、ダイレクト マッピング方式では、キャッシュの容量を S とすると: Sn+b (n=0,1,....) のアドレスのデータは、 b で定まるブロックにキャッシュさ れる。このため S だけ離れた複数のアドレスに頻繁にアクセスする場合、利用 するキャッシュブロックの衝突が生じ、キャッシュミスが頻発することになる。 このため、Cプログラムでの二次元配列の定義などでは、 S との独立性が高くな るように余裕をとることで高速化されることが多い。


Masahiro Yasugi