hello, directcompute

66
Hello, DirectCompute @dasyprocta - 関西 GPGPU 勉強会

Upload: dasyprocta

Post on 29-Nov-2014

4.303 views

Category:

Technology


1 download

DESCRIPTION

関西GPGPU勉強会(5/26/2012) DirectCompute の布教のために使用したスライドです. 内容の正確性は保証しません.

TRANSCRIPT

Page 1: Hello, DirectCompute

Hello, DirectCompute@dasyprocta - 関西 GPGPU 勉強会

Page 2: Hello, DirectCompute

Outline ● What's GPGPU

GPGPU とは...

● DirectCompute Introduction

速習 DirectCompute

Page 3: Hello, DirectCompute

What's GPGPU

Page 4: Hello, DirectCompute

What's GPGPUGeneral-purpose computingon graphics processing units ● General-purpose であるとは?

● General-purpose でないとは?

Page 5: Hello, DirectCompute

"All processors aspire to be general-purpose"

Tim Van Hook, keynote, Graphics Hardware 2001

GPGPU の夜明け

Page 6: Hello, DirectCompute

Programmable GPUプログラム可能な GPU の登場● DirectX8.0 [2000] アセンブリ (Shader Model 1.x)

● DirectX9.0 [2002] HLSL (Shader Model 2.0x)● DirectX9.0c [2004] HLSL (Shader Model 3.0)

Page 7: Hello, DirectCompute

シェーダー言語

● HLSL● GLSL● Cg

Page 8: Hello, DirectCompute

グラフィックスパイプライン~ Shader Model 3.0

プログラム可能なユニット ● Vertex Shader

頂点単位で実行

● Pixel Shader

ピクセル単位で実行

Vertex Shader

Pixel Shader

Rasterizer

Output

Input

Page 9: Hello, DirectCompute

GPU の超並列性

Pixel Shader によるピクセル並列処理

Page 10: Hello, DirectCompute

Pixel Shader による画像処理

Pixel Shader

Output

テクスチャユニット

Page 11: Hello, DirectCompute

ピクセルはデータ!!

ピクセルのビット数● 32bit (R8G8B8A8 - UNSIGNED INT)● 64bit (R16G16B16A16 - HALF FLOAT)● 128bit (R32G32B32A32 - FLOAT)

Page 12: Hello, DirectCompute

Pixel Shader による汎用処理

Pixel Shader

Outputテクスチャユニット

Page 13: Hello, DirectCompute

GPGPU 黎明期 I

Ray Tracing on Programmable Graphics Hardware[Purcell 2002]

● レイトレーシングの GPU 実装● ポリゴンのテクスチャへの格納

Page 14: Hello, DirectCompute

GPGPU 黎明期 II

Photon Mapping on Programmable Graphics Hardware[Percell 2003]

● フォトンマッピングの GPU 実装● Bitonic ソートの GPU 実装

Page 15: Hello, DirectCompute

GPGPU 黎明期 III

Building a Million Particle System [Latta 2004] ● テクスチャパーティクル● ダブルバッファによる時間積分

Page 16: Hello, DirectCompute

GPU Gems シリーズ刊行

[2004]

[2005][2007]

Page 17: Hello, DirectCompute

GPU GemsPart VI - Beyond Triangles

● A Toolkit for Computation on GPUs

● Fast Fluid Dynamics Simulation on the GPU

● Volume Rendering Techniques

● Applying Real-Time Shading to 3D Ultrasound Visualization

● Real-Time Stereograms

● Deformers

Page 18: Hello, DirectCompute

GPU Gems 2Part IV - General-Purpose Computation on GPUs

● Streaming Architectures and Technology Trends

● The GeForce 6 Series GPU Architecture

● Mapping Computational Concepts to GPUs

● GPU Computation Strategies and Tips

● Implementing Efficient Parallel Data Structures on GPUs

● GPU Flow Control Idioms

● GPU Program Optimization

● Stream Reduction Operations for GPGPU Applications

Page 19: Hello, DirectCompute

GPU Gems 2Part V - Image-Oriented Computing

● Octree Textures on the GPU

