C++ AMPを使ってみよう

35
C++ AMP ををををををを Int. Edu. 2014/10/3 をををををををををををををを をを [email protected] @ditml Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved

description

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

Transcript of C++ AMPを使ってみよう

Page 1: C++ AMPを使ってみよう

Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved

C++ AMP を使ってみよう

Int. Edu. 2014/10/3

デンソーアイティーラボラトリ 増谷[email protected]

@ditml

Page 2: C++ AMPを使ってみよう

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

Page 3: C++ AMPを使ってみよう

Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved

どんなコードになるの?

基本的にこれだけでよいデバイス?コンテキスト?malloc/free ?

Page 4: C++ AMPを使ってみよう

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 に対する売り

Page 5: C++ AMPを使ってみよう

Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved

背景どうして C++AMP なのか

Page 6: 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

Page 7: C++ AMPを使ってみよう

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 などと比べて

Page 8: C++ AMPを使ってみよう

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 だが グラフィックパイプラインの中で使う事が多かった

Page 9: C++ AMPを使ってみよう

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 からも直接呼べる

Page 10: C++ AMPを使ってみよう

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

Page 11: C++ AMPを使ってみよう

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 : 電力効率拡大に期待、モバイルで重要視

Page 12: C++ AMPを使ってみよう

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

Page 13: C++ AMPを使ってみよう

Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved

C++ AMP の利点費用対効果は?

Page 14: 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冊あり

Page 15: C++ AMPを使ってみよう

Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved

どのくらい効率よい?

HSA の資料 C++AMP は OpenCL 並のスピー

ド Intel TBB などと同様のコード効率 OpenCL よりもコード量少ない

Bolt

Bolt にはコードのシンプルさでは負けるが、まだ普及していない

Bolt は C++AMP インターフェイスも装備

Page 16: C++ AMPを使ってみよう

Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved

どのくらい速い?手持ちのマシンで

単純な行列掛け算 プログラミングモデル同士の比較 Surface Pro 2(Intel Core i5

4300U) と ショップブランドマシン( AMD Kaveri A10-7850K )

Page 17: C++ AMPを使ってみよう

Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved

どのくらい速い?

もう少し大きな問題 CPU/GPU の公称性能差が出る

Kepler も参戦 Core i5 の 10倍 Kaveri の 3倍

Page 18: C++ AMPを使ってみよう

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: いけそう?未実装

Page 19: C++ AMPを使ってみよう

Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved

C++ AMP 入門ちょっと書いてみましょう

Page 20: C++ AMPを使ってみよう

Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved

準備

Visual Studio 2013 (2012) を用意 その他特にいらない

○○SDK とか、○○ドライバなど不要 Visual Studio 用のプラグイン、拡張不要 VS Express でも利用可能

Page 21: C++ AMPを使ってみよう

Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved

簡単なサンプル

チュートリアル多数あり http://

msdn.microsoft.com/ja-jp/library/hh265136.aspx

配列の掛け算  :   CPU コード⇒ 2つの配列から同じ長さの配列へ 並列でない for ループ インデックス: int idx

Page 22: C++ AMPを使ってみよう

Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved

C++ AMP 化

いくつかの最小限のおまじない amp.h をインクルード

VS2013 からはデフォルトでリンクされている

concurrency ネームスペースを使う これ以外のセットアップ、コンパイルオプションは不要

array_view で配列のビューを指定 型、ランク、サイズ、ポインタを指定して生成 多次元の配列を 2 次元形式に表現する 読み取り専用( CPU->GPU )の場合は const指定 View を生成した時点ではコピーは起こらない

Page 23: C++ AMPを使ってみよう

Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved

C++AMP 化

おなじみ Parallel ForEach

C++ の新しい記法を活用 計算ドメイン

sum.extent

並列度の指定 ラムダ式

Index型の引数:各要素へのアクセスを提供 restrict(amp) : C++ AMP で用いられる C+

+ サブセットのみが利用可能であることを宣言

関数呼び出し可能( restrict(amp) なら)

Page 24: C++ 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 列目の要素を指定する

Page 25: C++ AMPを使ってみよう

Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved

extent

データのサイズを指定する 既存のビューの次元を得る

例 3 次元配列(ビュー) 各次元のサイズを得る

View のコンストラクタの引数としても指定可能

Page 26: C++ AMPを使ってみよう

Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved

array と array_view

使い方はほとんど同じ Array_view の方が効率が良い

array_view に渡されるデータは GPU に複製されない カーネル関数が実行された時点でコピーされる 必要な場合のみオンデマンドでコピー

Page 27: C++ AMPを使ってみよう

Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved

計算ドメイン

並列実行用に作成するスレッドセットを定義する extent オブジェクトで指定

要素ごとのスレッド 例では 5個のスレッドが生成

extent.tile<> メソッドで指定 タイルを利用で最適化 スレッドを等しい四角形のサブセットに分割 global,local のインデックス指定 通常は local のみ用いた計算にする

例 2*2 のタイルで分割 グローバルな配列からローカルな配列にコピー ローカルな配列で計算 グローバルな配列に結果をコピー

Page 28: C++ AMPを使ってみよう

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 コードのデバッグ」を参照してください。

Page 29: C++ AMPを使ってみよう

Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved

関連ツール

デバッグ VS の標準デバッガで GPU コードもデバッグ可能 http://msdn.microsoft.com/ja-jp/library/hh368280.aspx

CPU 、 GPU 同時は無理

Page 30: C++ AMPを使ってみよう

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 のスレッドブレークダウンはグラフィックス関連のみ?

Page 31: C++ AMPを使ってみよう

Copyright © 2014 Denso IT Laboratory, Inc. All Rights Reserved

実戦投入

Page 32: C++ AMPを使ってみよう

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

Page 33: C++ AMPを使ってみよう

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) からネイティブコードを呼び出すことはできない。

Page 34: C++ AMPを使ってみよう

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

Page 35: C++ AMPを使ってみよう

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 なんて出ないかな?