「DirectCompute」の版間の差分
1行目: | 1行目: | ||
− | '''DirectCompute'''(読み:だいれくとこんぴゅーと)とは、[[Windows]]上で[[GPGPU]]を手軽に扱うための[[API]] | + | '''DirectCompute'''(読み:だいれくとこんぴゅーと)とは、[[Windows]]上で[[GPGPU]]を手軽に扱うための[[API]]である。 |
+ | |||
+ | 大雑把にいえば[[GPGPU]]で動かす[[プログラム]]を[[HLSL]]で記述できるというものである。C言語がベースのCUDAやOpenCLなどと異なり、HLSLなのでグラフィックス関係でシェーダーを触っていた人に優しい。 | ||
+ | |||
+ | Direct3Dのコマンドリストに混ぜ込むことができるので、コンピュートシェーダーで計算した結果をレンダリングシェーダーで描画なんてことがシンプルに記述できる。 | ||
[[Windows10]]に追加された[[DirectX Raytracing]]もほぼDirectComputeの拡張のようなものとなっている。 | [[Windows10]]に追加された[[DirectX Raytracing]]もほぼDirectComputeの拡張のようなものとなっている。 | ||
− | == 対応 == | + | ==対応== |
DirectComputeは2008年に[[Windows7]]および[[DirectX11]]で登場したものである。[[シェーダーモデル]]で言えばSM4.1とSM5.0である。なおSM4.1では[[倍精度浮動小数点数]]が使えないという制限がある。 | DirectComputeは2008年に[[Windows7]]および[[DirectX11]]で登場したものである。[[シェーダーモデル]]で言えばSM4.1とSM5.0である。なおSM4.1では[[倍精度浮動小数点数]]が使えないという制限がある。 | ||
9行目: | 13行目: | ||
ただ[[インテル]]や[[NVIDIA]]といったGPUメーカーの[[DirectX11]]対応の動きが非常に遅くDirectX11対応の[[GPU]]が延々と普及しなかった。[[DirectX11]]対応は[[AMD]]は2009年と早かったが、[[NVIDIA]]は2010年、[[インテル]]に至っては2012年まで対応を見送るという状況が続いていた。 | ただ[[インテル]]や[[NVIDIA]]といったGPUメーカーの[[DirectX11]]対応の動きが非常に遅くDirectX11対応の[[GPU]]が延々と普及しなかった。[[DirectX11]]対応は[[AMD]]は2009年と早かったが、[[NVIDIA]]は2010年、[[インテル]]に至っては2012年まで対応を見送るという状況が続いていた。 | ||
各社のDirectX11に対応したGPUをまとめると以下のような感じである。 | 各社のDirectX11に対応したGPUをまとめると以下のような感じである。 | ||
− | * [[Radeon HD 5000系]]以上 | + | |
− | * [[GeForce 400系]]以上 | + | *[[Radeon HD 5000系]]以上 |
− | * [[Intel HD Graphics 4000系]]以上([[Ivy Bridge]]以降) | + | *[[GeForce 400系]]以上 |
+ | *[[Intel HD Graphics 4000系]]以上([[Ivy Bridge]]以降) | ||
そのため[[マイクロソフト]]は[[DirectX10]]にもDirectComputeを追加するという対応をとることとなった。 | そのため[[マイクロソフト]]は[[DirectX10]]にもDirectComputeを追加するという対応をとることとなった。 | ||
− | == 従来のシェーダーとの違い == | + | ==従来のシェーダーとの違い== |
従来型の[[バーテックスシェーダー]]や[[ピクセルシェーダー]]から大きく変わったのは以下の4点である。 | 従来型の[[バーテックスシェーダー]]や[[ピクセルシェーダー]]から大きく変わったのは以下の4点である。 | ||
− | * 64ビット浮動小数点数演算が追加 | + | |
− | * データ構造という概念が追加 | + | *64ビット浮動小数点数演算が追加 |
− | * 共有メモリという概念が追加 | + | *データ構造という概念が追加 |
− | * 排他制御命令と同期制御命令が追加 | + | *共有メモリという概念が追加 |
+ | *排他制御命令と同期制御命令が追加 | ||
最大の変更は「共有メモリ」という概念が登場した点である。 | 最大の変更は「共有メモリ」という概念が登場した点である。 | ||
28行目: | 34行目: | ||
一方、[[コンピュートシェーダー]]では共有メモリを介してシェーダーユニット間で[[データ]]のやり取りができるようになった。つまり[[シェーダーユニット]]をいわゆる[[スレッド]]のように扱えるようになったのである。[[マルチスレッド]]といえば[[排他制御]]と[[同期制御]]なのでそれ用の命令も追加された。大雑把にいえば「ハードウェアスレッド」の誕生である。 | 一方、[[コンピュートシェーダー]]では共有メモリを介してシェーダーユニット間で[[データ]]のやり取りができるようになった。つまり[[シェーダーユニット]]をいわゆる[[スレッド]]のように扱えるようになったのである。[[マルチスレッド]]といえば[[排他制御]]と[[同期制御]]なのでそれ用の命令も追加された。大雑把にいえば「ハードウェアスレッド」の誕生である。 | ||
− | == コンパイル == | + | ==コンパイル== |
事前コンパイル | 事前コンパイル | ||
− | * fxc.exe | + | |
+ | *fxc.exe | ||
実行時コンパイル | 実行時コンパイル | ||
− | |||
− | == 使い方 == | + | *D3DX11CompileFromFile関数 |
+ | |||
+ | ==使い方== | ||
そのうち書く。 | そのうち書く。 | ||
− | == 関連項目 == | + | ==関連項目== |
− | * [[CUDA]] | + | |
− | * [[OpenCL]] | + | *[[CUDA]] |
− | * [[DirectCompute]] | + | *[[OpenCL]] |
− | * [[RenderScript]] | + | *[[DirectCompute]] |
− | * [[Metal]] | + | *[[RenderScript]] |
+ | *[[Metal]] | ||
[[category: GPGPU]] | [[category: GPGPU]] |
2020年6月4日 (木) 10:06時点における最新版
DirectCompute(読み:だいれくとこんぴゅーと)とは、Windows上でGPGPUを手軽に扱うためのAPIである。
大雑把にいえばGPGPUで動かすプログラムをHLSLで記述できるというものである。C言語がベースのCUDAやOpenCLなどと異なり、HLSLなのでグラフィックス関係でシェーダーを触っていた人に優しい。
Direct3Dのコマンドリストに混ぜ込むことができるので、コンピュートシェーダーで計算した結果をレンダリングシェーダーで描画なんてことがシンプルに記述できる。
Windows10に追加されたDirectX RaytracingもほぼDirectComputeの拡張のようなものとなっている。
対応[編集 | ソースを編集]
DirectComputeは2008年にWindows7およびDirectX11で登場したものである。シェーダーモデルで言えばSM4.1とSM5.0である。なおSM4.1では倍精度浮動小数点数が使えないという制限がある。
Windows7は空前の大ヒットで爆発的に普及した。 ただインテルやNVIDIAといったGPUメーカーのDirectX11対応の動きが非常に遅くDirectX11対応のGPUが延々と普及しなかった。DirectX11対応はAMDは2009年と早かったが、NVIDIAは2010年、インテルに至っては2012年まで対応を見送るという状況が続いていた。 各社のDirectX11に対応したGPUをまとめると以下のような感じである。
そのためマイクロソフトはDirectX10にもDirectComputeを追加するという対応をとることとなった。
従来のシェーダーとの違い[編集 | ソースを編集]
従来型のバーテックスシェーダーやピクセルシェーダーから大きく変わったのは以下の4点である。
- 64ビット浮動小数点数演算が追加
- データ構造という概念が追加
- 共有メモリという概念が追加
- 排他制御命令と同期制御命令が追加
最大の変更は「共有メモリ」という概念が登場した点である。
従来であればシェーダーユニットは完全に孤立したものであり演算開始から演算終了まで外界とは一切の連絡を取らないという仕様であった。これはその手段を奪うことで余計なことを考えず高速化が実現できるという設計思想である。
一方、コンピュートシェーダーでは共有メモリを介してシェーダーユニット間でデータのやり取りができるようになった。つまりシェーダーユニットをいわゆるスレッドのように扱えるようになったのである。マルチスレッドといえば排他制御と同期制御なのでそれ用の命令も追加された。大雑把にいえば「ハードウェアスレッド」の誕生である。
コンパイル[編集 | ソースを編集]
事前コンパイル
- fxc.exe
実行時コンパイル
- D3DX11CompileFromFile関数
使い方[編集 | ソースを編集]
そのうち書く。