CreateComputeShader 使用 double 时返回 E_INVALIDARG

Nmd*_*ery 5 c++ direct3d gpgpu hlsl direct3d11

对于使用 DirectCompute 的某些 GPGPU 计算,我需要双精度。当我将所有内容都设置为浮点数时,着色器将编译并运行得很好。但是,当我尝试在我的着色器中的任何地方使用 doubles 时,它会编译,但ID3D11Device::CreateComputeShader()在运行时调用失败并显示E_INVALIDARG. C++ 端代码完全相同,请注意,我刚刚将着色器中的一些变量更改为两倍。

当我调用ID3D11Device::CheckFeatureSupport()D3D11_FEATURE_DOUBLES,它报告说我的适配器支持双倍,这是 AMD Radeon R9 270x。根据一些谷歌搜索,AMD 卡实际上非常擅长双精度计算 - IE,我的卡可以使用双精度,但 DirectX 似乎不想让我这样做。

我想也许 DirectCompute 没有这种能力(这很奇怪,因为很多科学的 GPGPU 进程需要双打),所以我尝试使用像素着色器。同样的事情发生。

这是驱动程序错误,还是我遗漏了什么?

编辑:我刚刚搜索了最新的 Catalyst 驱动程序,显然我支持几个版本。这很有趣,考虑到我最近去过控制中心并检查了几次更新。我要更新,看看会发生什么。

EDIT2:更新没有效果。要么我做错了什么,要么 DirectX 有各种各样的错误。

Chu*_*urn 3

基本双精度着色器模型 5.0 支持(如 所示)D3D11_FEATURE_DOUBLES仅包括对以下操作的支持:

  • dadd- 加法/求反/减法
  • deqdgedltdne- 比较
  • dmax- 最大限度
  • dmin- 最小
  • dmov, dmovc- 移动
  • dmul- 乘法
  • dtof, ftod- 转换 double <-> float

您需要检查D3D11_FEATURE_DATA_D3D11_OPTIONS.ExtendedDoublesShaderInstructions其中包括上述所有内容以及:

  • dfma- 融合乘加
  • ddiv- 分配
  • drcp- 互惠的

着色器模型 5 组件

回复:DirectX 11.1

D3D11_FEATURE_DATA_D3D11_OPTIONS.ExtendedDoublesShaderInstructions是 DirectX 11.1 API 的一部分,并且是需要 WDDM 1.2 驱动程序的硬件功能。因此,根据Microsoft Docs,即使通过KB2670838在 Windows 7 上安装了 DirectX 11.1 运行时,此硬件功能也需要 Windows 8 或更高版本为 TRUE。

DirectX 11.1 和 Windows 7 更新
DirectX 11.1 和 Windows 7