Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

C++ AMPを使ってみよう

5,122 views

Published on

C++ AMPの概要と簡単なチュートリアルです。まだ使いだしなので詳しいことは書けませんが、導入には十分でしょうか?

Published in: Software
  • Be the first to comment

C++ AMPを使ってみよう

  1. 1. C++ AMP を使ってみよう Int. Edu. 2014/10/3 デンソーアイティーラボラトリ増谷 omasutani@d-itlab.co.jp @ditml Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  2. 2. C++ AMPとは  C++ Accelerated Massive Parallelism  C++でGPGPUに容易にアクセスする方法  C++ AMP (C++ Accelerated Massive Parallelism) は、独立したグラフィックスカード のGPU (graphics processing unit) などの一般的なデータ並列ハードウェアを活用し て、C++ コードの実行を高速化します。C++ AMP のプログラミングモデルには、多 次元配列、インデックス作成、メモリ転送、およびタイルのサポートが含まれてい ます。また、数学関数ライブラリも含まれています。C++ AMP の言語拡張機能を使 用して、データをCPU からGPU へ、またGPU からCPU へどのように移動するか を制御できます。  オフィシャルサイト  MSDN 並列プログラミング(C++ AMP)  http://msdn.microsoft.com/ja-jp/library/hh265137.aspx Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  3. 3. どんなコードになるの? 基本的にこれ だけでよい デバイス? コンテキスト? malloc/free ? Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  4. 4. Windowsだけ?  今のところ。  元々オープンな仕様として作っている  http://www.infoq.com/jp/news/2012/02/CPP_AMP_Published  MicrosoftはC++ AMPをWindowsのみにする意図はなく、「誰でもC++ AMPオープン 仕様をどのプラットフォームに実装する人でも、サポートし、後押しする」。  その他の実装を後押しするために、MicrosoftはMicrosoft Community Promiseの条 項のもとでC++ AMP仕様書の全部をリリースした。  現状は?  MicrosoftのC++ AMP 実装はDirectX 11ベース(Compute Shader)利用  Direct 3Dとの相互運用性あり: OpenCLに対する売り Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  5. 5. 背景 どうしてC++AMPなのか Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  6. 6. GPGPU  おさらい  それまで画像処理専用だったGPUを汎用計算につかう  GPUアーキテクチャの変化  プログラマブルシェーダーの登場  CPU性能の行き詰まり  大量メディア処理に向かないアーキテクチャ  消費電力に対する要求  CPUのような冗長なアーキテクチャでは効率が悪い http://tsubame.gsic.titech.ac.jp/tsubame2-system-architecture Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  7. 7. MicrosoftとGPGPU  Accleralator @ MS Research  http://research.microsoft.com/en-us/projects/accelerator/  2006年リリース  C++ Native GPGPUライブラリ(DirectX9ベース)  .NETラッパーあり  非常に書きやすい  C# ラムダ式やLINQを利用可能  パフォーマンスはそれほど良くない  OpenCLなどと比べて Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  8. 8. DirectCompute  Vista以降DirectX 11の機能の一部として搭載されたGPGPU API  ※その後Direct X10.X系でも行けるようになった。  開発スタイル  HLSL (シェーダー言語)を利用  ベンダー非依存(Intel,Nvidia,AMD,(ARM)可)  HLSL(中間言語)を各ベンダーの言語にコンパイル  General Purpose だが  グラフィックパイプラインの中で使う事が多かった Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  9. 9. HLSL  Direct 3D 8 から導入  ソフトウェアによる描画アルゴリズムのカスタマイズが目的  当初はアセンブラで書いていた  プログラマブルシェーダーのためのシェーダー言語  ※ OpenGLも4.3からGLSLという類似言語を導入  ※ Nvidiaと共同開発のためCgに似ている  ※ CUDAやOpenCLのカーネル関数に似ている  書ける範囲  DX9 : 頂点シェーダー、ピクセルシェーダー  DX10 : 上記+ジオメトリシェーダー  DX11 : 上記+ハルシェーダー、ドメインシェーダー、コンピュートシェーダー  開発環境  HLSLコンパイラは、Visual Studio, Direct 3D SDK・Windows SDKに搭載  .NET(WPF),Silverlightからも直接呼べる Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  10. 10. DirectComputeと各ベンダー  各社対応済み  DirectCompute on Nvidia : CUDA上  https://developer.nvidia.com/directcompute  DirectCompute on AMD : ATI Stream上  http://developer.amd.com/community/blog/2010/07/02/your-direct-connection-to- directcompute/  DirectCompute on Intel : IvyBridgeから対応  https://software.intel.com/en-us/articles/microsoft-directcompute-on-intel-ivy-bridge- processor-graphics  DirectCompute on ARM : Mali-600シリーズあたりから採用?  http://www.arm.com/ja/products/mali-t658.php Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  11. 11. Direct X12とDirectCompute  Direct X12  Windows 10 で搭載予定の次世代Direct Xバージョン  先日公開されたPreview Releaseには未搭載  Xbox One, Windows Phoneなどにも搭載予定  抽象度を下げたAPI  以前よりハードウェア仕様が収斂してきた:抽象化が不要に  余計な抽象度は下げてより”Direct”に操作して、GPUのパフォーマ ンスを最大限使う  AMD Mantleをヒントにした  Compute関連の情報は今のところ無いが性能向上が期待できる  DX12 各社対応  Nvidia : Fermi以降でサポート  AMD: GCN以降でサポートMantleからのスムーズな移行  Intel : Haswell Irisコアでサポート  Qualcomm : 電力効率拡大に期待、モバイルで重要視 Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  12. 12. C++ AMP とDirectCompute  HLSLはやはり特殊  ラーニングカーブ  Direct X的くどさ  カーネルはホストコードと別々に書かなきゃいけない  生い立ちからして、グラフィックス指向なところがある(OpenCLより)  float4, float3  もっと簡単に  並列処理をOpen MP的に簡略化したい  純粋なC++言語で書きたい Parallel For  テクスチャ関連の処理に対するアクセスも確保(Concurrency::graphics空間) Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  13. 13. C++ AMPの利点 費用対効果は? Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  14. 14. 参考文献  C++ AMP (Developer Reference) [ペーパーバック]  Ade Miller (著)  Kate Gregory (著)  http://www.amazon.co.jp/AMP-Developer-Reference-Ade- Miller/dp/0735664730  上記のサンプルコード  http://ampbook.codeplex.com/  社内に1冊あり Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  15. 15. どのくらい効率よい?  HSAの資料  C++AMPはOpenCL並のスピード  Intel TBB などと同様のコード効率  OpenCLよりもコード量少ない  Bolt  Boltにはコードのシンプルさでは負 けるが、まだ普及していない  BoltはC++AMPインターフェイスも 装備 Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  16. 16. どのくらい速い?手持ちのマシンで  単純な行列掛け算  プログラミングモデル同士の比 較  Surface Pro 2(Intel Core i5 4300U) とショップブランドマ シン(AMD Kaveri A10-7850K) Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  17. 17. どのくらい速い?  もう少し大きな問題  CPU/GPUの公称性能差が出る  Keplerも参戦  Core i5 の10倍  Kaveri の3倍 Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  18. 18. 他のマシンは?  Windows Store アプリを作った  C++ AMP Benchmark  http://apps.microsoft.com/windows/ja-jp/app/c-amp-benchmark/ 5297ac8c-30f3-476a-b8bc-6b5af3bcc499  いつかコード公開します。  C#からC++を呼びだし  CX利用(C++AMPのサンプルあり)  サポートされているプロセッサ  x86, x64  ARM:いけそう?未実装 Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  19. 19. C++ AMP入門 ちょっと書いてみましょう Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  20. 20. 準備  Visual Studio 2013 (2012)を用意  その他特にいらない  ○○SDKとか、○○ドライバなど不要  Visual Studio 用のプラグイン、拡張不要  VS Expressでも利用可能 Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  21. 21. 簡単なサンプル  チュートリアル多数あり  http://msdn.microsoft.com/ja-jp/ library/hh265136.aspx  配列の掛け算: CPUコード⇒  2つの配列から同じ長さの配列へ  並列でないforループ  インデックス:int idx Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  22. 22. C++ AMP化  いくつかの最小限のおまじない  amp.h をインクルード  VS2013からはデフォルトでリンクされている  concurrency ネームスペースを使う  これ以外のセットアップ、コンパイルオプションは不要  array_viewで配列のビューを指定  型、ランク、サイズ、ポインタを指定して生成  多次元の配列を2次元形式に表現する  読み取り専用(CPU->GPU)の場合はconst指定  Viewを生成した時点ではコピーは起こらない Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  23. 23. C++AMP化  おなじみParallel ForEach  C++ の新しい記法を活用  計算ドメイン  sum.extent  並列度の指定  ラムダ式  Index型の引数:各要素へのアクセスを提供  restrict(amp) : C++ AMPで用いられるC++サブ セットのみが利用可能であることを宣言  関数呼び出し可能(restrict(amp)なら) Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  24. 24. index  インデックスの抽象化  1 個のオブジェクトに各次元の原点からのオフセットをカプセル化  例  1次元配列用に抽象化されたindex<1>型変数  idx(2)で3番目の要素を指定する  2次元配列(ビュー)用に抽象化されたindex<2>型変数  Idx(1,2)で2行目、3列目の要素を指定する Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  25. 25. extent  データのサイズを指定する  既存のビューの次元を得る  例  3次元配列(ビュー)  各次元のサイズを得る  Viewのコンストラクタの引数 としても指定可能 Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  26. 26. array とarray_view  使い方はほとんど同じ  Array_viewの方が効率が良い  array_viewに渡されるデータはGPUに複製されない  カーネル関数が実行された時点でコピーされる  必要な場合のみオンデマンドでコピー Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  27. 27. 計算ドメイン  並列実行用に作成するスレッドセットを定義する  extentオブジェクトで指定  要素ごとのスレッド  例では5個のスレッドが生成  extent.tile<>メソッドで指定  タイルを利用で最適化  スレッドを等しい四角形のサブセットに分割  global,local のインデックス指定  通常はlocalのみ用いた計算にする  例  2*2のタイルで分割  グローバルな配列からローカルな配列にコピー  ローカルな配列で計算  グローバルな配列に結果をコピー Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  28. 28. C++ AMPの仕様  システム要件  Windows 7、Windows 8、Windows Server 2008 R2、またはWindows Server 2012  DirectX 11 機能レベル11.0 以降のハードウェア  ソフトウェアエミュレーターでデバッグするには、Windows 8 またはWindows Server 2012 が必要です。ハードウェアでデバッグするには、グラフィックスカー ドのドライバーをインストールする必要があります。詳細については、「GPU コー ドのデバッグ」を参照してください。 Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  29. 29. 関連ツール  デバッグ  VSの標準デバッガでGPUコードもデバッグ可能  http://msdn.microsoft.com/ja-jp/library/hh368280.aspx  CPU、GPU同時は無理 Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  30. 30. 関連ツール  同時実行ビジュアライザ(Concurrency Visualizer for VS)  http://visualstudiogallery.msdn.microsoft.com/24b56e51-fcc2-423f-b811- f16f3fa3af7a  プロファイリングツール  使用状況ビュー  http://msdn.microsoft.com/ja-jp/library/vstudio/dd627195(v=vs.110).aspx  C++AMP内の処理のブレークダウンに対応  http://blogs.msdn.com/b/nativeconcurrency/archive/2012/03/09/analyzing-c-amp- code-with-the-concurrency-visualizer.aspx  Visual Studio 2013 Update 4 のGPU使用率プロファイラ  GPUのスレッドブレークダウンはグラフィックス関連のみ? Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  31. 31. 実戦投入 Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  32. 32. Metro Traffic Simulatorのボトルネック解 消  最大のボトルネック:経路探索  全経路の探索をしてキャッシュするので更新時の計算時間が長い  バッチでやる分には問題ないが、地図が大きくなったときの対応が不安  経路探索アルゴのAMP化 1. QuickGraph(.NET)ライブラリから、独自コード(C#)へDone 2. 独自コードの並列化Done ←いまここ 3. 独自コードのネイティブ化TODO 4. 独自コードのAMP化TODO Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  33. 33. GPGPU化は比較的簡単だが・・・  ライブラリの構成を工夫する必要がある  ネイティブコードを入れるとstoreにpublishする際にプラットフォームごとのダイナ ミックリンクを指示する必要がある。当たり前。x64,x86,ARM版の3つ。  WinRTからのアンマネージドコードアクセス方法(CX)と、.NETからのアクセス方 法(Pinvokeとか)が違うので、ネイティブライブラリが2段構えになる。3*2=6個。  同時実行ビジュアライザを使おうとすると、Win32コンソール.NETアプリから呼び 出す必要がある。  GPUコードをデバッグするにはwin32ネイティブコンソールアプリが必要。  PCL(Portable Class Library)からネイティブコードを呼び出すことはできない。 Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  34. 34. テストプログラムの構造 Windows Universal Windows Phone Universal Universal Shared AlgorithmPCL AlgorithmNative C# AlgorithmNativeWinRT C++ console app Test CX DLLimport WIN32 Managed C++ Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
  35. 35. ちょっと待て  最近の.NET関連の動向: .NET vNext  RyuJIT 高速.NET JIT  64bit最適化  SIMD対応: SSEで2-3倍、AVXで4-5倍程度  Vector型を利用  Microsoft .NET Native  もともとWindows Storeでのクラウドコンパイル時に利用されていた  だいたい60%程度まで高速  静的リンク  C++オプティマイザーの恩恵を受けるC# AMPなんて出ないかな? Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved

×