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