Sandra 2014その2(グラフ21~39)

次いでGPU性能周りの確認を。グラフ21はGPUのみを使っての、Multi-Media Benchmarkの結果である。先ほどのグラフ5と6と混ぜても良かったのだが、なぜかOpenCLでCPU+GPUとかがうまくテストが動かなかったので、一緒にする意味がないということで分離している。

さて、ここからはKaveriのターンというべきか。RichlandとHaswellを比較すると、割と良い勝負というか、HaswellのGPU性能は(テストにもよるが)Richlandとはまぁ勝負できる範囲であるが、Kaveriには遠く及ばないといった、CPUの結果と見事な逆転現象が起きている。

引き続き、グラフ22~28がCryptography系のテストである。グラフ22~25はAESのEncyption/Decryptionの結果となる。CPU単体で行った場合はブッチギリでHaswellが最高速であるが、GPUを使うとKaveriが最高速の座を取り戻すといった構図が全てのケースで再現されている。

OpenCLでCPU+GPUの構成にするとむしろ性能が劣化するのも同じ。またOpenCLよりもComputeShaderの方が現在は高速であるが、これは各々のドライバの最適化の具合も関係するのだろう。取りあえずどっちか速い方が現在のCPU性能のピークと考えれば良いと思う。

この構図はHashでも同じだが、SHA-1(グラフ26)やSHA2-256(グラフ27)はともかくSHA2-512(グラフ28)では、例えばComputeShaderが全滅する(そもそもテストが実行できなかった)とか、OpenCLを使っても満足に性能が出ないというあたりが、まだ現在のOpenCLは何でも使えるというレベルには達していない事を示していると思う。

グラフ29~34はFinancial系ベンチマークである。結果を見てみると不思議なのは、HaswellのBlack-ScholesやMonte CarloではCPUをNativeで呼び出すよりOpenCL経由で呼び出した方が高速なこと。どうもNativeでは拡張命令系を呼べず、一方OpenCL経由では拡張命令が動作している風な結果である。Binomialだと普通にNativeの方が高速なあたり、この辺はアルゴリズムというか実装が何か変なことをやっていそうだ。

それはともかくとして、こちらでもやはりKaveriがHaswellに大きく差をつけている。テストによっては、例えばCompute Shaderを使ったBlack-ScholesのFloatとかでHaswellが上回る性能を出している事もあるが、全般的に言えばやはりKaveriのGPUの方が明確に高い性能をだしている。ここでの優位性は明確、として差し支えないと思う。

グラフ35~37はGPUのMemory Accessの性能となる。今回は全部統合グラフィックでの比較だから、結果としてはメインメモリへのアクセス速度の比較、という形になる。

まずグラフ35がInternal Memoryで、これはメインメモリ以外に内部キャッシュへのアクセスも含んだ数字になる。結果、OpenCLベースの「CPUのみ」「CPU+GPU」ではHaswellが良いスコアであるが、OpenCLあるいはComputeShaderでのGPUのアクセス性能はほぼHaswellとKaveriが方を並べる事になっている。

メモリコントローラそのものはHaswellの方が良い数字を出しているのは既に確認済みであり、グラフ12に示すようにHaswellで20GB/sec程度、Kaveriで14GB/sec程度となっているが、ここにはGPU内部のキャッシュアクセスの分は含まれていない。

これを加味するとHaswellとKaveriのどちらも20GB/sec程度のアクセス性能があるという事が確認できたのは面白い。素のメインメモリアクセス帯域はグラフ36とグラフ37がそれに相当するが、やはりGPU経由だとそれなりに遅くなるのは当然である。ただOpenGL/ComputeShader共にKaveriの方がHaswellよりも速いというあたりは、さすがにKaveriで高速化に留意しただけの事はあると思う。

Photo01~Photo03はAMDの統合グラフィックにおけるメモリ経路を解説したものだが、基本的な発想はHSAの思想を実現するための段階的な進化である。HSAの思想とは、CPUとGPUが完全にキャッシュコヒーレンシで動作するという話であり、

AMD 780G:ただ繋いだだけ。なのでここではキャッシュコヒーレンシは当然無い。 Llano:内部バスを128bit化して高速化すると共に、RADEON Memory Busを追加した。これによりGPUがAMD780Gの時よりも広帯域・低レイテンシでメモリアクセスできるようになった。ただしキャッシュコヒーレンシはまだ不可能。

Photo01:AMD 780Gはメモリアクセスは完全にCPU側のMemory Controller任せだったが、初代APUであるLlanoではGPUから直接メモリコントローラに接続されるRADEON Memory Busが追加された

Trinity/Richland:IOMMU v2を間に挟むことで、GPUからメモリに対するPage Faultを発生させられるようになった。ただまだキャッシュコヒーレンシはGPU→CPU方向の不完全なものしか実現できていない。

Photo02:Llano→Trinity/Richlandでは、内部バス幅が256bitに拡張され、さらにIOMMUが追加された

Kaveri:キャッシュコヒーレンシを実現するために、IOMMUから2本のバスが出るようになった。1本は従来型のもので、これは引き続き片方向(GPU→CPU)のキャッシュコヒーレンシのみのコヒーレンシをサポートする。一方、新規に追加されたバスは、GPUのL2キャッシュをバイパスして直接メモリに書き込む仕組みになっており、この結果CPU→GPUのキャッシュコヒーレンシが確保できるというか、GPUのキャッシュコヒーレンシを考える必要がなくなっている。

Photo03:Trinity/RichlandからKaveriでは、IOMMUからのバスが2本に増えた

といった進化をしている。現時点でもまだHSAの仕組みを完全に実装したわけではない(要するにGPU側のL2キャッシュを無効にしたのと同じことだからだ)とはいえ、より高速にCPU⇔GPU間の通信が可能になったのかKaveriの特徴であり、こうした工夫がHaswellより高速な帯域という形で実を結んだと考えて良いかと思う。

最後にDirectXベースのVideo Shaderの性能比較(グラフ38とグラフ39)であるが、Float(グラフ38)に関してはkaveriの圧勝なのに、Double(グラフ39)だとHaswellがケースによっては上回る、というのも非常に面白い。もっともFloatはともかくDoubleは、これをDirectX経由で使うというケースは普通考えにくいから、グラフ38の結果がそのままアプリケーションに反映されると考えて良いかと思う。