ベクトルのノルム計算

double型(8Byte)の配列を使ったノルム計算プログラムにおいて、配列のサイズを変えることで、最内ループ長と性能との関係を調べました。
また、この結果から2次キャッシュサイズを推定することができます。

プログラムrei1.c

実行結果(クリックすると詳細な図を表示)

図1.配列の要素数と速度の関係 図2.キャッシュあふれ部分の拡大図
図1.配列の要素数と速度の関係 図2.キャッシュあふれ部分の拡大図

最内ループが短いと、ループのオーバーヘッドにより性能が低下します。これにより、最内ループ長と性能との関係は、理論的には図1の水色の曲線のようになります。

要素数4から12(32Byte〜96Byte)の間で、なぜか1回目のみ他より速くなりました。この区間では、2回目・3回目でもよく見るとグラフが乱れています。また、要素数が96から4096(768Byte〜32KByte)では3回とも遅くなっています。これらの原因はまだ良く分かりません。他のプロセスの影響などで突然遅くなることはあっても、突然速くなる原因など考えられません。他の部分が何らかの原因で常に性能が出し切れていないのかもしれません。しかし、それにしてはグラフの形がきれいすぎるような気がします。

要素数32K(256KB)近辺で遅くなっているのは、2次キャッシュあふれによるものです。ここで速度が40%以下にまで低下しています。
図2を見ると、要素数28K(=32K×7/8)から下がりはじめ、36K(=32K×9/8)でほぼ一定になっています。これは、2次キャッシュが8-way set associativeであることと関係があるのではないかと思われます。つまり、全てのwayが埋まっているラインができると遅くなり始め、1way分以上オーバーした時点で一定になっています。2次キャッシュのサイズを超える前から遅くなり始めるのは、データの投機的ロードが影響しているのではないかと思われます。


Next ストライドアクセス
性能測定メニューへ戻る

最終更新日:2003/1/23