前回のデータ・プリフェッチャで性能が向上しない問題。いろいろと解析した。
1つは、プリフェッチ生成時のバンド幅の問題。プリフェッチの生成により複数のプリフェッチ・リクエストが生成される場合、そこで前方のパイプラインが停止してしまってはならない。
なので、学習テーブルからプリフェッチのリクエストが生成されると、一度それをFIFOに入れて、バッファリングする必要がある。
さらに、バッファリングしたリクエストをフィルタにかけて、過去に生成したプリフェッチ・リクエストから同じものを生成しないようにパイプラインの最適化を行う必要がある。
この結果、L2キャッシュへのレイテンシを200とした場合、memcpyプリフェッチテストの結果は以下のようになった。約27%の性能向上だ。 #L2キャッシュといいつつL2キャッシュがDRAMみたいな構成なので、DRAMのレイテンシだと考えて良いと思う。
cycle | memcpy (64kB) | Performance Improvement |
---|---|---|
Prefetch ON | 88,109 | 1.27 |
Prefetch OFF | 112,093 | 1.00 |
ちなみに、L2キャッシュへのレイテンシを10としている場合、以下のようであり、性能の向上はほとんどない。
cycle | memcpy (64kB) | Performance Improvement |
---|---|---|
Prefetch ON | 13,368 | 1.00 |
Prefetch OFF | 13,368 | 1.00 |