Рубрики

Макросы прогнозирования ветвлений в GCC

Одним из наиболее часто используемых методов оптимизации в ядре Linux является «__builtin_expect». При работе с условным кодом (оператором if-else) мы часто знаем, какая ветвь истинна, а какая нет. Если компилятор знает эту информацию заранее, он может генерировать наиболее оптимизированный код.

Давайте посмотрим определение макросов «вероятно ()» и «маловероятно ()» макросов из кода ядра Linux « http://lxr.linux.no/linux+v3.6.5/include/linux/compiler.h » [строка № 146 и 147].

#define likely(x)      __builtin_expect(!!(x), 1)
#define unlikely(x)    __builtin_expect(!!(x), 0)

В следующем примере мы помечаем ветку как вероятную истину:

const char *home_dir ;

  

home_dir = getenv("HOME");

if (likely(home_dir)) 

    printf("home directory: %s\n", home_dir);

else

    perror("getenv");

Для приведенного выше примера мы пометили условие «if» как «вероятно ()» true, поэтому компилятор поместит истинный код сразу после перехода и ложный код в инструкции перехода. Таким образом, компилятор может добиться оптимизации. Но не используйте макросы «вероятный ()» и «маловероятный ()» вслепую. Если прогноз правильный, это означает, что существует нулевой цикл инструкции перехода, но если прогноз неправильный, тогда потребуется несколько циклов, потому что процессор должен очистить свой конвейер, что хуже, чем отсутствие прогноза.

Доступ к памяти является самой медленной операцией процессора по сравнению с другими операциями процессора. Чтобы избежать этого ограничения, ЦП использует «кеши ЦП», например, кэш-память L1, кэш-память L2 и т. Д. Идея кеширования заключается в том, чтобы скопировать некоторую часть памяти в сам ЦП. Мы можем получить доступ к кеш-памяти гораздо быстрее, чем к любой другой памяти. Но проблема в том, что из-за ограниченного размера «кеш-памяти» мы не можем скопировать всю память в кеш. Таким образом, ЦП должен угадать, какая память будет использоваться в ближайшем будущем, и загрузить эту память в кэш ЦП, а указанные выше макросы являются подсказкой для загрузки памяти в кэш ЦП.

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

Рекомендуемые посты:

Макросы прогнозирования ветвлений в GCC

0.00 (0%) 0 votes