Hello, DirectCompute

5,572 views
5,223 views

Published on

関西GPGPU勉強会(5/26/2012)

DirectCompute の布教のために使用したスライドです.
内容の正確性は保証しません.

Published in: Technology, Art & Photos
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,572
On SlideShare
0
From Embeds
0
Number of Embeds
51
Actions
Shares
0
Downloads
32
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Hello, DirectCompute

  1. 1. Hello,DirectCompute@dasyprocta - 関西 GPGPU 勉強会
  2. 2. Outline● Whats GPGPU GPGPU とは...● DirectCompute Introduction 速習 DirectCompute
  3. 3. Whats GPGPU
  4. 4. Whats GPGPUGeneral-purpose computingon graphics processing units● General-purpose であるとは?● General-purpose でないとは?
  5. 5. GPGPU の夜明け"All processors aspire to begeneral-purpose"Tim Van Hook, keynote, Graphics Hardware 2001
  6. 6. 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)
  7. 7. シェーダー言語● HLSL● GLSL● Cg
  8. 8. グラフィックスパイプライン~ Shader Model 3.0 プログラム可能なユニット Input ● Vertex Shader Vertex Shader 頂点単位で実行 Rasterizer ● Pixel Shader ピクセル単位で実行 Pixel Shader Output
  9. 9. GPU の超並列性Pixel Shader によるピクセル並列処理
  10. 10. Pixel Shader による画像処理 Pixel Shader Outputテクスチャユニット
  11. 11. ピクセルはデータ!!ピクセルのビット数● 32bit (R8G8B8A8 - UNSIGNED INT)● 64bit (R16G16B16A16 - HALF FLOAT)● 128bit (R32G32B32A32 - FLOAT)
  12. 12. Pixel Shader による汎用処理 Pixel Shaderテクスチャユニット Output
  13. 13. GPGPU 黎明期 IRay Tracing on Programmable Graphics Hardware[Purcell 2002]● レイトレーシングの GPU 実装● ポリゴンのテクスチャへの格納
  14. 14. GPGPU 黎明期 IIPhoton Mapping on Programmable Graphics Hardware[Percell 2003]● フォトンマッピングの GPU 実装● Bitonic ソートの GPU 実装
  15. 15. GPGPU 黎明期 IIIBuilding a Million Particle System [Latta 2004]● テクスチャパーティクル● ダブルバッファによる時間積分
  16. 16. GPU Gems シリーズ刊行 [2004] [2007] [2005]
  17. 17. 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
  18. 18. 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
  19. 19. 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
  20. 20. 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
  21. 21. 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-Pass GPU Scan Conversion of Tetrahedra
  22. 22. 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 Earths Subsurface Using CUDA● Parallel Prefix Sum (Scan) with CUDA● Incremental Computation of the Gaussian● Using the Geometry Shader for Compact and Variable-Length GPU Feedback
  23. 23. GPGPU アルゴリズム● Map● Reduce● Scatter and Gather● Scan● Stream Filtering● Sort● SearchA Survey of General-Purpose Computationon Graphics Hardware [Owens 2007]
  24. 24. GPGPU のダークサイドグラフィックス API の学習コストが高い● DirectX● OpenGL
  25. 25. CUDA の登場 [2006]● グラフィックス API からの解放
  26. 26. GPU の GPGPU 進化● ユニットの統合 (Unified Shader)● SIMD からスカラーへ● 倍精度浮動小数点数対応
  27. 27. そして DirectCompute へ
  28. 28. GPU プログラミング系譜 DirectXShader Model 1.0 [2000] 汎用 API モデル 2.0 [2002] CUDA [2006] 3.0 [2004] 4.0 [2006] OpenCL [2008] 4.1 [2008] DirectCompute 5.0 [2009]
  29. 29. DirectCompute Introduction
  30. 30. DirectCompute とは● DirectX API による GPGPU サポート● グラフィックスパイプラインとは独立して動作● HLSL で記述 (Compute Shader)● CUDA, OpenCL と同様の思想
  31. 31. 要求環境● Windows7 (Vista SP1 では CS4) Visual C++ 2008, 2010 DirectX SDK (June 2010)● DirectX11 対応ハードウェア (10.1 では CS4) Geforce400系~ RadeonHD5000系~ Intel HD Graphics4000~ (Ivy Bridge)
  32. 32. HLSL● C言語に似た文法● グラフィックス用途の組み込み関数● ShaderModel バージョンにより違い
  33. 33. Shader Model 5.0- GPGPU 拡張● 64bit 浮動小数点演算● 共有メモリの使用 (32KB)● データ構造の追加● アトミック命令, 同期命令
  34. 34. GPU アーキテクチャー Device Multiprocessor Multiprocessor Multiprocessor Multiprocessor Multiprocessor Processor Processor Multiprocessor Multiprocessor Processor Processor Processor Processor Global Memory Shared Memory
  35. 35. スレッドの並列実行 Multiprocessor Multiprocessor 一基で 複数のHW スレッドを実行 Processor Processor Processor Processor Multiprocessor 単位で Processor Processor Shared Memory 一基 Shared Memory
  36. 36. スレッドのグリッドモデルスレッドグループのスレッド数を3次元で指定 Z X スレッド Y スレッドグループ
  37. 37. スレッドとスレッドグループ- Thread and Thread GroupMultiprocessor がスレッドグループを実行Processor がスレッドを実行 Dispatch Multiprocessor Processor Processor Processor Processor Processor Processor
  38. 38. 簡単な Compute ShaderStructuredBuffer<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];}
  39. 39. 簡単なホストプログラムID3D11DeviceContext* dc = デバイスの生成();// まずはシェーダーを設定して...dc->CSSetShader(...);// Fire!!dc->Dispatch(X, Y, Z);
  40. 40. スレッドグループの実行回数Dispatch 関数の引数で指定Dispatch(X, Y, Z) を実行した場合実行スレッドグループ数 = X * Y * Z
  41. 41. スレッドの実行回数[numthread(AX, AY, AZ)]void CSMain() {}のシェーダーをDispatch(BX, BY, BZ)で呼び出した場合実行スレッド数 = 実行スレッドグループ数 * AX*AY*AZ = BX*BY*BZ * AX*AY*AZ
  42. 42. 引数とセマンティクス[numthreads(AX, AY, AZ)]void CSMain(uint3 id : SV_DispatchThreadID)● SV_DispatchThreadID全スレッド内での ID: uint3Dispatch(BX, BY, BZ) の場合の ID は0 <= id.x < AX*BX0 <= id.y < AY*BY0 <= id.z < AZ*BZ
  43. 43. その他の引数セマンティクス● SV_GroupIndexスレッドグループ内での一意の整数値: uint● SV_GroupThreadIDスレッドグループ内での ID: uint3● SV_GroupIDスレッドグループの ID: uint3
  44. 44. 引数の数は自由使用したいものだけ定義すれば OK[numthreads(X, Y, Z)]void CSMain(uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint3 Gid : SV_GroupID, uint Gidx : SV_GroupIndex){ ...}
  45. 45. シェーダーのコンパイル● オフラインコンパイルSDK付属の fxc.exe● ランタイムコンパイルD3DX11CompileFromFile() 関数(d3dx11.dll)
  46. 46. ホストプログラムの流れ シェーダーの読み込み・生成 GPUリソースの生成 GPUリソースの設定 シェーダーの実行
  47. 47. GPU リソース (ID3D11Resource)グローバルメモリに置かれるバッファ● ID3D11Buffer ○ RawBuffer ○ StructuredBuffer ○ ConstantBuffer● ID3D11Texture1D● ID3D11Texture1DArray● ID3D11Texture2D● ID3D11Texture2DArray● ID3D11Texture3D
  48. 48. バッファとテクスチャの違い● テクスチャはサンプラーによるアクセスが可能 サンプラーによる線形補間, 等...● テクスチャはミップマップが使用可能
  49. 49. GPU リソースビューシェーダーからリソースがどのように扱われるか● ID3D11ShaderResourceView (SRV)読み込み専用バッファ● ID3D11UnorderedAccessView (UAV)読み込み・書き込みバッファ
  50. 50. リソースとビューの関係 Texture Buffer UAV SRV UAV Shader A Shader B
  51. 51. リソースの設定● CSSetShaderResourceViews()スロットを指定して SRV を設定● CSSetUnorderedAccessViews()スロットを指定して UAV を設定
  52. 52. 定数バッファシェーダー定数として扱われるバッファアクセスが高速● CSSetConstantBuffers()スロットを指定して定数バッファを設定
  53. 53. シェーダーからのアクセスStructuredBuffer<float> A : register(t0); // SRVStructuredBuffer<float> B : register(t1); // SRVRWStructuredBuffer<float> O : register(u0); // UAVcbuffer C : register(b0) { // 定数バッファ float4 Vector; float4x4 Matrix;}register(...) でスロット番号を指定
  54. 54. シェーダーでのリソース種別Read Only Read/Write● Texture1D ● RWTexture1D● Texture1DArray ● RWTexture1DArray● Texture2D ● RWTexture2D● Texture2DArray ● RWTexture2DArray● Texture3D ● RWTexture3D● StructuredBuffer ● RWStructuredBuffer● ByteAddressBuffer ● RWByteAddressBuffer
  55. 55. 動的バッファ(擬似)のサポート● AppendStructuredBufferバッファの最後に値を追加● ConsumeStructuredBufferバッファの最後から値を取得・削除内部で同期を取ってくれる
  56. 56. 共有メモリへのアクセス共有メモリの宣言groupshared float Shared[SIZE];● ソフトウェアキャッシュとして機能● 同期命令の GroupMemoryBarrierWithGroupSync() と一緒に扱うことが多い
  57. 57. メモリアクセス 高速!! スコープ アクセス 場所 共有メモリ スレッドグループ Read/Write on-chip(register) 定数バッファ グローバル Read on-chip(cache) SRV グローバル Read off-chip UAV グローバル Read/Write off-chip
  58. 58. 同期命令● AllMemoryBarrier● AllMemoryBarrierWithGroupSync● DeviceMemoryBarrier● DeviceMemoryBarrierWithGroupSync● GroupMemoryBarrier● GroupMemoryBarrierWithGroupSync
  59. 59. アトミック命令● InterlockedAdd● InterlockedExchange● InterlockedCompareExchange● InterlockedAnd● InterlockedOr● InterlockedXor● etc...
  60. 60. パフォーマンス● GPU から CPU への WriteBack は注意● GPU のメモリ内容を利用する関数の使用DispatchIndirect(ID3D11Buffer*, offset)GPU のメモリ内容を関数の引数として利用
  61. 61. GPU デバッガ● PIX (SDK 付属)公式のくせに DirectX11 にほとんど対応してない● NVidia NsightNVIdia GPU 用● AMD GPU PerfStudio2AMD GPU 用
  62. 62. その他諸々?● DirectX なので API に癖がある 計算のみにも使用できるがそれなら CUDA の方が..● Windows 環境のみでしか動かない● グラフィックスパイプラインに味付けする役割?● 可視化まで含めたリアルタイムシミュレーション においては一日の長あり
  63. 63. DirectX SDK付属サンプル一部紹介● BasicCompute11 配列同士の加算処理● ComputeShaderSort11 Bitonic ソート● NBodyGravityCS11 3D N体問題● FluidCS11 2D 流体シミュレーション (SPH)
  64. 64. 参考文献Practical Rendering& Computationwith Direct3D11
  65. 65. まとめ● DirectCompute は CUDA, OpenCL と同様 GPGPU 環境を提供する● DirectX グラフィックスパイプラインとの 親和性が高いため可視化に有利
  66. 66. Enjoy GPGPU!!

×