Hello, DirectCompute

Preview:

DESCRIPTION

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

Citation preview

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

Outline ● What's GPGPU

GPGPU とは...

● DirectCompute Introduction

速習 DirectCompute

What's GPGPU

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

● General-purpose でないとは?

"All processors aspire to be general-purpose"

Tim Van Hook, keynote, Graphics Hardware 2001

GPGPU の夜明け

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)

シェーダー言語

● HLSL● GLSL● Cg

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

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

頂点単位で実行

● Pixel Shader

ピクセル単位で実行

Vertex Shader

Pixel Shader

Rasterizer

Output

Input

GPU の超並列性

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

Pixel Shader による画像処理

Pixel Shader

Output

テクスチャユニット

ピクセルはデータ!!

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

Pixel Shader による汎用処理

Pixel Shader

Outputテクスチャユニット

GPGPU 黎明期 I

Ray Tracing on Programmable Graphics Hardware[Purcell 2002]

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

GPGPU 黎明期 II

Photon Mapping on Programmable Graphics Hardware[Percell 2003]

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

GPGPU 黎明期 III

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

GPU Gems シリーズ刊行

[2004]

[2005][2007]

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

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

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

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

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

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

GPGPU アルゴリズム

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

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

GPGPU のダークサイド

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

CUDA の登場 [2006]

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

GPU の GPGPU 進化

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

● SIMD からスカラーへ

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

そして 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

DirectCompute Introduction

DirectCompute とは

● DirectX API による GPGPU サポート

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

● HLSL で記述 (Compute Shader)

● CUDA, OpenCL と同様の思想

● Windows7 (Vista SP1 では CS4)

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

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

Geforce400系~

RadeonHD5000系~

Intel HD Graphics4000~ (Ivy Bridge)

要求環境

HLSL● C言語に似た文法

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

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

Shader Model 5.0- GPGPU 拡張

● 64bit 浮動小数点演算

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

● データ構造の追加

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

GPU アーキテクチャー

Processor

Multiprocessor

Processor

ProcessorProcessor

Processor

Processor

Multiprocessor Multiprocessor

Multiprocessor Multiprocessor

Multiprocessor Multiprocessor

Global Memory

Shared Memory

Device

スレッドの並列実行

Multiprocessor 一基で

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

Shared Memory 一基Processor

Multiprocessor

Processor

ProcessorProcessor

Processor

Processor

Shared Memory

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

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

X

Y

Z

スレッドグループ

スレッド

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

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

Processor がスレッドを実行

Processor

Multiprocessor

Processor

ProcessorProcessor

Processor

Processor

Dispatch

簡単な 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];}

簡単なホストプログラム

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

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

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

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

Dispatch 関数の引数で指定

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

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

スレッドの実行回数

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

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

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

引数とセマンティクス

[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

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

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

引数の数は自由

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

...}

シェーダーのコンパイル

● オフラインコンパイル

SDK付属の fxc.exe

● ランタイムコンパイル

D3DX11CompileFromFile() 関数

(d3dx11.dll)

ホストプログラムの流れ

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

GPUリソースの生成

GPUリソースの設定

シェーダーの実行

GPU リソース (ID3D11Resource)

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

● ID3D11Buffer○ RawBuffer○ StructuredBuffer○ ConstantBuffer

● ID3D11Texture1D● ID3D11Texture1DArray● ID3D11Texture2D● ID3D11Texture2DArray● ID3D11Texture3D

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

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

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

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

GPU リソースビュー

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

リソースとビューの関係

Shader A Shader B

Texture Buffer

UAV SRV UAV

リソースの設定

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

定数バッファ

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

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

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(...) でスロット番号を指定

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

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

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

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

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

共有メモリへのアクセス

共有メモリの宣言

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

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

メモリアクセス

スコープ アクセス 場所

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

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

SRV グローバル Read off-chip

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

高速!!

同期命令

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

アトミック命令

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

パフォーマンス

● GPU から CPU への WriteBack は注意

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

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

GPU デバッガ

● PIX (SDK 付属)

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

その他諸々?

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

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

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

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

においては一日の長あり

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

● BasicCompute11配列同士の加算処理

● ComputeShaderSort11Bitonic ソート

● NBodyGravityCS113D N体問題

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

参考文献

Practical Rendering& Computationwith Direct3D11

まとめ

● DirectCompute は CUDA, OpenCL と同様

GPGPU 環境を提供する

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

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

Enjoy GPGPU!!

Recommended