0

我正在将 C 代码移植到 HLSL(计算着色器)。编译器对其中一个 for 循环很着迷。在运行时,显示设备驱动程序检测到执行代码的时间不合理。

这是带有违规 for 循环的部分源代码:

P = FloatToAsciiNoExponent(F * Factor, DstBuf, 7);
uint TmpBuf[FTOA_BUFFER_SIZE];
uint BytesWritten = IntToAscii(Exp10, TmpBuf, BASE10);
DstBuf[P++] = 'E';
[fastopt]
for (uint I = 0; I < BytesWritten; I++)
    DstBuf[P++] = TmpBuf[I];

在运行时,我收到以下调试消息:

D3D11 错误:ID3D11Device::RemoveDevice:设备删除已被触发,原因如下(DXGI_ERROR_DEVICE_HUNG:设备执行其命令的时间不合理,或硬件崩溃/挂起。因此,TDR(超时检测和恢复)机制已被触发。当前的设备上下文在挂起发生时正在执行命令。应用程序可能希望重新生成并回退到不太积极地使用显示硬件)。执行错误 #378:DEVICE_REMOVAL_PROCESS_AT_FAULT]

如果我注释掉这两个 for 循环行,一切都很好(当然除了最后一部分缺少他的最后一部分的最终结果)。

FloatToAsciiNoExponent()是将他的第一个参数转换为存储在第二个参数(uint 数组)中的列表或 ascii 代码的函数。最后一个参数是转换的计数基数。它已经过验证。

IntToAscii()是将他的第一个参数转换为存储在第二个参数(uint 数组)中的 ascii 代码列表的函数。它已经过验证。

我移植的原始 C 源代码可以在这里找到:https ://searchcode.com/codesearch/view/14753060/

我在 Windows 7 和 2010 年 6 月的 DirectX SDK 上运行(最后一个在 Windows 7 上运行)。已执行 Windows 更新并安装了每个更新。显卡是 NVidia Quadro K4200,具有 24GB RAM,驱动程序版本为 431.02。

任何帮助表示赞赏。

4

2 回答 2

1

使用 DirectCompute,您仍然需要确保每个实例在合理的时间内完成,否则您将遇到 TDR 超时(约 2 秒)。

请参阅Microsoft 文档

使用 DirectX 11.1(Windows 8 或更高版本),您可以D3D11_CREATE_DEVICE_DISABLE_GPU_TIMEOUT为长时间运行的 DirectCompute 着色器提供更多时间,但您可以使系统无响应。

您可以通过KB2670838在 Windows 7 Service Pack 1 上安装 DirectX 11.1 的部分版本

您还应该阅读这篇博文,了解有关旧版 DirectX SDK 的更多最新信息。

更新显然,这实际上是旧版 DirectX SDK 的 HLSL 编译器错误。请注意,即使是 Windows 7 上的 DirectX 11,您也可以并且应该使用最新的 Windows 10 SDK HLSL 编译器。请参阅此博客文章Microsoft Docs

于 2019-08-27T17:37:24.893 回答
1

回答我自己:

我将我的 PC 升级到包含 DirectX12 的 Win10。现在源代码按预期工作。这证实了 2010 年 6 月的编译器存在错误。

于 2019-09-05T05:49:09.973 回答