计算着色器概述
计算着色器是一个可编程着色器阶段,它使 Microsoft Direct3D 11 扩展到图形编程之外。 计算着色器技术也称为 DirectCompute 技术。
与其他可编程着色器 (顶点着色器和几何图形着色器(例如) )一样,计算着色器是使用 HLSL 设计和实现的,但这正好是相似性结束的地方。 计算着色器提供常规目的的高速计算并利用图形处理单元 (GPU) 上的大量并行处理器。 计算着色器提供内存共享和线程同步功能,允许采用更有效的并行编程方法。 调用 ID3D11DeviceContext::D ispatch 或 ID3D11DeviceContext::D ispatchIndirect 方法以在计算着色器中执行命令。 计算着色器可以在多个线程上并行运行。
在 Direct3D 10.x 硬件上使用计算着色器
Microsoft Direct3D 10 上的计算着色器也称为 DirectCompute 4.x。
如果使用 Direct3D 11 API 和更新的驱动程序, 功能级别 10 和 10.1 Direct3D 硬件可以选择性地支持使用cs_4_0和cs_4_1 配置文件的有限形式的 DirectCompute。 在此硬件上使用 DirectCompute 时,请记住以下限制:
- 每个组的最大线程数限制为 D3D11_CS_4_X_THREAD_GROUP_MAX_THREADS_PER_GROUP (768) 。
- numthreads 的 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) 。
- 只有 RWStructuredBuffer和 RWByteAddressBuffer作为无序访问视图提供。
- 尽管线程可以从任何位置读取,但线程只能访问组共享内存中自己的区域进行写入。
- 访问组共享的内存进行写入时,必须使用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) 。
- 支持 RWStructuredBuffer、 RWByteAddressBuffer和类型化无序访问视图 (RWTexture1D、 RWTexture2D、 RWTexture3D 等) 。
- 原子指令可用。
- 可能会提供双精度支持。 有关如何确定双精度是否可用的信息,请参阅 D3D11_FEATURE_DOUBLES。
在本节中
主题 | 说明 |
---|---|
新资源类型 |
Direct3D 11 中添加了几个新的资源类型。 |
访问资源 |
可通过多种方式访问 资源。 |
原子函数 |
若要访问新的资源类型或共享内存,请使用互锁的内部函数。 互锁函数保证以原子方式运行。 也就是说,它们保证按编程顺序发生。 本部分列出了原子函数。 |