キャッシュミスを減らすセクタキャッシュ

プログラムで使用するデータには色々なものがあるが、極端に言うと、メモリから読んで一度使用するとそれで終わりというデータと、繰り返し読み書きを行うデータがある。

通常のキャッシュでは、これらのデータに区別は無く、一度しか使用しないデータの読み込みで、繰り返し使用されるデータがキャッシュから追い出されてしまうというような不都合が発生しうる。CELLプロセッサのSPEのようなローカルメモリでは、プログラムで明示的にどのデータを追い出し、どのデータを格納するかを制御するので、必要なデータが追い出される心配は無いが、必要なデータのロードを明示的に記述する必要があり、プログラミングが面倒という問題がある。

これに対してSPARC64 VIII fxが採った方法は、キャッシュを二分して、一方を繰り返し使用されるデータ、もう一方はあまり再利用されないデータを入れるようにするというものである。具体的には、キャッシュを2つのセクタに分割し、それぞれのセクタに割り当てるキャッシュのWay数の指定を可能にしている。そして、sxar命令で修飾されたロード、ストア命令では、rs3レジスタの拡張指定の最上位のビットでどちらのセクタを使うかを指定することができるようになっている。

10wayキャッシュでのセクタ0/1の配置例

しかし、各セクタが使用するway数は固定的に分割されているわけでは無い。空きwayがある状態では、どちらのセクタへのアクセスでもセクタ指定が無い場合と同様に空きwayが使われる。だが、空きwayが無くなると、セクタ0へのロード命令がキャッシュミスすると、セクタ0の使用way数が指定値以上の場合はセクタ0の使用wayから追い出しを行う。

一方、セクタ0の使用way数が指定値未満の場合は、セクタ1の使用way数は指定値を超えているので、セクタ1の使用しているwayを追い出して空きを作って、要求されたセクタ0のデータを書き込む。

2次キャッシュは10wayであるが、セクタ0と1の使用way数の合計は10である必要はなく、セクタ0に2way、セクタ1に6wayというような指定も可能である。この場合、それぞれのセクタが使用するway数は変動するが、指定されたway数は概ね保障されるという構造になっている。

したがって、例えば、繰り返し使うデータはセクタ1を使うようにして、その他のデータはセクタ0を使うようにすれば、セクタ0を使うデータのアクセスで、キャッシュに残しておきたいセクタ1のデータがキャッシュから追い出されることが無くなり、上手く指定すればキャッシュミスを減らして性能を上げることができる。ただし、このためにはプログラムの中で、使用頻度が高いデータをプログラマが指定するか、コンパイラが自動的に判定し、ロードストア命令に対して適切なセクタを指定する必要がある。

しかし、キャッシュメモリであるので、正しくセクタ指定を行わなくても、一応、プログラムとしては正しく動作するので、性能を向上するには、その状態からチューニングを行えば良い。一方、CELLプロセッサの場合は、ローカルメモリへのロード命令を明示的にプログラムに書かないと動作しない。したがって、SPARC64 VIII fxのセクタキャッシュ方式は、ローカルメモリに比べると使い方は容易であり、効率を無視すれば、普通のプログラムがそのまま動き、チューニングすれば性能が上がるというのは大きなメリットである。

以上のように、ハイレベルの仕様だけを見るとSPARC64 VIII fxプロセッサはIntelのSandy Bridgeと大差ない構造であるが、HPC-ACEは科学技術計算向けの性能向上に関して種々の配慮がなされたアーキテクチャであり、富士通の長いスパコン開発のノウハウを結集したプロセッサであると言える。