C++ AMPを使ってみよう
-
Upload
osamu-masutani -
Category
Software
-
view
966 -
download
4
description
Transcript of C++ AMPを使ってみよう
Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
C++ AMP を使ってみよう
Int. Edu. 2014/10/3
デンソーアイティーラボラトリ 増谷[email protected]
@ditml
Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
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
どんなコードになるの?
基本的にこれだけでよいデバイス?コンテキスト?malloc/free ?
Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
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
背景どうして C++AMP なのか
Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
GPGPU
おさらい それまで画像処理専用だった GPU を汎用計算につかう
GPU アーキテクチャの変化 プログラマブルシェーダーの登場
CPU 性能の行き詰まり 大量メディア処理に向かないアーキテクチャ
消費電力に対する要求 CPU のような冗長なアーキテクチャでは効率が悪い
http://tsubame.gsic.titech.ac.jp/tsubame2-system-architecture
Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
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
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
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
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
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
C++ AMP と DirectCompute
HLSL はやはり特殊 ラーニングカーブ
Direct X 的くどさ カーネルはホストコードと別々に書かなきゃいけない
生い立ちからして、グラフィックス指向なところがある ( OpenCL より) float4, float3
もっと簡単に 並列処理を Open MP 的に簡略化したい 純粋な C++ 言語で書きたい テクスチャ関連の処理に対するアクセスも確保( Concurrency::graphics空間)
Parallel For
Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
C++ AMP の利点費用対効果は?
Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
参考文献
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
どのくらい効率よい?
HSA の資料 C++AMP は OpenCL 並のスピー
ド Intel TBB などと同様のコード効率 OpenCL よりもコード量少ない
Bolt
Bolt にはコードのシンプルさでは負けるが、まだ普及していない
Bolt は C++AMP インターフェイスも装備
Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
どのくらい速い?手持ちのマシンで
単純な行列掛け算 プログラミングモデル同士の比較 Surface Pro 2(Intel Core i5
4300U) と ショップブランドマシン( AMD Kaveri A10-7850K )
Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
どのくらい速い?
もう少し大きな問題 CPU/GPU の公称性能差が出る
Kepler も参戦 Core i5 の 10倍 Kaveri の 3倍
Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
他のマシンは?
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
C++ AMP 入門ちょっと書いてみましょう
Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
準備
Visual Studio 2013 (2012) を用意 その他特にいらない
○○SDK とか、○○ドライバなど不要 Visual Studio 用のプラグイン、拡張不要 VS Express でも利用可能
Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
簡単なサンプル
チュートリアル多数あり http://
msdn.microsoft.com/ja-jp/library/hh265136.aspx
配列の掛け算 : CPU コード⇒ 2つの配列から同じ長さの配列へ 並列でない for ループ インデックス: int idx
Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
C++ AMP 化
いくつかの最小限のおまじない amp.h をインクルード
VS2013 からはデフォルトでリンクされている
concurrency ネームスペースを使う これ以外のセットアップ、コンパイルオプションは不要
array_view で配列のビューを指定 型、ランク、サイズ、ポインタを指定して生成 多次元の配列を 2 次元形式に表現する 読み取り専用( CPU->GPU )の場合は const指定 View を生成した時点ではコピーは起こらない
Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
C++AMP 化
おなじみ Parallel ForEach
C++ の新しい記法を活用 計算ドメイン
sum.extent
並列度の指定 ラムダ式
Index型の引数:各要素へのアクセスを提供 restrict(amp) : C++ AMP で用いられる C+
+ サブセットのみが利用可能であることを宣言
関数呼び出し可能( restrict(amp) なら)
Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
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
extent
データのサイズを指定する 既存のビューの次元を得る
例 3 次元配列(ビュー) 各次元のサイズを得る
View のコンストラクタの引数としても指定可能
Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
array と array_view
使い方はほとんど同じ Array_view の方が効率が良い
array_view に渡されるデータは GPU に複製されない カーネル関数が実行された時点でコピーされる 必要な場合のみオンデマンドでコピー
Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
計算ドメイン
並列実行用に作成するスレッドセットを定義する extent オブジェクトで指定
要素ごとのスレッド 例では 5個のスレッドが生成
extent.tile<> メソッドで指定 タイルを利用で最適化 スレッドを等しい四角形のサブセットに分割 global,local のインデックス指定 通常は local のみ用いた計算にする
例 2*2 のタイルで分割 グローバルな配列からローカルな配列にコピー ローカルな配列で計算 グローバルな配列に結果をコピー
Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
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
関連ツール
デバッグ VS の標準デバッガで GPU コードもデバッグ可能 http://msdn.microsoft.com/ja-jp/library/hh368280.aspx
CPU 、 GPU 同時は無理
Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
関連ツール
同時実行ビジュアライザ( 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
実戦投入
Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
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
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
テストプログラムの構造
WindowsUniversal
Windows PhoneUniversal
Universal Shared
AlgorithmPCL
AlgorithmNative
C#
AlgorithmNativeWinRT
C++
console app
Test
CX
WIN32 Managed C++
DLLimport
Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved
ちょっと待て
最近の .NET 関連の動向 : .NET vNext
RyuJIT 高速 .NET JIT
64bit最適化 SIMD 対応 : SSE で 2-3倍、 AVX で 4-5倍程度 Vector型を利用
Microsoft .NET Native
もともと Windows Store でのクラウドコンパイル時に利用されていた だいたい 60%程度まで高速 静的リンク C++ オプティマイザーの恩恵を受ける C# AMP なんて出ないかな?