2014-10-01 4 views
3

Я просто наткнулся на эту статью: Compute the minimum or maximum of two integers without branchingОптимизация кода, чтобы избежать ветвления

Он начинается с «[о] н некоторых редких машинах, где ветвление дорого ...».

Раньше я думал, что ветвление всегда дорого, поскольку оно часто заставляет процессор очищать и перезапускать конвейер выполнения (например, см. Why is it faster to process a sorted array than an unsorted array?).

Это оставляет меня пару вопросов:

  • ли автор статьи получить, что часть не так? Или эта статья может быть написана за раз до того, как возникла проблема ветвления (я не могу найти дату на ней).
  • У современных процессоров есть способ завершить минимальные ветви, например, в (x < y) ? x : y без ухудшения производительности?
  • Или все современные компиляторы просто реализуют этот хак автоматически? В частности, что делает Java? Тем более, что его Math.min(...) функции только что тройное заявление ...

ответ

6

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

Самый старый комментарий - 5 лет, так что это не горячие новости. Тем не менее, непредсказуемое разветвление всегда дорого и так было 5 лет назад. В то же время, это только ухудшилось, поскольку современные ЦП могут делать намного больше за цикл, и поэтому неправильно спрогнозированная ветвь требует больше работы.

Но в некотором смысле автор прав. Большинство процессоров не найдено на наших ПК и серверах, а во встроенных устройствах, где ситуация отличается.

У современных процессоров есть способ завершить минимальные ветви, например, в (x <)? x: y без ухудшения производительности?

Да и нет. AFAIK Math.max всегда переводится как условное перемещение, что означает отсутствие ветвления. Вы владеете max, может или не может его использовать, в зависимости от статистики, собранной JVM.

Нет серебряной пули. С прогнозируемыми результатами ветвление происходит быстрее. Выяснив, какой шаблон распознает процессор, сложно. JVM просто смотрит, как часто получает ветвь и использует магический порог около 18%. См. Мои собственные question and answer.

Или все современные компиляторы просто реализуют этот хак автоматически? В частности, что делает Java? Тем более, что его функция Math.min (...) - это только трехмерное заявление ...

Это на самом деле собственный компилятор. Всякий раз, когда JITc видит этот метод, он обрабатывает его специально. Когда вы копируете метод, он не получает специальных обработок.

В этом случае внутреннее значение не очень полезно, так как это то, что в любом случае сильно оптимизируется.Для таких методов, как Long#numberOfLeadingZeros, неотъемлемая часть важна, так как code довольно длинный и медленный, и современные процессоры получают это за один цикл.

+1

Хорошая уловка на встроенных устройствах. Похоже, автор просто скопировал предложение со страницы Стэнфорда, с которой он ссылается в конце. И **, что ** статья, не только кажется, что она была написана в 1997 году (опять же, нет четкой даты, просто диапазон авторских прав), но она также квалифицирует заявление далее как «... редкие машины, где ветвление очень дорогое * * и никаких правил перемещения [al] move ** ... ". –

+0

Я только что заметил. Почему «numberOfLeadingZeros» реализован с использованием нескольких ветвей, в то время как его можно выразить как «64-highBit (n)», который можно вычислить как «битCount» (maximumOneBit (n) - 1) + 1 », оба из которых являются сериями двоичные операции без какой-либо ветви. ...? –

+0

@MarkJeronimus Не знаю, но, может быть, ветви могут заменяться условными ходами? И, может быть, кому-то это не понравилось, так как на современных процессорах он все равно заменяется на 'lzcnt', а на слабых процессорах ветви могут быть дешевле. Вы можете скопировать методы (так, чтобы внутренние свойства не привыкли) и сравнить их (но, пожалуйста, используйте JMH или Caliper, иначе это просто случайный шум). Мне было бы интересно, но я действительно должен был заняться другими делами. – maaartinus

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