LINUX.ORG.RU

kernel: чем выгоднее макросы likely/unlikely по сравнению с обычным if?


0

0

Не могу понять смысл данных макросов ( в <linux/compiler.h> ).
Как я понял - это как-то позволяет генерировать "intelligent code".
Об этом написано ниже.
Если кто может, поясните, в чём преимущество.

Из блога на kerneltrap.org (http://kerneltrap.org/node/4705):

Ever wondered what the likely and unlikely macros in the linux kernel are ?

The macros are defined as :

#define likely(x)       __builtin_expect((x),1)

#define unlikely(x)     __builtin_expect((x),0)

The __builtin_expect is a method that gcc (versions >= 2.96) offer for programmers to indicate branch prediction information to the compiler. The return value of __builtin_expect is the first argument (which could only be an integer) passed to it.

To check it out how it could be beneficial, an excerpt from "info gcc" :

     if (__builtin_expect (x, 0))

                foo ();




     [This] would indicate that we do not expect to call `foo', since we

     expect `x' to be zero. 

Based on this information the compiler generates intelligent code, such that the most expected result is favored.

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

alexru ★★★★
()

Всё, разобрался.
Код оптимальнее становится. Соответственно, быстрее выполнится.

RomanU
() автор топика
Ответ на: комментарий от RomanU

>Соответственно, быстрее выполнится.

Не быстрее, а быстрее, если ты правильно угадал частоту результатов и компилятор/процессор могут оптимизировать с учетом ответа. Макросы, по большей части только засоряющие код.

anonymous
()
Ответ на: комментарий от anonymous

i386 "предсказывает" переходы вполне определённым образом, именно на это и рассчитаны likely/unlikely. Если произойдёт редкий (unlikely) случай, то придётся сбрасывать весь конвейер, а это дорого (особенно на p4). Поэтому как раз эти макросы важны. Не стоит о них так плохо отзываться

А угадывание "частоты результатов" в 96% случаев тривиально, т к в unlikely обычно попадают проверки ошибок

erDiZz
()
Ответ на: комментарий от erDiZz

>i386 "предсказывает" переходы вполне определённым образом, именно на
>это и рассчитаны likely/unlikely. Если произойдёт редкий (unlikely)
>случай, то придётся сбрасывать весь конвейер, а это дорого (особенно на
> p4). Поэтому как раз эти макросы важны. Не стоит о них так плохо
>отзываться

Во-первых, бывают процессоры не x86(шок!:))
во-вторых, P6 предсказывают ветвления действительно "определенным" образом и этот самый образ не документирован, хотя есть попытки reverse engineering(типа битовых форм).
в-третьих, на Pentium 4(который вы почему-то умудрился обозвать P4, хотя на самом деле он P7) как раз все просто, поскольку на нем действительно есть hint префиксы для ветвления и там использование builtin_expect - достаточно прямолинейно(в теории).
ну а в-четвертых, истории о том, что неправильное предсказание ветвлений - это так уж ужасно и прочие слова про очередь предвыборки или спекулятивное исполнение... ну так возьмите и отпрофилируйте свой код... если он у вас не счетный, то вряд ли вы заметите разницу в 1%, а вот засранный код - это некрасиво.

Это я вам говорю как практик, а не теоретик. :)

anonymous
()
Ответ на: комментарий от anonymous

...из чего ясно, что господин ананимус что-то делал и знает, но объяснить это доступно и с уважением к аудитории не может

erDiZz
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.