Фильтрация ветвления на GPU

У меня вопрос о ветвлении в графических процессорах. Насколько я знаю, в графических процессорах они превалируют с веткими.

Например, у меня есть такой код:

if (C)
 A
else
 B

так что если A занимает 40 циклов, а B выполняет 50 циклов, чтобы завершить выполнение, если предполагается, что для одного варпа выполняется как A, так и B, то для завершения этой ветки требуется всего 90 циклов? Или они перекрывают A и B, то есть когда выполняются некоторые команды A, затем ожидают запрос памяти, затем выполняются некоторые команды B, затем ожидают память и т.д.? Благодаря

Ответ 1

Все архитектуры, поддерживающие CUDA, выпущенные до сих пор, работают как SIMD-машина. Когда есть расхождение в ветвях, оба пути кода выполняются всеми потоками в warp, причем потоки, которые не соответствуют активному пути, выполняющему функциональный эквивалент NOP (я думаю, что я помню, что есть условное выполнение флаг, прикрепленный к каждому потоку в warp, который позволяет маскировать неработающие потоки).

Итак, в вашем примере ответ на 90 циклов, вероятно, является лучшим приближением того, что действительно происходит, чем альтернатива.