Когда CUDA ядро содержит условный код, как это:CUDA и если и еще если
if (statement1)
calculation1;
else if (statement2)
calculation2;
else if (statement3)
calculation3;
делает это означает, что расчеты будут упорядочены?
Когда CUDA ядро содержит условный код, как это:CUDA и если и еще если
if (statement1)
calculation1;
else if (statement2)
calculation2;
else if (statement3)
calculation3;
делает это означает, что расчеты будут упорядочены?
Сериализация исполнения в CUDA происходит всякий раз, когда происходит расходящееся разветвление в пределах одной основы потоков. Итак, в вашем абстрактном примере, если какое-либо из трех утверждений не оценивается как одно и то же для любого заданного warp, тогда будет разветвление ветвей и повторение команды некоторой комбинации из трех блоков кода вычисления, производя сериализации для этой деформации. Но если условия будут одинаковыми на уровне варпа, то сериализации не будет.
Вы также должны иметь в виду, что существует условное исполнение в CUDA, так что если вы что-то вроде этого:
if (statement1)
calculation1;
end if
даже если statement1
не было верно для всех потоков в перекосом, не будет любая сериализация, вместо этого некоторые из нитей в основе просто выполняют эквивалент NOOP
.
Таким образом, на ваш вопрос нет общего ответа - в зависимости от структуры кода, входных данных, которые определяют условия, и группировки оценки условий между перекосами, может быть или не быть сериализации. В целом архитектура и компилятор гораздо более терпимы к разветвлению, чем многие люди себе представляют, и разумно написанный код, содержащий ветви и условия, будет платить лишь небольшое (или даже незначительное) исполнение. Профилировщик CUDA предоставляет довольно много информации о сериализации и воспроизведении команд - это должно быть вашим основным руководством для понимания влияния ветвления на производительность данного фрагмента кода.