Некоторые концепции и конструкции архитектуры «SIMT» мне до сих пор неясны.
Из того, что я видел и читал, расходящиеся пути кода и вообще if () - довольно плохая идея, потому что многие потоки могут выполняться в режиме lockstep. Что это значит? Как насчет чего-то вроде:
kernel void foo(..., int flag)
{
if (flag)
DO_STUFF
else
DO_SOMETHING_ELSE
}
Параметр «флаг» одинаков для всех рабочих единиц, и одна и та же ветвь берется для всех рабочих единиц. Теперь, собирается ли GPU выполнить весь код, тем не менее, сериализовать все и в основном по-прежнему брать ветвь, которая не взята? Или это немного умнее и будет выполнять только выполненную ветвь, если все потоки согласуются с принятой ветвью? Что всегда будет здесь.
т.е. сериализация ВСЕГДА происходит или только при необходимости? Извините за глупый вопрос. ;)