2013-11-06 3 views
0

Это продолжение сообщения this.Несколько потоков CUDA сбой GPU

Кажется, что специальный случай был разрешен путем добавления volitile, но теперь что-то еще сломалось. Если я добавлю что-нибудь между двумя вызовами ядра, система вернется к старому поведению, а именно к замораживанию и печати всего сразу. Такое поведение показано добавлением sleep(2); между set_flag и read_flag. Кроме того, при установке другой программы это приводит к блокировке GPU. Что я теперь делаю неправильно?

Еще раз спасибо.

+0

Вы на окнах? Какова конфигурация вашей машины? (OS, GPU, версия CUDA, другие графические процессоры, если они есть, и т. Д.) –

+0

Я использую ubuntu 12.04 с GeForce GTX 650. – jrk0414

+0

добавьте [правильную проверку ошибок cuda] (http://stackoverflow.com/questions/14038589/ what-is-the-canonical-way-to-check-for-errors-using-the-cuda-runtime-api) к вашему коду, особенно на ядрах. Я верю, что это вам что-то скажет. Я подозреваю взаимодействие с X. Вы используете X на GTX650 (т. Е. У вас есть графический дисплей, размещенный на GTX650)? –

ответ

1

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

Несколько экспериментов вы можете попробовать, (с sleep(2); добавленным между set_flag и read_flag ядер):

  1. Войдите в свою машину по сети через SSH с другой машины. Я думаю, что ваша программа будет работать. (X в этом случае не участвует)
  2. прокомментируйте строку, которая печатает «Начало ...». Я думаю, что ваша программа будет работать. (Это позволяет избежать блокировки дисплея/очереди очереди печати, см. Ниже).
  3. добавьте sleep(2); между линией печати «Начало ...» и первым ядром. Я думаю, что ваша программа будет работать. (Это позволяет драйверу дисплея полностью обслуживать первую распечатку до того, как будет запущено первое ядро, поэтому нет остановки процессора.)
  4. Остановить X и запустить с консоли. Я думаю, что ваша программа будет работать.

Когда на GPU размещается X-дисплей, а также выполняются задачи CUDA, он должен переключаться между ними. Во время выполнения задачи CUDA обычная обработка отображения приостанавливается. Вы можете узнать больше об этом here.

Проблема заключается в том, что при запуске X первая распечатка отправляется в очередь печати, но фактически не отображается перед запуском первого ядра. Это очевидно, потому что вы не видите распечатку перед замораживанием дисплея. После этого поток ЦП задерживается, ожидая отображения текста. Второе ядро ​​не запускается. Промежуточный sleep(2); и его взаимодействие с ОС достаточно для того, чтобы этот ларек произошел. И для запуска первого ядра драйвер дисплея «остановлен» для обычных задач отображения, поэтому ОС никогда не проходит мимо его стойла, поэтому второе ядро ​​не запускается, что приводит к очевидной зависанию.

Обратите внимание, что варианты 1,2 или 3 в связанной статье custhelp будут эффективными в вашем случае. Вариант 4 не будет.

+0

Спасибо за совет. Могу ли я получить тот же эффект от обхода X, если я отключу мониторы от рассматриваемого GPU, или это все еще вызывает конфликт? – jrk0414

+0

Отключение мониторов не поможет. Однако удаление X-сервера с GPU GTX650 поможет. Это требует внесения изменений в ваш файл xorg.conf, и подробности не соответствуют тому, что я могу описать в комментариях. И, очевидно, это означает, что GTX650 ничего не сможет отобразить. –

+0

Повторяя мой комментарий. Одна из вещей, которые, как я сказал, входит в вашу машину через SSH, и запуск этого метода будет работать по этой проблеме, по крайней мере, на основе моего тестирования. Поэтому, если отсоединение мониторов означает, что вы регистрируетесь удаленно, тогда да, «отсоединение мониторов» поможет. –

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