Это продолжение этот сообщение.
Кажется, что особый случай был решен путем добавления volitile
но теперь что-то еще сломалось. Если я добавлю что-нибудь между двумя вызовами ядра, система вернется к старому поведению, а именно к зависанию и печати всего сразу. Это поведение показано добавлением sleep(2)
; между set_flag
а также read_flag
, Кроме того, при установке в другую программу это приводит к блокировке графического процессора. Что я делаю не так сейчас?
Еще раз спасибо.
Существует взаимодействие с X и драйвером дисплея, а также стандартная очередь вывода и его взаимодействие с драйвером графического дисплея.
Несколько экспериментов, которые вы можете попробовать, (с sleep(2);
добавлено между set_flag
а также read_flag
Ядра):
sleep(2);
между строкой печати «Starting …» и первым ядром. Я думаю, что ваша программа будет работать. (Это позволяет драйверу дисплея полностью обслуживать первую распечатку перед запуском первого ядра, поэтому поток ЦП не останавливается.)Когда на графическом процессоре одновременно размещается дисплей X и выполняются задачи CUDA, он должен переключаться между ними. На время выполнения задачи CUDA обычная обработка отображения приостанавливается. Вы можете прочитать больше об этом Вот.
Проблема здесь в том, что при запуске X первая распечатка отправляется в очередь печати, но фактически не отображается до запуска первого ядра. Это очевидно, потому что вы не видите распечатку до остановки дисплея. После этого поток ЦП останавливается в ожидании отображения текста. Второе ядро не запускается. Вмешательство sleep(2);
и этого взаимодействия с ОС достаточно для того, чтобы это произошло. И исполняющее первое ядро имеет драйвер дисплея, «остановленный» для обычных задач отображения, поэтому ОС никогда не преодолеет свою остановку, поэтому второе ядро не запустится, что приведет к очевидному зависанию.
Обратите внимание, что варианты 1,2 или 3 в связанном custhelp
статья будет эффективной в вашем случае. Варианта 4 не будет.
Других решений пока нет …