Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Directx 设备花费了不合理的时间来执行其命令_Directx_Shader_Hlsl_Directcompute - Fatal编程技术网

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

Directx 设备花费了不合理的时间来执行其命令,directx,shader,hlsl,directcompute,Directx,Shader,Hlsl,Directcompute,我正在将C代码移植到HLSL(计算着色器)。 编译器疯狂地使用其中一个for循环。在运行时,显示设备驱动程序检测到执行代码的时间不合理 以下是部分源代码,其中包含有问题的for循环: P = FloatToAsciiNoExponent(F * Factor, DstBuf, 7); uint TmpBuf[FTOA_BUFFER_SIZE]; uint BytesWritten = IntToAscii(Exp10, TmpBuf, BASE10); DstBuf[P++] = 'E'; [f

我正在将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];
P=floatToAsciino指数(F*因子,DstBuf,7);
uint TmpBuf[FTOA_缓冲区_大小];
uint bytesWrite=IntToAscii(Exp10,TmpBuf,BASE10);
DstBuf[P++]='E';
[快速选择]
对于(uint I=0;I
在运行时,我收到以下调试消息:

D3D11错误:ID3D11Device::RemoveDevice:已删除设备 由于以下原因触发(DXGI\u错误\u设备\u挂起:设备 执行其命令花费了不合理的时间,或者 硬件崩溃/挂起。因此,TDR(超时检测和 已触发恢复)机制。当前设备上下文为 发生挂起时正在执行命令。应用程序可能希望 恢复并退回到显示硬件的不太激进的使用)。 执行错误#378:设备_移除_进程_故障]

如果我把这两条for循环线注释掉,一切都没问题(当然,除了缺少最后一部分的最终结果)

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

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

我移植的原始C源代码可以在这里找到:

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


感谢您的帮助。

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

使用DirectX 11.1(Windows 8或更高版本),您可以使用
D3D11\u创建\u设备\u禁用\u GPU\u超时
为长时间运行的DirectCompute着色器提供多一点时间,但也可以使系统无响应

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

您还应该阅读以了解有关旧版DirectX SDK的更多最新信息


更新显然,这实际上是一个遗留DirectX SDK的HLSL编译器错误。请注意,即使对于Windows 7上的DirectX 11,您也可以而且应该使用最新的Windows 10 SDK HLSL编译器。请参阅和。

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

使用DirectX 11.1(Windows 8或更高版本),您可以使用
D3D11\u创建\u设备\u禁用\u GPU\u超时
为长时间运行的DirectCompute着色器提供多一点时间,但也可以使系统无响应

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

您还应该阅读以了解有关旧版DirectX SDK的更多最新信息

更新显然,这实际上是一个遗留DirectX SDK的HLSL编译器错误。请注意,即使对于Windows 7上的DirectX 11,您也可以而且应该使用最新的Windows 10 SDK HLSL编译器。请参见和。

回答我自己:


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

回答我自己:


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

谢谢。是的,我知道。这不是问题所在。循环中的代码最多执行16次,只是从一个数组到另一个数组的uint副本。没有什么需要花很长时间的。我的猜测是编译器不知何故生成了错误的代码。KB2670838已经安装在我的系统上,正如我所说的,它是一个完全更新的WIN7。我将我的电脑升级到Win10,其中包括DirectX12。现在源代码按预期工作。这确认2010年6月的编译器有错误。谢谢。是的,我知道。这不是问题所在。循环中的代码最多执行16次,只是从一个数组到另一个数组的uint副本。没有什么需要花很长时间的。我的猜测是编译器不知何故生成了错误的代码。KB2670838已经安装在我的系统上,正如我所说的,它是一个完全更新的WIN7。我将我的电脑升级到Win10,其中包括DirectX12。现在源代码按预期工作。这证实了2010年6月的编译器有错误。