Существует взаимодействие с X и драйвером дисплея, а также стандартная очередь вывода и взаимодействие с графическим драйвером.
Несколько экспериментов вы можете попробовать, (с sleep(2);
добавленным между set_flag
и read_flag
ядер):
- Войдите в свою машину по сети через SSH с другой машины. Я думаю, что ваша программа будет работать. (X в этом случае не участвует)
- прокомментируйте строку, которая печатает «Начало ...». Я думаю, что ваша программа будет работать. (Это позволяет избежать блокировки дисплея/очереди очереди печати, см. Ниже).
- добавьте
sleep(2);
между линией печати «Начало ...» и первым ядром. Я думаю, что ваша программа будет работать. (Это позволяет драйверу дисплея полностью обслуживать первую распечатку до того, как будет запущено первое ядро, поэтому нет остановки процессора.)
- Остановить X и запустить с консоли. Я думаю, что ваша программа будет работать.
Когда на GPU размещается X-дисплей, а также выполняются задачи CUDA, он должен переключаться между ними. Во время выполнения задачи CUDA обычная обработка отображения приостанавливается. Вы можете узнать больше об этом here.
Проблема заключается в том, что при запуске X первая распечатка отправляется в очередь печати, но фактически не отображается перед запуском первого ядра. Это очевидно, потому что вы не видите распечатку перед замораживанием дисплея. После этого поток ЦП задерживается, ожидая отображения текста. Второе ядро не запускается. Промежуточный sleep(2);
и его взаимодействие с ОС достаточно для того, чтобы этот ларек произошел. И для запуска первого ядра драйвер дисплея «остановлен» для обычных задач отображения, поэтому ОС никогда не проходит мимо его стойла, поэтому второе ядро не запускается, что приводит к очевидной зависанию.
Обратите внимание, что варианты 1,2 или 3 в связанной статье custhelp
будут эффективными в вашем случае. Вариант 4 не будет.
Вы на окнах? Какова конфигурация вашей машины? (OS, GPU, версия CUDA, другие графические процессоры, если они есть, и т. Д.) –
Я использую ubuntu 12.04 с GeForce GTX 650. – jrk0414
добавьте [правильную проверку ошибок cuda] (http://stackoverflow.com/questions/14038589/ what-is-the-canonical-way-to-check-for-errors-using-the-cuda-runtime-api) к вашему коду, особенно на ядрах. Я верю, что это вам что-то скажет. Я подозреваю взаимодействие с X. Вы используете X на GTX650 (т. Е. У вас есть графический дисплей, размещенный на GTX650)? –