2009-01-30 1 views
28

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

ответ

5

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

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

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

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

+0

Если вы не загружаете X, вы можете использовать скрипт для загрузки драйвера CUDA. Ознакомьтесь с руководством по началу работы (http://developer.download.nvidia.com/compute/cuda/3_2_prod/docs/Getting_Started_Linux.pdf) для получения дополнительной информации. – Tom

5

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

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

+0

Было бы полезно определить, в каком из этих случаев. Мне нужно попробовать карту не-тесла без монитора и узнать. – rck

+2

Я просто попробовал это. Нет карты Тесла. Используя Linux, я на самом деле просто не стал входить в X, и Limit был снят. – rck

+0

Итак, как говорят другие ответы, на самом деле это возможно ... можете ли вы перефразировать свой ответ? – einpoklum

10

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

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

+2

На самом деле, на Windows любое устройство с драйвером WDDM будет иметь проблему сторожевого таймера, независимо от того, подключен ли дисплей или нет. Карты NVIDA Tesla работают вокруг этого, имея совершенно другой тип драйвера (TCC или Tesla Compute Cluster), который не идентифицирует GPU для ОС в качестве адаптера отображения. Если вы просто подключите вторую видеокарту (Radeon или GeForce) без подключенных дисплеев, она по-прежнему будет распознаваться ОС как устройство адаптера отображения WDDM, и сторожевой таймер по-прежнему будет применяться. –

25

Я не эксперт 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 апреля 2015 обновление:] Это становится действительно устареть. Самый простой способ отключить TDR для программирования Cuda, если у вас установлены инструменты NVIDIA Nsight, - открыть Nsight Monitor, щелкнуть «Параметры монитора Nsight», а в разделе «Общие» установить «WDDM TDR enabled» значение false. Это изменит настройку реестра для вас. Закройте и перезагрузите компьютер. Любое изменение параметра реестра TDR не вступит в силу до перезагрузки.

+12

Я не программист SIMD, и я не играю по телевизору, но IMHO это слишком общее, чтобы сказать, что «Наконец, графические процессоры бывают быстрыми, поэтому, если ваше приложение не может сделать полезную работу в этом 5 или 10 секунд, я бы воспринял это как признак того, что что-то не так ». В научных приложениях (например, для CUDA часто используется), иногда вам просто нужно много вычислить. –

+0

Сан Хасинто: См. Ответ Тома ниже. Тайм-аут разумен в том случае, когда GPU, на котором вы вычисляете, также является вашим графическим процессором. В случае, когда он не используется для отображения, у вас есть больше опций. –

+0

Определенно неправильно говорить, что сторожевой таймер не должен быть отключен. Сторожевой таймер полностью сломан: он срабатывает при однократном нажатии в отладчике, и он полностью блокирует систему в конфигурациях с несколькими мониторами/дисплеями, что никому не помогает. –

3

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

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

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

3

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

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

+0

Привет, Том, я уже модифицировал сторожевой таймер (до ~ 6 дней) и сумел запустить одно ядро ​​в течение 40 секунд. Ive просто попробовал запустить значительно больше, но я продолжаю получать ошибку ErrorLaunch TimeOut. У меня только один GPU, поэтому мне было интересно, есть ли что-то еще, что могло бы заставить gpu ответить до того, как он закончил ядро, esp, так как для запуска потребуется всего 4-5 минут, а тайм-аут настроен на такой большое количество? Спасибо за ваше время, я очень ценю это. –

2

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

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

Добавление: Опция «Interactive» «0» в разделе устройств вашего GPU делает работу.

см CUDA Visual Profiler 'Interactive' X config option?

Для получения дополнительной информации о конфигурации

и

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

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

8

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

Источник из Win7 TDR (Driver Timeout Detection & Recovery) Я также проверил это и работает отлично.

+0

Это решило проблему для меня ... – einpoklum

Смежные вопросы