Лучшее ожидание от C ++ вероятно - PullRequest
0 голосов
/ 27 сентября 2018

Согласно C++ предсказанию с учетом ветвлений, я подготовил тест, чтобы увидеть, насколько он эффективен.

Итак, в контрольной выборке я пишу:

int count=0;
for (auto _ : state) {
    if(count%13==0) {
        count+=2;
    }
    else
        count++;
    benchmark::DoNotOptimize(count);
}

В C++11 предсказании ветвления я пишу:

#define LIKELY(condition) __builtin_expect(static_cast<bool>(condition), 1)
#define UNLIKELY(condition) __builtin_expect(static_cast<bool>(condition), 0)

int count=0;
for (auto _ : state) {
    if(UNLIKELY(count%13==0)) {
        count+=2;
    }
    else
        count++;
    benchmark::DoNotOptimize(count);
}

В C++20,

int count=0;
for (auto _ : state) {
    if(count%13==0)[[unlikely]]{
        count+=2;
    }
    else
        count++;
    benchmark::DoNotOptimize(count);
}

, который, к сожалению, не поддерживается в quick-bench.Но в любом случае, я оставляю это там.

Теперь, получение эталона под gcc и clang не показывает эффективности для такого базового примера.

Я что-то не так делаю?

c++ branch-aware prediction

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Ваши три теста одинаковы.

В первом примере компилятор угадывает, какой путь горячий, он угадывает второй, и он уходит.

Во втором примере вы говоритекомпилятору, что второй путь горячий, поэтому результат такой же, как и первый.

Я перезапускаю тесты, явно указав вероятную и маловероятную ветвь, ниже приводится результат с использованием Clang.

Clang benchmark branch prediction

http://quick -bench.com / -GZXTQk6hvKxm19s8FzgyzgHO0I

Выполнение этого теста в GCC 8.2 все еще не показывает никакой разницы, яповерьте, потому что это полностью оптимизирует ветви.

0 голосов
/ 27 сентября 2018

Ваш стенд не показывает разницы, потому что предсказание ветвления ЦП так же хорошо, как gcc __builtin_expect для оптимизации вашего тривиального примера.

Полное подробное объяснение того, что такое предсказание ветвления, см. этот отличный ответ о переполнении стека .

...