我需要使用DirectCompute进行一些GPGPU计算的双精度.当我将所有东西都变成浮点数时,着色器会编译并运行得很好.但是,当我尝试在着色器中的任何地方使用双精度数时,它将进行编译,但在运行时调用ID3D11Device :: CreateComputeShader()会失败,并带有E_INVALIDARG. C端代码完全相同,请注意,我刚刚将着色器中的一些变量更改为double.
当我用D3D11_FEATURE_DOUBLES调用ID3D11Device :: CheckFeatureSupport()时,它报告我的适配器支持双打,这是AMD Radeon R9 270x.根据谷歌的一些搜索,AMD卡在双精度计算方面实际上非常出色 – IE,我的卡可以使用双打,但DirectX似乎不想让我这样做.
我认为也许DirectCompute没有这种能力(这很奇怪,因为许多科学的GPGPU进程需要双倍),所以我尝试使用像素着色器.同样的事情发生了.
这是一个驱动程序错误,还是我缺少的东西?
编辑:我刚刚搜索了最新的Catalyst驱动程序,显然我已经落后于几个版本.考虑到我最近去控制中心并多次检查更新,这很有意思.我要更新,看看会发生什么.
EDIT2:更新无效.要么我做错了,要么DirectX有各种各样的错误.
最佳答案 D3D11_FEATURE_DOUBLES指示的基本双精度着色器模型5.0支持仅包括对以下操作的支持:
> dadd – 加法/否定/减法
> deq,dge,dlt,dne-比较
> dmax – 最大
> dmin – Min
> dmov,dmovc – 移动
> dmul – 乘法
> dtof,ftod – 转换双< – >浮动
您需要检查D3D11_FEATURE_DATA_D3D11_OPTIONS.ExtendedDoublesShaderInstructions,其中包括以上所有以及:
> dfma – 融合乘法加法
> ddiv – 分部
> drcp – 互惠
RE:DirectX 11.1
D3D11_FEATURE_DATA_D3D11_OPTIONS.ExtendedDoublesShaderInstructions是DirectX 11.1 API的一部分,是一项需要WDDM 1.2驱动程序的硬件功能.因此,根据MSDN,即使通过KB2670838在Windows 7上安装了DirectX 11.1运行时,此硬件功能也需要Windows 8或更高版本为TRUE.