Подтвердить что ты не робот

Время ожидания приложений CUDA и отказ через несколько секунд - как обойти это?

Я заметил, что приложения CUDA имеют приблизительное максимальное время выполнения 5-15 секунд, прежде чем они потерпят неудачу и выйдут. Я понимаю, что идеально, чтобы приложение CUDA не выполнялось так долго, но предполагая, что это правильный выбор для использования CUDA, и из-за количества последовательной работы в потоке он должен длиться так долго, есть ли способ продлить это время или обойти его?

4b9b3361

Ответ 1

Я не эксперт CUDA, --- я развивался с помощью AMD Stream SDK, который AFAIK примерно сопоставим.

Вы можете отключить сторожевой таймер Windows, но это сильно не рекомендуется, по причинам, которые должны быть очевидны. Чтобы отключить его, вам необходимо выполнить regedit HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Watchdog\Display\DisableBugCheck, создать REG_DWORD и установить его в 1. Возможно, вам также понадобится сделать что-то в панели управления NVidia. Посмотрите ссылку на "Восстановление VPU" в документах CUDA.

В идеале вы должны иметь возможность разбить свои операции с ядром на несколько проходов над вашими данными, чтобы разбить его на операции, выполняемые в течение срока.

В качестве альтернативы вы можете разделить домен проблемы вверх так, чтобы он вычислял меньше выходных пикселей на команду. I.e. Вместо того, чтобы вычислить 1 000 000 пикселей вывода одним махом, выдайте 10 команд для gpu для вычисления 100 000 каждый.

Базовый блок, который должен входить в срез времени, - это не ваше приложение, а исполнение одного командного буфера. В SDK AMD Stream длинная последовательность операций может быть разбита на несколько временных фрагментов, явно промывая очередь команд вызовом CtxFlush(). Возможно, у CUDA есть что-то подобное?

Вам следует не читать все ваши данные взад и вперед по шине PCIX на каждом временном фрагменте; вы можете оставить свои текстуры и т.д. в локальной памяти gpu; у вас просто есть несколько командных буферов, иногда, чтобы доказать ОС, что вы не застреваете в бесконечном цикле.

Наконец, графические процессоры бывают быстрыми, поэтому, если ваше приложение не сможет выполнить полезную работу за 5 или 10 секунд, я бы воспринял это как признак того, что что-то не так.

[EDIT Mar 2010 для обновления:]. Приведенный выше раздел реестра устарел. Я думаю, что это был ключ для 64-битной Windows XP. Появились новые ключи реестра для Vista и Windows 7. Их можно найти здесь: http://www.microsoft.com/whdc/device/display/wddm_timeout.mspx или здесь: http://msdn.microsoft.com/en-us/library/ee817001.aspx

[EDIT Apr 2015 для обновления:] Это действительно устарело. Самый простой способ отключить TDR для программирования Cuda, если у вас установлены инструменты NVIDIA Nsight, - открыть Nsight Monitor, щелкнуть "Параметры монитора Nsight", а в разделе "Общие" установить "WDDM TDR enabled" значение false. Это изменит настройку реестра для вас. Закройте и перезагрузите компьютер. Любое изменение параметра реестра TDR не вступит в силу до перезагрузки.

Ответ 2

В Windows графический драйвер имеет сторожевой таймер, который убивает любые шейдерные программы, которые работают более 5 секунд. Обратите внимание, что драйверы Xorg/XFree86 этого не делают, поэтому одним из возможных решений является запуск приложений CUDA в Linux.

AFAIK невозможно отключить сторожевой таймер в Windows. Единственный способ обойти это в Windows - использовать вторую карту, на которой нет отображаемых экранов. Это не должно быть Tesla, но у него не должно быть активных экранов.

Ответ 3

Разрешить обнаружение и восстановление таймаута - WINDOWS 7 (32/64 бит)

Создайте раздел реестра в Windows, чтобы изменить настройки TDR на более высокая сумма, так что Windows позволит дольше задерживать Процесс TDR начинается.

Откройте Regedit из Run или DOS.

В Windows 7 перейдите к правильной области раздела реестра, чтобы создать новый ключ:

HKEY_LOCAL_MACHINE > SYSTEM > CurrentControlSet > Control > GraphicsDrivers.

Там, вероятно, будет один ключ, называемый DxgKrnlVersion, как DWord.

Щелкните правой кнопкой мыши и выберите, чтобы создать новый ключ REG_DWORD, и назовите его TdrDelay. Значением, назначенным ему, является количество секунд до TDR срабатывает - он > в настоящее время 2 автоматически в Windows (даже хотя рег. ключевое значение не существует > , пока вы его не создадите). приписывать он с новым значением (я пробовал 4 секунды), что удваивает время до TDR. Затем перезагрузите компьютер. Вам необходимо перезагрузить ПК, прежде чем значение будет работа.

Источник из TDR T7 (обнаружение и восстановление тайм-аута драйверов) Я также проверил это и прекрасно работает.

Ответ 4

Самое основное решение - выбрать точку в вычислении некоторого процента пути, благодаря чему я уверен, что графический процессор, с которым я работаю, способен завершить во времени, сохранить всю информацию о состоянии и остановиться, а затем начать снова.

Обновление: Для Linux: выход из X позволит вам запускать приложения CUDA столько, сколько захотите. Нет необходимости в Tesla (при тестировании использовался 9600)

Однако следует отметить, что если X никогда не вводится, драйверы, вероятно, не будут загружены, и это не сработает.

Также кажется, что для Linux просто не будет отображаться X-дисплеев в то время, так что X не нужно выходить, пока вы просматриваете не-X полноэкранный терминал.

Ответ 5

Это невозможно. Тайм-аут там, чтобы предотвратить ошибки в вычислениях от захвата GPU в течение длительных периодов времени.

Если вы используете выделенную карту для работы CUDA, срок приостанавливается. Я не уверен, что для этого требуется карта Tesla, или если GeForce без подключенного монитора может быть использована.

Ответ 6

Я использую следующее решение:

1. Передайте всю информацию на устройство.
2. Запустите итеративные версии алгоритмов, где каждая итерация вызывает ядро ​​в памяти, уже сохраненной в устройстве.
3. Наконец, передача памяти на хост только после завершения всех итераций.

Это позволяет контролировать итерации от CPU (включая опцию прерывания), без дорогостоящей передачи памяти хоста устройства между итерациями.

Ответ 7

Контрольный таймер применяется только к графическим процессорам с подключенным дисплеем.

В Windows таймер является частью WDDM, можно изменить настройки (время ожидания, поведение при достижении таймаута и т.д.) с помощью некоторых разделов реестра, см. это статью Microsoft для получения дополнительной информации.

Ответ 8

В Linux можно отключить это поведение. Хотя "сторожевой таймер" имеет очевидную цель, он может вызвать некоторые очень неожиданные результаты при выполнении обширных вычислений с использованием шейдеров /CUDA.

Опция может быть переключена в вашей X-конфигурации (вероятно,/etc/X11/xorg.conf)

Добавление: опция "Интерактивная" "0" в разделе устройства вашего GPU выполняет задание.

см. вариант конфигурации CUDA Visual Profiler 'Interactive' X

Подробнее о конфигурации

и

см. ftp://download.nvidia.com/XFree86/Linux-x86/270.41.06/README/xconfigoptions.html#Interactive

Описание параметра.