使用双精度时,CreateComputeShader返回E_INVALIDARG

时间:2015-07-11 17:55:02

标签: c++ gpgpu direct3d hlsl direct3d11

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

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

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

这是驱动程序错误,还是我缺少的东西?

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

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

1 个答案:

答案 0 :(得分:2)

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

  • dadd - 加法/否定/减法
  • deqdgedltdne - 比较
  • dmax - Max
  • dmin - 敏
  • dmovdmovc - 移动
  • dmul - 乘以
  • dtofftod - 转化双< - >浮

您需要查看D3D11_FEATURE_DATA_D3D11_OPTIONS.ExtendedDoublesShaderInstructions,其中包含以上所有内容:

  • dfma - 融合乘法加法
  • ddiv - 分部
  • drcp - Reciprocal

Shader Model 5 Assembly

RE:DirectX 11.1

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

DirectX 11.1 and Windows 7 Update
DirectX 11.1 and Windows 7