- プログラミング
C++ AMPの実力を試す
C++ AMPの実力を試す
Microsoft が C++ AMPを大々的に発表したのは 2011年の//build/前くらいでしょうか?当時build開場のAMDブースで説明をされていたので、AMDと歩調を合わせた環境なのか、と思っていましたが、MicrosoftによるとCPU,GPUの適用範囲はDirectXのそれと同じで広く、またWindows 以外の環境にも広めたいと思っているようです。
現状手もとのプログラムはC#で開発していますが、どうしても大規模な数値演算はC#ではSIMD命令やGPGPUの恩恵をそのまま受けられません。OpenCLやDirect ComputeのC#ラッパーなどが存在するようですが、ラップされてもかなり特殊な環境であることには変わりありません。
C++ AMPの解説にC#から呼び出すというものがあり、比較的簡単に見えたので、Interop呼び出しをした場合に、どの程度のパフォーマンスが出るかをMatrix Multで試してみました。
C++ AMP (Developer Reference) 本を購入したのですが、そのサンプルがCodePlex にあります。この中に行列積のコードがあったのですが、これを実行すると、何と手元のマシンでも通常のシングルコアCPU処理と比べて100倍のスピードが出ているという結果になりました。でもこのコードよく見るとvectorを使ったり、いろいろフェアじゃない分部がありそうでしたので、プレーンなコードに治しましたら、だいたい以下のような感じになりました。
C# multi, C++ multi はもっとも外側のループをparallel forしたもの。AMP WARPはampコードをCPU SIMDプロセッサを使ってエミュレートしたもの。TiledというのはGPUの構成に合わせてタイルサイズを指定したものです。
Surface Pro 2(Intel Core i5 4300U) と ショップブランドマシン(AMD Kaveri A10-7850K)を使いました。2コア、4コアのCPUなので、parallel forの結果は妥当なものかと思います。GPUは、このクラスのGPUとしては十分な性能が出ているといえるでしょうか?行列サイズが十分大きいことが条件ですが、シングル実行の2~5倍程度、C#での実行と比較すると10倍近い性能がでるというのは、十分導入に値するといえるでしょう。
GPGPUの世界もぐっと身近になって、様々な言語への対応も望まれますね。そういえばbuild 2014ではC#のSIMD対応やコンパイラの話がホットだったなぁ。