計算著色器概觀
計算著色器是一個可程式化著色器階段,將 Microsoft Direct3D 11 的應用擴展至超越圖形程序設計。 計算著色器技術也稱為 DirectCompute 技術。
如同其他可程式化著色器(例如頂點和幾何著色器),計算著色器是使用 HLSL 來設計及實作,但這只是相似性結束的地方。 計算著色器提供高速一般用途運算,並利用圖形處理單元 (GPU) 上的大量平行處理器。 計算著色器提供記憶體共用和線程同步處理功能,以允許更有效率的平行程序設計方法。 您呼叫 ID3D11DeviceContext::Dispatch 或 ID3D11DeviceContext::DispatchIndirect 方法來在計算著色器中執行命令。 計算著色器可以在許多線程上平行執行。
在 Direct3D 10.x 硬體上使用計算著色器
Microsoft Direct3D 10 上的計算著色器也稱為 DirectCompute 4.x。
如果您使用 Direct3D 11 API 和更新的驅動程式,功能層級 10 和 10.1 的 Direct3D 硬體可以選擇支援一種有限的 DirectCompute 形式,此形式使用 cs_4_0 和 cs_4_1 設置檔,。 當您在此硬體上使用 DirectCompute 時,請記住下列限制:
- 線程數目上限限制為每個群組D3D11_CS_4_X_THREAD_GROUP_MAX_THREADS_PER_GROUP (768)。
- 的 X 和 Y 維度僅限於D3D11_CS_4_X_THREAD_GROUP_MAX_X (768) 和 D3D11_CS_4_X_THREAD_GROUP_MAX_Y (768)。
- numthreads 的 Z 維度限制為 1。
- 發派作業的 Z 維度受到 D3D11_CS_4_X_DISPATCH_MAX_THREAD_GROUPS_IN_Z_DIMENSION (1) 的限制。
- 只有一個未排序的存取檢視可以綁定至著色器(D3D11_CS_4_X_UAV_REGISTER_COUNT為 1)。
- 只有 RWStructuredBuffers 和 RWByteAddressBuffers 可作為未排序存取檢視。
- 線程只能在群組共用記憶體中存取自己的區域以進行寫入,不過它可以從任何位置讀取。
- 存取 群組共用 記憶體以進行寫入時,必須使用 SV_GroupIndex 或 SV_GroupThreadID。
- 群組共用 記憶體限制為每個群組 16KB。
- 單一線程限制為 群組共用 記憶體的 256 個字節區域,以供寫入。
- 沒有原子指令可供使用。
- 沒有雙精確度值可供使用。
在 Direct3D 11.x 硬體上使用計算著色器
Direct3D 11 上的計算著色器也稱為 DirectCompute 5.0。
當您使用 DirectCompute 搭配 cs_5_0 設定檔時,請記住下列事項:
- 每個群組的線程數目上限限制為D3D11_CS_THREAD_GROUP_MAX_THREADS_PER_GROUP (1024)。
- numthreads 的 X 和 Y 維度僅限於D3D11_CS_THREAD_GROUP_MAX_X (1024) 和 D3D11_CS_THREAD_GROUP_MAX_Y (1024)。
- numthreads 的 Z 維度限制為 D3D11_CS_THREAD_GROUP_MAX_Z (64)。
- 分派的最大維度限制為D3D11_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION(65535)。
- 可綁定至著色器的最大非排序存取視圖數量為 D3D11_PS_CS_UAV_REGISTER_COUNT (8)。
- 支援 RWStructuredBuffers、RWByteAddressBuffers 和具類型的無序存取視圖(RWTexture1D、RWTexture2D、RWTexture3D,等等)。
- 原子指令是可用的。
- 可能會提供雙精確度支援。 如需如何判斷雙精確度是否可用的詳細資訊,請參閱 D3D11_FEATURE_DOUBLES。
在本節中
主題 | 描述 |
---|---|
新的資源類型 |
Direct3D 11 已新增數個新的資源類型。 |
存取資源 |
有數種方式可以存取 資源。 |
原子函式 |
若要存取新的資源類型或共用記憶體,請使用內建函數。 保證互鎖功能將會以原子操作的方式運作。 也就是說,它們保證會按照程序設計的順序進行。 本節列出原子性函式。 |