Предикация филиала на GPU - PullRequest
11 голосов
/ 05 июля 2011

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

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

if (C)
 A
else
 B

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

1 Ответ

12 голосов
/ 05 июля 2011

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

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

...