CUDA и если и еще, если - PullRequest
3 голосов
/ 22 марта 2012

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

if (statement1)
  calculation1;

else if (statement2)
  calculation2;

else if (statement3)
  calculation3;

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

1 Ответ

7 голосов
/ 22 марта 2012

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

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

if (statement1) 
  calculation1; 
end if

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...