● High-Quality Global Illumination Rendering Using Rasterization

● Global Illumination using Progressive Refinement Radiosity

● Computer Vision on the GPU

● Deferred Filtering: Rendering from Difficult Data Formats

● Conservative Rasterization

Page 20: Hello, DirectCompute

GPU Gems 2Part VI - Simulation and Numerical Algorithms

● GPU Computing for Protein Structure Prediction

● A GPU Framework for Solving Systems of Linear Equations

● Options Pricing on the GPU

● Improved GPU Sorting

● Flow Simulation with Complex Boundaries

● Medical Image Reconstruction with the FFT

Page 21: Hello, DirectCompute

GPU Gems 3Part V - Physics

● Real-Time Rigid Body Simulation on GPUs

● Real-Time Simulation and Rendering of 3D Fluids

● Fast N-Body Simulation with CUDA

● Broad-Phase Collision Detection with CUDA

● LCP Algorithms for Collision Detection Using CUDA

● Signed Distance Fields Using Single-PassGPU Scan Conversion of Tetrahedra

Page 22: Hello, DirectCompute

GPU Gems 3Part VI - GPU Computing

● Fast Virus Signature Matching on the GPU

● AES Encryption and Decryption on the GPU

● Efficient Random Number Generation and Application using CUDA

● Imaging Earth's Subsurface Using CUDA

● Parallel Prefix Sum (Scan) with CUDA

● Incremental Computation of the Gaussian

● Using the Geometry Shader for Compactand Variable-Length GPU Feedback

Page 23: Hello, DirectCompute

GPGPU アルゴリズム

● Map● Reduce● Scatter and Gather● Scan● Stream Filtering● Sort● Search

A Survey of General-Purpose Computationon Graphics Hardware [Owens 2007]

Page 24: Hello, DirectCompute

GPGPU のダークサイド

グラフィックス API の学習コストが高い● DirectX● OpenGL

Page 25: Hello, DirectCompute

CUDA の登場 [2006]

● グラフィックス API からの解放

Page 26: Hello, DirectCompute

GPU の GPGPU 進化

● ユニットの統合 (Unified Shader)

● SIMD からスカラーへ

● 倍精度浮動小数点数対応

Page 27: Hello, DirectCompute

そして DirectCompute へ

Page 28: Hello, DirectCompute

GPU プログラミング系譜

DirectXShader Model

CUDA [2006]

OpenCL [2008]

汎用 API モデル1.0 [2000]2.0 [2002]3.0 [2004]4.0 [2006]

5.0 [2009]4.1 [2008]

DirectCompute

Page 29: Hello, DirectCompute

DirectCompute Introduction

Page 30: Hello, DirectCompute

DirectCompute とは

● DirectX API による GPGPU サポート

● グラフィックスパイプラインとは独立して動作

● HLSL で記述 (Compute Shader)

● CUDA, OpenCL と同様の思想

Page 31: Hello, DirectCompute

● Windows7 (Vista SP1 では CS4)

Visual C++ 2008, 2010DirectX SDK (June 2010)

● DirectX11 対応ハードウェア (10.1 では CS4)

Geforce400系~

RadeonHD5000系~

Intel HD Graphics4000~ (Ivy Bridge)

要求環境

Page 32: Hello, DirectCompute

HLSL● C言語に似た文法

● グラフィックス用途の組み込み関数

● ShaderModel バージョンにより違い

Page 33: Hello, DirectCompute

Shader Model 5.0- GPGPU 拡張

● 64bit 浮動小数点演算

● 共有メモリの使用 (32KB)

● データ構造の追加

● アトミック命令, 同期命令

Page 34: Hello, DirectCompute

GPU アーキテクチャー

Processor

Multiprocessor

Processor

ProcessorProcessor

Processor

Processor

Multiprocessor Multiprocessor

Multiprocessor Multiprocessor

Multiprocessor Multiprocessor

Global Memory

Shared Memory

Device

Page 35: Hello, DirectCompute

スレッドの並列実行

Multiprocessor 一基で

複数のHW スレッドを実行 Multiprocessor 単位で

