Microsoft DirectCompute は、 GPU上で計算カーネルを実行できるようにするアプリケーション プログラミング インターフェイス(API)です。Microsoft のWindows Vista、Windows 7以降のバージョンでサポートされています。DirectCompute はMicrosoft DirectX API コレクションの一部であり、当初はDirect3D 11 APIと共にリリースされましたが、Direct3D 10または Direct3D 11 のいずれかをサポートするグラフィックス処理ユニットで動作します。[ 1 ] DirectCompute API はOpenCL OpenGLおよびCUDA上に実装されています。
コンピュートパイプラインは、コンピュートシェーダーのディスパッチと実行に使用されるグラフィックスパイプラインの一種です。コンピュートパイプラインは、コピーコマンドとコンピュートコマンドのみを記録するように制限されたコンピュートコマンドリストを介して実行されます。コンピュートシェーダーは汎用アルゴリズムと計算に使用され、GPU 上の並列プロセッサを介して実行されます。コンピュートパイプラインによって実行されるこの並列実行モデルは、ディスパッチ、スレッドグループ、およびスレッドに編成されます。ディスパッチはスレッドグループの 3 次元コンテナであり、スレッドグループはスレッドの 3 次元コンテナです。[ 2 ]スレッドグループは、GPU 上でウェーブで実行されます。[ 3 ]
このパイプラインにより、プログラムのコード全体を再構築する必要なく、ワークロードをGPUに簡単に送信できます。[ 4 ]
一般的な計算パイプラインには、入力として読み取り専用のシェーダーリソースビュー、追加のリソース定数用の定数バッファビュー、および出力として順序なしアクセスビューが含まれます。パフォーマンスを向上させるためには、これらのリソースのリソース状態を設定することが重要です。[ 5 ]
計算パイプラインの初期化には、ルートシグネチャの作成、計算シェーダーの読み込み、およびパイプライン状態オブジェクトの作成が含まれます。
// ルート署名を設定しますCD3DX12_VERSIONED_ROOT_SIGNATURE_DESC root_signature_desc {1 、root_parameters 、0 、nullptr};// ルート署名をシリアライズするMicrosoft :: WRL :: ComPtr < ID3DBlob > root_signature_blob { nullptr };Microsoft :: WRL :: ComPtr < ID3DBlob > error_blob { nullptr };D3DX12SerializeVersionedRootSignature (& root_signature_desc 、D3D_ROOT_SIGNATURE_VERSION_1_1 、root_signature_blob.GetAddressOf ( ) 、error_blob.GetAddressOf ( ));// ルート署名を作成するMicrosoft :: WRL :: ComPtr < ID3D12RootSignature > root_signature { nullptr };デバイス-> CreateRootSignature (0 、root_signature_blob -> GetBufferPointer ()、root_signature_blob -> GetBufferSize ()、IID_PPV_ARGS ( root_signature . GetAddressOf ()));// コンピュートシェーダーを読み込むWindows :: WRL :: ComPtr < ID3DBlob > compute_shader { nullptr };D3DReadFileToBlob ( L "C:/path / to/compute/shader" , compute_shader.GetAddressOf ( ));// 計算パイプライン状態オブジェクト (PSO) を作成しますstruct PipelineStateStream {CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATUREルート署名;CD3DX12_PIPELINE_STATE_STREAM_CS compute_shader ;} pipeline_state_stream ;// ルートシグネチャとコンピュートシェーダーをPSOに設定するpipeline_state_stream.root_signature = root_signature.Get ( ) ;pipeline_state_stream.compute_shader = CD3DX12_SHADER_BYTECODE { compute_shader.Get ( ) } ;D3D12_PIPELINE_STATE_STREAM_DESC pipeline_state_stream_desc {sizeof ( PipelineStateStream ), & pipeline_state_stream};// パイプライン状態を作成するデバイス-> CreatePipelineState (& pipeline_state_stream_desc 、IID_PPV_ARGS ( pipeline_state_stream . GetAddressOf ()));計算パイプラインの初期化後、毎フレーム、パイプラインの状態を設定し、計算ルートの署名を設定し、ディスパッチを実行する必要があります。
command_list -> SetPipelineState ( pipeline_state );command_list -> SetComputeRootSignature ( root_signature );command_list -> Dispatch ( groups_x , groups_y , groups_z );