Как делают вероятные/маловероятные макросы в ядре Linux работают и каково их преимущество?

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

331
задан Marco Bonelli 16 April 2019 в 15:32
поделиться

6 ответов

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

Как все такие оптимизации производительности необходимо только сделать это после обширного профилирования, чтобы гарантировать, что код действительно находится в узком месте, и вероятно, учитывая микро природу, что это выполняется в жестком цикле. Обычно разработчики Linux довольно испытаны так, я предположил бы, что они сделают это. Они действительно не заботятся слишком много о мобильности, поскольку они только предназначаются для gcc, и у них есть очень близкая идея блока, который они хотят, чтобы он генерировал.

312
ответ дан jww 23 November 2019 в 00:46
поделиться

Это макросы, которые дают подсказки компилятору, о котором пути может пойти ответвление. Макросы расширяются до определенных расширений GCC, если они доступны.

GCC использует их для оптимизировать для предсказания ветвлений. Например, если у Вас есть что-то как следующий

if (unlikely(x)) {
  dosomething();
}

return x;

Тогда, это может реструктурировать этот код, чтобы быть чем-то больше как:

if (!x) {
  return x;
}

dosomething();
return x;

преимущество этого - то, что, когда процессор берет ответвление в первый раз, существует значительно служебный, потому что он, возможно, теоретически загружал и выполнял код далее вперед. Когда это решит, что возьмет ответвление, тогда это должно делать недействительным это и запуститься в цели ответвления.

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

существует много других стратегий, которые компилятор и процессор могут использовать в этих сценариях. Можно найти больше деталей о том, как предикторы ответвления работают в Википедии: http://en.wikipedia.org/wiki/Branch_predictor

70
ответ дан user545424 23 November 2019 в 00:46
поделиться

Они заставляют компилятор испускать соответствующие подсказки ответвления где поддержка оборудования их. Это обычно просто означает вертеть несколько битов в коде операции инструкции, таким образом, размер кода не изменится. ЦП запустит выбирающие инструкции с предсказанного местоположения, и сбросит конвейер и запустится, если это окажется неправильным, когда ответвление достигнуто; в случае, где подсказка корректна, это сделает ответвление намного быстрее - точно, сколько быстрее будет зависеть от аппаратных средств; и то, насколько это влияет на производительность кода, будет зависеть от того, какая пропорция подсказки времени корректна.

, Например, на ЦП PowerPC ответвление, которому не подсказывают, могло бы взять 16 циклов, правильно подсказал, что 8 и неправильно подсказали 24. В самых внутренних циклах хороший вывод подсказок может иметь огромное значение.

Мобильность не является действительно проблемой - по-видимому, определение находится в заголовке на платформу; можно просто определить, "вероятно", и "вряд ли" ни к чему для платформ, которые не поддерживают статические подсказки ответвления.

7
ответ дан moonshadow 23 November 2019 в 00:46
поделиться

(замечание общего порядка - другие ответы касаются деталей)

нет никакой причины, что необходимо потерять мобильность при помощи их.

у Вас всегда есть опция создания простого нулевого эффекта, "встроенного" или макро-, который позволит Вам компилировать на других платформах с другими компиляторами.

Вы просто не извлечете пользу из оптимизации, если Вы будете на других платформах.

2
ответ дан Andrew Edgecombe 23 November 2019 в 00:46
поделиться

Они - подсказки к компилятору для генерации префиксов подсказки на ответвлениях. На x86/x64 они поднимают один байт, таким образом, Вы получите самое большее однобайтовое увеличение для каждого ответвления. Что касается производительности, это полностью зависит от приложения - в большинстве случаев, предиктор ответвления на процессоре проигнорирует их в эти дни.

Редактирование: Забыл об одном месте, с которым они могут на самом деле действительно помочь. Это может позволить компилятору переупорядочивать график потока управления для сокращения количества ответвлений, взятых для 'вероятного' пути. Это может иметь отмеченное улучшение циклов, где Вы проверяете несколько случаев выхода.

1
ответ дан Cody Brocious 23 November 2019 в 00:46
поделиться

Это функции GCC для программиста для предоставления подсказки компилятору о том, чем наиболее вероятное условие ответвления будет в данном выражении. Это позволяет компилятору создавать команды перехода так, чтобы наиболее распространенный случай взял наименьшее количество количества инструкций выполниться.

, Как команды перехода создаются, зависят от архитектуры процессора.

1
ответ дан dcgibbons 23 November 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: