2012-03-22 2 views
3

Когда CUDA ядро ​​содержит условный код, как это:CUDA и если и еще если

if (statement1) 
    calculation1; 

else if (statement2) 
    calculation2; 

else if (statement3) 
    calculation3; 

делает это означает, что расчеты будут упорядочены?

ответ

7

Сериализация исполнения в CUDA происходит всякий раз, когда происходит расходящееся разветвление в пределах одной основы потоков. Итак, в вашем абстрактном примере, если какое-либо из трех утверждений не оценивается как одно и то же для любого заданного warp, тогда будет разветвление ветвей и повторение команды некоторой комбинации из трех блоков кода вычисления, производя сериализации для этой деформации. Но если условия будут одинаковыми на уровне варпа, то сериализации не будет.

Вы также должны иметь в виду, что существует условное исполнение в CUDA, так что если вы что-то вроде этого:

if (statement1) 
    calculation1; 
end if 

даже если statement1 не было верно для всех потоков в перекосом, не будет любая сериализация, вместо этого некоторые из нитей в основе просто выполняют эквивалент NOOP.

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

Смежные вопросы