このページの本文へ

ロードマップでわかる!当世プロセッサー事情 第68回

CPU高速化の常套手段 パイプライン処理の基本 【その2】

2010年09月13日 12時00分更新

文● 大原雄介(http://www.yusuke-ohara.com/)

  • この記事をはてなブックマークに追加
  • 本文印刷

 問題は「どの程度待たされるか」である。一例として、手元にあったCore i5-750(2.66GHz)を使って、総合ベンチマークソフト「Sandra 2010」のMemory Latencyテストを実行してみた。

シーケンシャルアクセスの場合

Core i5-750のMemory Latencyテスト、シーケンシャルアクセスの場合(赤線がテスト機)

ランダムアクセスの場合

同じくランダムアクセスの場合

 左がシーケンシャルアクセスの場合で、1次キャッシュにヒットする範囲では3~4サイクル、2次キャッシュだと10~20サイクル程度で済むが、メモリーアクセスになると50サイクル以上必要になる。右はランダムアクセスのケースで、こちらではさらに酷くなっているのがわかる。特にメモリーアクセスでは、200サイクル以上要している。

 つまり、何も工夫しないでメモリーアクセスが発生してしまうと、図2のようにただ漠然とパイプラインを止めて数百サイクル待機する、というばかげた状況に陥ることがわかる。このケースでは、15命令の処理に124サイクル必要とするわけで、図1の理想的な動作の、20%の性能しか出せないことになる。


メモリーとCPUの速度差を埋めるキャッシュの活用

 これを避けるためにはどうするか? まず最初のアイディアが「キャッシュの利用」である。80286あたりの世代までは、CPUとメモリーの速度にそれほど大きな乖離がなかった。ところが80386世代の後半から、次第にCPUの速度がメモリーの速度を大幅に上回るようになる。そのためメモリーアクセスだけで済ませると、メモリー速度の遅さに足を引っ張られるようになってきた。

 そこで、CPU側あるいはチップセット側にキャッシュメモリーを用意することで、スピードの差を埋めるという方策がとられるようになった。ただしキャッシュも万能ではなく、またダイサイズを低く抑えるという観点からも、そうそう大量のキャッシュは搭載しにくい。これを補うため、キャッシュに階層構造を設けたり、キャッシュ管理を工夫したり、キャッシュの構成自体を工夫したりとさまざまなテクニックが利用されるようになった。

 また、キャッシュをいくら積んでも、そこに必要とされるデータが入っていないと意味がない。これを解決するために、「プリフェッチ」(データの先読み)と呼ばれる技法が広く使われている。より積極的にプリフェッチを実現するために、「ヘルパースレッド」「Victim Thread」などと呼ばれるマルチスレッド技法もある。もっともこちらは引き続き研究が続けられているようだが、これを最初に搭載する予定だったのが幻のインテルCPU「Tejas」とみられているだけに、その後もこれを積極的に利用した例は現れていない。

 もっと積極的に、「そもそもデータをキャッシュなりレジスターに取り込むまで、パイプラインに命令を取り込まない」という、逆転の発想を実装したプロセッサーも存在しており(x86ではないが)、これは「ストールフリーパイプライン」などと呼ばれている。また別のアイディアには、「メモリーアクセスが発生してもパイプラインを止めない」という仕組みがある。これは「アウトオブオーダー」として実装されることになったが、これは別の回で説明することにしたい。

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン