Есть ли какие-либо встроенные функции, чтобы сообщить компилятору, предсказуема ли ветвь? - PullRequest
4 голосов
/ 24 апреля 2019

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

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

Возможно ли это в основных компиляторах? (Думая конкретно о gcc и clang).


Примеры, объясняющие, почему «предсказуемый» и «вероятный» не одно и то же

int x = rand()%2;
while (true) {
    if (x) {
        // do something
    }
}

Оператор if маловероятен или маловероятен, но весьма предсказуем.

while (true) {
    if (rand()%5 > 0) {
        // do something
    }
}

В этом случае верно обратное: ветвление весьма вероятно (используется 80% времени), но непредсказуемо.

1 Ответ

6 голосов
/ 24 апреля 2019

Преобразование моего комментария в ответ:

clang имеет __builtin_unpredictable:

__builtin_unpredictable используется, чтобы указать, что условие ветвления непредсказуемо аппаратными механизмами, такими как ветвлениелогика прогнозирования.

Пример использования:

if (__builtin_unpredictable(x > 0)) {
    foo();
}

https://clang.llvm.org/docs/LanguageExtensions.html#builtin-unpredictable

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