メモリアクセス時間の短縮

ここまでは、メモリは1サイクルか2サイクルでアクセスができるという想定でパイプラインを考えてきたが、この想定がある程度成り立っていたのは30年以上も昔のことである。それ以降の30年で、プロセサのクロックは1000倍程度速くなったが、メモリのアクセスタイムは10倍程度しか向上しておらず、結果として、現在のマイクロプロセサがDRAMで構成されたメモリをアクセスするには、100サイクル以上を必要とするようになってきている。

メモリのロード、ストアを行う命令の出現頻度は、典型的なプログラムでは30%程度である。パイプライン処理を頑張って1サイクルに1命令(IPC=1.0)の実行を可能としても、30%の命令でメモリアクセスが必要となると、1命令の実行時間は、

となってしまう。ここでTは平均的に1命令の実行に掛かるサイクル数(Instruction Per Cycle)であり、tmはプロセサのサイクルタイムを単位としたメモリアクセス時間である。

最近のマイクロプロセサでは、サイクルタイムは0.4ns(2.5GHzクロックの場合)程度であり、プロセサコアからのDRAMメモリのアクセスタイムを60nsとすると、tm=150である。そして前述の式にこの値を代入すると、Tは46となる。つまり、実行ユニットは、毎サイクル1命令を実行する能力があるが、メモリアクセスに45倍もの時間がかかり、1秒間に実行できる命令数はクロック周波数の1/46に低下してしまう。

ローカルメモリ

実社会でも、遠くの倉庫まで毎回必要な工具や材料を取りに行くのでは、時間が掛かって仕事の効率は上がらない。近くに小さな置き場を作り、頻繁に使う工具や、次に必要となりそうな材料はまとめて倉庫から持ってきておけば、遠くの倉庫まで行く回数が減り、大部分は近くの置き場まで取りに行けば済む。

これと同じ考え方で、近くに置き場を作り、遠くなってしまった大倉庫であるメインメモリまでアクセスする回数を減らすというのがローカルメモリという考え方である。

メモリアクセスの内のある割合(ここではhとする)が、遠くの倉庫であるメインメモリまで行かずにローカルメモリで済むとすると、前述のTは、

となる。ここでtlはローカルメモリのアクセス時間をプロセサのサイクルタイムを単位として表したものである。仮に、hを0.95、tlを2.0とすると、

となり、平均3.82サイクルで1命令が実行できるようになる。これは、ローカルメモリが無い場合の46と比べると、性能が12倍に向上している。この様子を図4.1に示す。

図4.1 メインメモリ直接アクセスとローカルメモリを使用した場合の平均命令実行サイクル数の比較

少し、話はそれるが、コンピュータのメインメモリが16KB~256KBという時代は、すべてのプログラムやデータをメインメモリに置くことが出来ないので、本体はドラムやディスクといった磁気記憶装置に置き、必要な時にメインメモリに持ってくるオーバレイという手法が使われた。

ローカルメモリは、これと同じ手法をメインメモリとプロセサの間に適用し、メインメモリの内容のうちの頻繁に使用する部分をプロセサに近い小容量だが高速なメモリに持ってきて使うようにしようというものである。

このやり方には、大きく分けて2通りある。1つは、どのデータをローカルメモリに持ってくるかをプログラムが指示する方式で、最近の例では、CELLプロセサの計算エンジンであるSPE(Synergistic Processing Element)のローカルメモリがこの方式である。もう1つの方式は、ハードウェアがどのデータが頻繁に使われるかを判断して、ローカルメモリに自動的にデータを出し入れする方式である。