В зависимости от размеров вашего блока первое условие threadIdx.x < 64
(обратите внимание на .x
) может вообще не вызывать расхождение. Например, если у вас есть блок с измерениями (128,1,1)
, то первые два перекоса (группы из 32 потоков, которые выполняются в шаге блокировки) войдут в блок if
, а последние два обойдут его. Поскольку вся деформация идет в одну или другую сторону, дивергенции нет.
Условное выражение, подобное threadIdx.x == 1
, вызовет расхождение, но оно будет иметь очень скромные затраты. Действительно, во многих случаях CUDA сможет реализовать условное выражение с помощью одной инструкции. Например, такие операции, как min
, max
и abs
, как правило, будут реализованы с помощью одной инструкции и не вызовут абсолютно никаких расхождений. О таких инструкциях можно прочитать в Руководстве по PTX .
В общем, вы не должны чрезмерно беспокоиться о скромной величине расхождения потока управления, как описано выше. Где расхождение будет кусать вас в таких ситуациях, как
if (threadIdx.x % 4 == 0)
// do expensive operation
else if (threadIdx.x % 4 == 1)
// do expensive operation
else if (threadIdx.x % 4 == 2)
// do expensive operation
else
// do expensive operation
, где «дорогостоящей операцией» будет та, которая требует 10 или 100 секунд инструкций. В этом случае расхождение, вызванное заявлениями if
, снизит эффективность на 75%.
Имейте в виду, что расхождение потоков является гораздо меньшей проблемой, чем (1) выбор алгоритма высокого уровня и (2) локальность / объединение памяти. Очень немногие программисты CUDA должны когда-либо беспокоиться о расхождениях в ваших примерах.