Re[3]: branch prediction и тернарки
От: watchmaker  
Дата: 01.07.18 14:27
Оценка: 24 (4) +4
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, watchmaker, Вы писали:


X>тернарки подаются branch prediction?


Вопрос не очень правильный. Тернарное выражение присутствует только в тексте программы на языке C++. После компиляции такой вещи уже не существует. И соответственно c branch-prediction они никак не соотносятся.

Да, есть некие аналоги. Например, в x86-64 можно сделать операцию jump (для которого включен branch prediction), а можно сделать операцию conditional-move (для которой не выполняется branch prediction). Первая чем-то похожа на if (cond) {...} else {...}, а вторая на c ? ... : .... Но нет никакого правила, что компилятор должен обязательно транслировать первую конструкцию в jump, а вторую в cmov (возможно так делали некоторые старые компиляторы, но это чисто их особенности работы).
Так что считай, что современному компилятору практически всё равно на то какая запись выражения была выбрана.
Он неплохо умеет выражать if через cmov, и аналогично не хуже сможет расписать ?: через jump.
Если он примет решение переписать ?: через jump, то предсказание ветвлений будет работать, а если через cmov — то не будет.

Впрочем, компиляторы при выключенном PGO и в коде без подсказок о вероятностях перехода, считают, что запись ?: может быть свидетельством, что условие плохо предсказывается, а значит при прочих равных стоит предпочесть вариант с conditional-move.

X>их предпочтительней использовать чем if-else?

В коде на C++ — почти всегда всё равно какая запись будет, если они одинаковое выражение задают. Ибо компилятор будет выбирать инструкции, в которые этот код будет компилироваться. Если хочешь на это надёжно влиять, то используй в коде подсказки (типа __builtin_expect) и включай PGO.

В ассемблере же выбор идёт между jump и conditional-move. И для конкретного процессора и конкретного участка программы он может оказаться важным. Ибо легко строятся сценарии, когда одна конструкция с треском проигрывает другой.

Если тебе интересны детали, то советую посмотреть на примеры и рассуждения Агнера Фога:

As a rule of thumb, we can say that a conditional jump is faster than a conditional move if the code is part of a dependency chain and the prediction rate is better than 75%

Re: branch prediction и тернарки
От: watchmaker  
Дата: 01.07.18 13:43
Оценка: +2
Здравствуйте, niXman, Вы писали:

X>кто-то занимался иследованием плюсов и минусов тернарных выражений для компиляторных оптимизаций?

Да.
Re: branch prediction и тернарки
От: Alexander G Украина  
Дата: 01.07.18 13:44
Оценка: +1
Здравствуйте, niXman, Вы писали:

X>кто-то занимался иследованием плюсов и минусов тернарных выражений для компиляторных оптимизаций?


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

ShowWindow(is_shown ? SW_SHOW /* = 6 */ : SW_HIDE /* = 0 */ );


— выходит магия на битовых операциях без условного перехода вообще

if (is_shown)
    ShowWindow(SW_SHOW);
else
    ShowWindow(SW_HIDE);


— переход сохраняется.
Русский военный корабль идёт ко дну!
branch prediction и тернарки
От: niXman Ниоткуда https://github.com/niXman
Дата: 01.07.18 13:06
Оценка:
привет!

кто-то занимался иследованием плюсов и минусов тернарных выражений для компиляторных оптимизаций?

спасибо.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: branch prediction и тернарки
От: niXman Ниоткуда https://github.com/niXman
Дата: 01.07.18 13:53
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>Да.

похоже, я должен задать очевидный вопорс
тернарки подаются branch prediction? их предпочтительней использовать чем if-else?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[4]: branch prediction и тернарки
От: niXman Ниоткуда https://github.com/niXman
Дата: 01.07.18 14:49
Оценка:
Здравствуйте, watchmaker, Вы писали:

исчерпывающий ответ! спасибо!
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: branch prediction и тернарки
От: chaotic-kotik  
Дата: 02.07.18 07:46
Оценка:
Здравствуйте, niXman, Вы писали:

X>кто-то занимался иследованием плюсов и минусов тернарных выражений для компиляторных оптимизаций?


компилятору пофиг, для него это обычный бранч (если нет PGO) — https://godbolt.org/g/DPFWge
Re[2]: branch prediction и тернарки
От: reversecode google
Дата: 02.07.18 07:58
Оценка:
CK>компилятору пофиг, для него это обычный бранч (если нет PGO) — https://godbolt.org/g/DPFWge
-O3 там нет никаких бранчей
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.