Shared Memory 一基Processor

Multiprocessor

Processor

ProcessorProcessor

Processor

Processor

Shared Memory

Page 36: Hello, DirectCompute

スレッドのグリッドモデル

スレッドグループのスレッド数を3次元で指定

X

Y

Z

スレッドグループ

スレッド

Page 37: Hello, DirectCompute

スレッドとスレッドグループ- Thread and Thread Group

Multiprocessor がスレッドグループを実行

Processor がスレッドを実行

Processor

Multiprocessor

Processor

ProcessorProcessor

Processor

Processor

Dispatch

Page 38: Hello, DirectCompute

簡単な Compute Shader

StructuredBuffer<float> A : register(t0);StructuredBuffer<float> B : register(t1);RWStructuredBuffer<float> O : register(u0); [numthreads(1, 1, 1)] // スレッドグループのサイズを指定

void CSMain(uint3 id : SV_DispatchThreadID){

O[id.x] = A[id.x] + B[id.x];}

Page 39: Hello, DirectCompute

簡単なホストプログラム

ID3D11DeviceContext* dc = デバイスの生成();

// まずはシェーダーを設定して...

dc->CSSetShader(...); // Fire!!dc->Dispatch(X, Y, Z);

Page 40: Hello, DirectCompute

スレッドグループの実行回数

Dispatch 関数の引数で指定

Dispatch(X, Y, Z) を実行した場合

実行スレッドグループ数 = X * Y * Z

Page 41: Hello, DirectCompute

スレッドの実行回数

[numthread(AX, AY, AZ)]void CSMain() {}のシェーダーを

Dispatch(BX, BY, BZ)で呼び出した場合

実行スレッド数 = 実行スレッドグループ数 * AX*AY*AZ = BX*BY*BZ * AX*AY*AZ

Page 42: Hello, DirectCompute

引数とセマンティクス

[numthreads(AX, AY, AZ)]void CSMain(uint3 id : SV_DispatchThreadID)

● SV_DispatchThreadID全スレッド内での ID: uint3 Dispatch(BX, BY, BZ) の場合の ID は

0 <= id.x < AX*BX0 <= id.y < AY*BY0 <= id.z < AZ*BZ

Page 43: Hello, DirectCompute

その他の引数セマンティクス

● SV_GroupIndexスレッドグループ内での一意の整数値: uint ● SV_GroupThreadIDスレッドグループ内での ID: uint3 ● SV_GroupIDスレッドグループの ID: uint3

Page 44: Hello, DirectCompute

引数の数は自由

使用したいものだけ定義すれば OK [numthreads(X, Y, Z)]void CSMain(uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint3 Gid : SV_GroupID, uint Gidx : SV_GroupIndex){

...}

Page 45: Hello, DirectCompute

シェーダーのコンパイル

● オフラインコンパイル

SDK付属の fxc.exe

● ランタイムコンパイル

D3DX11CompileFromFile() 関数

(d3dx11.dll)

Page 46: Hello, DirectCompute

ホストプログラムの流れ

シェーダーの読み込み・生成

GPUリソースの生成

GPUリソースの設定

シェーダーの実行

Page 47: Hello, DirectCompute

GPU リソース (ID3D11Resource)

グローバルメモリに置かれるバッファ

● ID3D11Buffer○ RawBuffer○ StructuredBuffer○ ConstantBuffer

● ID3D11Texture1D● ID3D11Texture1DArray● ID3D11Texture2D● ID3D11Texture2DArray● ID3D11Texture3D

Page 48: Hello, DirectCompute

バッファとテクスチャの違い

● テクスチャはサンプラーによるアクセスが可能

サンプラーによる線形補間, 等...

● テクスチャはミップマップが使用可能

Page 49: Hello, DirectCompute

GPU リソースビュー

シェーダーからリソースがどのように扱われるか ● ID3D11ShaderResourceView (SRV)読み込み専用バッファ ● ID3D11UnorderedAccessView (UAV)読み込み・書き込みバッファ

Page 50: Hello, DirectCompute

リソースとビューの関係

Shader A Shader B

