CUDA-приложения перестают работать через несколько секунд - как обойти это? - PullRequest
30 голосов
/ 31 января 2009

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

Ответы [ 8 ]

26 голосов
/ 03 февраля 2009

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

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

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

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

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

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

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

[РЕДАКТИРОВАТЬ в марте 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

[РЕДАКТИРОВАТЬ Апр 2015 для обновления: ] Это становится действительно устаревшим. Самый простой способ отключить TDR для программирования на Cuda, если у вас установлены инструменты NVIDIA Nsight, - это открыть Nsight Monitor, нажать «Параметры Nsight Monitor» и в разделе «Общие» установить «WDDM TDR enabled» на false. Это изменит настройки реестра для вас. Закройте и перезагрузите. Любые изменения в параметре реестра TDR не вступят в силу до перезагрузки.

[РЕДАКТИРОВАТЬ Август 2018 для обновления:] Хотя инструменты NVIDIA теперь позволяют отключать TDR, этот же вопрос актуален для разработчиков AMD / OpenCL. Для тех: текущая ссылка, которая документирует настройки TDR на https://docs.microsoft.com/en-us/windows-hardware/drivers/display/tdr-registry-keys

10 голосов
/ 31 января 2009

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

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

8 голосов
/ 09 июня 2013

Разрешение обнаружения и восстановления тайм-аута - 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 - в Windows это автоматически 2 (даже хотя рег. значение ключа не существует> пока вы его не создадите). приписывать это с новым значением (я пробовал 4 секунды), что удваивает время до TDR. Затем перезагрузите компьютер. Вам нужно перезагрузить компьютер, прежде чем значение будет работа.

Источник от Win7 TDR (Обнаружение и восстановление времени ожидания драйвера) Я также проверил это и работает нормально.

5 голосов
/ 31 января 2009

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

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

5 голосов
/ 31 января 2009

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

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

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

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

3 голосов
/ 31 августа 2010

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

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

3 голосов
/ 25 июля 2009

Решение, которое я использую:

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

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

2 голосов
/ 20 ноября 2012

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

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

Добавление: опция «Интерактивный» «0» в разделе устройств вашего графического процессора делает эту работу.

см. CUDA Visual Profiler «Интерактивный» параметр X config?

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

и

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

Для описания параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...