设备执行其命令花费了不合理的时间

Device took an unreasonable amount of time to execute its commands

我正在将 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 ERROR: ID3D11Device::RemoveDevice: Device removal has been triggered for the following reason (DXGI_ERROR_DEVICE_HUNG: The Device took an unreasonable amount of time to execute its commands, or the hardware crashed/hung. As a result, the TDR (Timeout Detection and Recovery) mechanism has been triggered. The current Device Context was executing commands when the hang occurred. The application may want to respawn and fallback to less aggressive use of the display hardware). EXECUTION ERROR #378: DEVICE_REMOVAL_PROCESS_AT_FAULT]

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

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

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

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

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

感谢任何帮助。

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

Microsoft Docs

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

您可以通过 KB2670838

在 Windows 7 Service Pack 1 上安装部分版本的 DirectX 11.1

You should also read this blog post for more up-to-date information about the legacy DirectX SDK.

UPDATE 显然这实际上是旧版 DirectX SDK 的 HLSL 编译器错误。请注意,您可以而且应该使用最新的 Windows 10 SDK HLSL 编译器,即使是 Windows 7 上的 DirectX 11。参见 this blog post and Microsoft Docs

自己回答:

我将我的电脑升级到 Win10,其中包括 DirectX12。现在源代码按预期工作。这确认 2010 年 6 月的编译器存在错误。