CUDA: Почему побитовые операторы иногда быстрее, чем логические операторы? - PullRequest
11 голосов
/ 28 марта 2012

Когда мне нужно выжать из ядра последний бит производительности, я обычно нахожу, что замена логических операторов (&& и ||) на битовых операторов (& и |) делает ядро ​​немного быстрее. Это наблюдалось при просмотре сводки времени ядра в CUDA Visual Profiler.

Итак, почему побитовые операторы быстрее , чем логические операторы в CUDA? Я должен признать, что они не всегда быстрее, но часто бывают. Интересно, что магия может дать это ускорение.

Отказ от ответственности: я знаю, что логические операторы короткого замыкания и побитовые операторы не делают. Я хорошо знаю, как эти операторы могут быть использованы неправильно, что приведет к неправильному коду. Я использую эту замену с осторожностью, только когда получающаяся логика остается той же самой, есть ускорение, и полученное таким образом ускорение имеет значение для меня: -)

Ответы [ 3 ]

12 голосов
/ 28 марта 2012

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

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

A && B:

if (!A) {
  return 0;
}
if (!B) {
  return 0;
}
return 1;

A & B:

return A & B;

Это семантика, учитывая, что оценка A и B может иметь побочные эффекты (они могут быть функциями, которые изменяютсостояние системы при оценке).

Компилятор может оптимизировать регистр A && B в зависимости от типов A и B и контекста.

1 голос
/ 28 марта 2012

Побитовые операции могут выполняться в регистрах на аппаратном уровне.Операции с регистрами выполняются быстрее всего, это особенно верно, когда данные могут помещаться в регистр.Логические операции включают оценку выражения, которая не может быть привязана к регистру.Обычно &, |, ^, >> ... являются одними из самых быстрых операций и широко используются в высокопроизводительной логике.

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