@semenyakinVS
Писатель кода и не только

Имеет ли смысл создать исполняющийся на GPU task-manager?

Пространное вступление

Я пока только начинаются разбираться с возможностями написания кода для GPU и в процессе чтения понял, что два главных ботлнека при работе с GPU это пересылка данных с CPU на видеоустройство и ветвления в коде кернелов, причём главный простой при ветвлениях происходит в варпах, когда один из потоков варпа выполняет ветвление, а остальные ждут прохождения соответствующей ветки кода.

Допустим, есть задача трассировки лучей. Каждый луч может отражаться и преломляться, порождая новые лучи. Происходит это при пересечении луча и поверхности - то есть, с ветвлением кода. Выполнение обработки отражённых и преломлённых лучей можно выполнять запуская рекурсивно функцию трассировки для новых лучей. Но это будет означать простой других потоков пока данный выполняется, и так для каждого из потоков в варпе. Выходит очень плохой для GPU, неоднородный код.

Исходя из этого подумал, что, возможно, было бы полезно написать что-то вроде исполняющегося прямо на GPU task-manager-а для выполнения подобных итеративных действий. С его помощью в местах просчёта лучей вместо полного алгоритма (как в примере - трассировки лучей) можно просто сохранить данные для выполнения трассировки нового луча, а трассировку выполнить когда обработаются все лучи текущей итерации (см. картинку).
Картинка
2e7c4199ca68413cbfedd66b895c5db5.png


Вопрос, как я понимаю, сводится к следующему: нет ли какой-то возможности выполнить повторный запуск потоков на device-устройстве по окончанию текущего исполнения всех потоков без пересылки данных на host-устройство?
  • Вопрос задан
  • 225 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы