V
V
Vladimir Semenyakin2016-01-06 16:56:59
GPGPU
Vladimir Semenyakin, 2016-01-06 16:56:59

Does it make sense to create a task-manager running on the GPU?

Lengthy introduction

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

The question, as I understand it, comes down to the following: is there any way to restart the threads on the device device after the current execution of all threads is completed without sending data to the host device?

Answer the question

In order to leave comments, you need to log in

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question