Я портирую код 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 (Timeout Detection and Recovery) был запущен. Текущий контекст устройства выполнял команды, когда произошло зависание. Приложение может захотеть возродиться и вернуться к менее агрессивному использованию оборудования дисплея). ОШИБКА ВЫПОЛНЕНИЯ № 378: DEVICE_REMOVAL_PROCESS_AT_FAULT]
Если я закомментирую две строки цикла for, все в порядке (кроме, конечно, окончательного результата, в котором отсутствует его последняя часть).
FloatToAsciiNoExponent()
- это функция, которая преобразует его первый аргумент в список или код ascii, хранящийся во втором аргументе (массив uint). Последний аргумент - это база счисления для преобразования. Это было подтверждено.
IntToAscii()
- это функция, преобразующая его первый аргумент в список кода ascii, хранящийся во втором аргументе (массив uint). Это было подтверждено.
Исходный исходный код C, который я портирую, можно найти здесь: https://searchcode.com/codesearch/view/14753060/
Я использую Windows 7 и DirectX SDK от июня 2010 года (последний работает в Windows 7). Обновление Windows выполнено, и все обновления установлены. Графическая карта представляет собой NVidia Quadro K4200 с 24 ГБ оперативной памяти с версией драйвера 431.02.
Любая помощь приветствуется.