さて、こうなってくるとグラフ69は何だったのか? としいう疑問が出てくるわけだが、大きな違いはSingle-Threadか、Multi-Threadかである。SandraはMulti-Thread、PCMarkやRMMAはSingle-Threadでテストを行っており、これが最大の違いではないかと思う。実際、図4で、Program Aしかないことを考えてみると、これは帯域が64bitに減っただけであり、メリットはない。IntelのCore Microarchitectureと異なり、複数のWrite OperationをFly-byで発行する機能は無いから、Random Access時の性能改善も期待できないだろう。しかし複数Threadで、となるとこれは話が変わってくる。特に複数のCPUコアから同時にリクエストが出てくる場合には、性能が改善される公算は高い。

これをちょっと、簡単なプログラムで確認してみた。Util36は1~8のThreadが、各Thread毎に40MBのローカルバッファをひたすら書き換える「だけ」のプログラムである。スレッドあたり40MB、8スレッドでは合計320MBものサイズになるので、勿論キャッシュでは収まりきらず、煩雑にメモリアクセスを行うことになる。プログラムはこちら(Util36.cpp)であるが、先に各Threadを立ち上げて初期化(バッファの確保と初期値の格納)を行わせたら、Eventでタイミングを取って一斉に書き換えを行わせる。各Threadは所定の回数(40MBのバッファ全体を100回)更新したら終了するので、Eventを送ってから全Threadが終了するまでの時間を計測して表示するというだけのプログラムである。アセンブラリストと実行ファイルはこちら(Util36.zip)となっている。

グラフ80

実行結果はこちら(グラフ80)である。Util36を10回実行した結果の平均を取ったものだが、どちらも綺麗に直線状になっており、かつUngangedが確実に高速であることが判る。ReadはともかくWriteでは64bit幅になるから、1 ThreadでもUngangedのデメリットはそれほど無く、かつThreadが増えるほどUngangedのメリットがはっきり判るものとなっている。ちなみに8ThreadではでGangedで10239.9msec、Ungangedでは9302.1msecという結果になっており、Ungangedが10%ほど高速になっている。図らずしもPhoto18の数字が追試できたようなものだ。

もっともこの数字は、必ずしも常に成立するわけでもなく、またむしろ性能が下がる場合も多いのはテストの結果明らかになっている。こちらはこの後のパートで、ゆっくりベンチマーク結果を見ながら検証してみたい。