CreateComputeShader returns E_INVALIDARG 使用双打时

CreateComputeShader returns E_INVALIDARG when using doubles

我需要使用 DirectCompute 进行某些 GPGPU 计算的双精度。当我把所有东西都变成浮点数时,着色器编译并运行得很好。但是,当我尝试在我的着色器中的任何地方使用双打时,它会编译,但在运行时调用 ID3D11Device::CreateComputeShader() 失败并返回 E_INVALIDARG。 C++ 端代码完全相同,请注意,我只是将着色器中的几个变量更改为 double。

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

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

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

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

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

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

  • dadd - Addition/Negation/Subtraction
  • deqdgedltdne-比较
  • dmax - 最大值
  • dmin - 最小值
  • dmov, dmovc - 移动
  • dmul - 乘
  • dtof, ftod - 转换双精度 <-> 浮点数

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

  • dfma - 融合乘加
  • ddiv - 分区
  • drcp - 倒数

Shader Model 5 Assembly

回复:DirectX 11.1

D3D11_FEATURE_DATA_D3D11_OPTIONS.ExtendedDoublesShaderInstructions 是 DirectX 11.1 API 的一部分,是一项需要 WDDM 1.2 驱动程序的硬件功能。因此,根据 Microsoft Docs, even with the DirectX 11.1 runtime installed on Windows 7 via KB2670838 此硬件功能要求 Windows 8 或更高版本为真。

DirectX 11.1 and Windows 7 Update
DirectX 11.1 and Windows 7