Что выполняют рабочие элементы, когда условные выражения используются в программировании на GPU? - PullRequest
7 голосов
/ 05 мая 2011

Если у вас есть рабочие элементы, выполняющиеся в волновом фронте, и существует условие, такое как:

  if(x){
        ...
  }
  else{
       ....
  }

Что выполняют рабочие элементы? это тот случай, когда все рабочие элементы в волновом фронте будут выполнять первую ветвь (т.е. x == true). Если нет рабочих элементов, для которых x имеет значение false, то остальные условия пропускаются?

Что произойдет, если один рабочий элемент выберет альтернативный путь. Мне сказали, что все рабочие элементы также будут выполнять альтернативный путь (следовательно, выполнять оба пути?). Почему это так и как это не портит выполнение программы

1 Ответ

14 голосов
/ 05 мая 2011

NVIDIA gpus использует условное выполнение для обработки расхождения ветвей внутри группы SIMD («деформация»).В вашем примере if..else обе ветви выполняются каждым потоком в расходящейся деформации, но те потоки, которые не следуют за данной ветвью, помечаются и вместо этого выполняют нулевую операцию.Это классическое наказание за дивергенцию ветвлений - для дивергенции между ветвями требуется два прохода через раздел кода, чтобы удалиться для деформации.Это не идеально, поэтому ориентированный на производительность код пытается минимизировать это.Одна вещь, которая часто ловит людей, - это предположение о том, какой раздел расходящегося пути выполняется «первым».Были некоторые очень тонкие ошибки, вызванные вторым угадыванием внутреннего порядка выполнения в расходящейся деформации.

Для более простых условий графические процессоры NVIDIA поддерживают условную оценку в ALU, которая не вызывает расхождения, и для условий, где условиявся деформация идет по тому же пути, штраф тоже явно отсутствует.

...