Texture Buffer

UAV SRV UAV

Page 51: Hello, DirectCompute

リソースの設定

● CSSetShaderResourceViews()スロットを指定して SRV を設定 ● CSSetUnorderedAccessViews()スロットを指定して UAV を設定

Page 52: Hello, DirectCompute

定数バッファ

シェーダー定数として扱われるバッファアクセスが高速 ● CSSetConstantBuffers()スロットを指定して定数バッファを設定

Page 53: Hello, DirectCompute

シェーダーからのアクセス

StructuredBuffer<float> A : register(t0); // SRVStructuredBuffer<float> B : register(t1); // SRVRWStructuredBuffer<float> O : register(u0); // UAV cbuffer C : register(b0) { // 定数バッファ

float4 Vector; float4x4 Matrix;}register(...) でスロット番号を指定

Page 54: Hello, DirectCompute

シェーダーでのリソース種別

Read Only● Texture1D● Texture1DArray● Texture2D● Texture2DArray● Texture3D● StructuredBuffer● ByteAddressBuffer

Read/Write● RWTexture1D● RWTexture1DArray● RWTexture2D● RWTexture2DArray● RWTexture3D● RWStructuredBuffer● RWByteAddressBuffer

Page 55: Hello, DirectCompute

動的バッファ(擬似)のサポート

● AppendStructuredBufferバッファの最後に値を追加 ● ConsumeStructuredBufferバッファの最後から値を取得・削除 内部で同期を取ってくれる

Page 56: Hello, DirectCompute

共有メモリへのアクセス

共有メモリの宣言

groupshared float Shared[SIZE]; ● ソフトウェアキャッシュとして機能● 同期命令の

GroupMemoryBarrierWithGroupSync()と一緒に扱うことが多い

Page 57: Hello, DirectCompute

メモリアクセス

スコープ アクセス 場所

共有メモリ スレッドグループ Read/Write on-chip(register)

定数バッファ グローバル Read on-chip(cache)

SRV グローバル Read off-chip

UAV グローバル Read/Write off-chip

高速!!

Page 58: Hello, DirectCompute

同期命令

● AllMemoryBarrier● AllMemoryBarrierWithGroupSync● DeviceMemoryBarrier● DeviceMemoryBarrierWithGroupSync● GroupMemoryBarrier● GroupMemoryBarrierWithGroupSync

Page 59: Hello, DirectCompute

アトミック命令

● InterlockedAdd● InterlockedExchange● InterlockedCompareExchange● InterlockedAnd● InterlockedOr● InterlockedXor● etc...

Page 60: Hello, DirectCompute

パフォーマンス

● GPU から CPU への WriteBack は注意

● GPU のメモリ内容を利用する関数の使用

DispatchIndirect(ID3D11Buffer*, offset)GPU のメモリ内容を関数の引数として利用

Page 61: Hello, DirectCompute

GPU デバッガ

● PIX (SDK 付属)

公式のくせに DirectX11 にほとんど対応してない ● NVidia NsightNVIdia GPU 用 ● AMD GPU PerfStudio2AMD GPU 用

Page 62: Hello, DirectCompute

その他諸々?

● DirectX なので API に癖がある計算のみにも使用できるがそれなら CUDA の方が..

● Windows 環境のみでしか動かない

● グラフィックスパイプラインに味付けする役割?

● 可視化まで含めたリアルタイムシミュレーション

においては一日の長あり

Page 63: Hello, DirectCompute

DirectX SDK付属サンプル一部紹介

● BasicCompute11配列同士の加算処理

● ComputeShaderSort11Bitonic ソート

● NBodyGravityCS113D N体問題

● FluidCS112D 流体シミュレーション (SPH)

Page 64: Hello, DirectCompute

参考文献

Practical Rendering& Computationwith Direct3D11

Page 65: Hello, DirectCompute

まとめ

● DirectCompute は CUDA, OpenCL と同様

GPGPU 環境を提供する

● DirectX グラフィックスパイプラインとの

親和性が高いため可視化に有利

Page 66: Hello, DirectCompute

Enjoy GPGPU!!