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