Как намекнуть оптимизатору компилятора Visual C ++, что определенная ветвь оператора if вряд ли будет выполнена? - PullRequest
18 голосов
/ 22 февраля 2011

У нас есть макрос для проверки ошибок, который выглядит следующим образом:

#define CheckCondition( x ) \
    if( x ) { \
    //okay, do nothing \
    } else { \
       CallFunctionThatThrowsException(); \
    }

, и обычно условие должно быть true, и мы хотели бы, чтобы предсказание ветви ЦП всегда выбирало этот путь,и если это окажется false, нам на самом деле не нужно заблуждение - выброс исключения и массивное раскручивание стека в любом случае будет стоить целое состояние.

В соответствии с описаниями хардкора CPU прогнозирование ветвей будет обрабатывать скачки вперед ипрыжки назад немного по-другому (что-то вроде обратного перехода всегда выполняется, и прямой переход никогда не выполняется), и компилятор может улучшить прогнозирование ветвления, генерируя код, который даст правильные подсказки предиктору ветвления ЦП.

Кажется, gcclikely и unlikely подсказки для этого.Есть ли что-нибудь подобное в Visual C ++?Можно ли использовать для этого ключевое слово __assume 1016 *? 1017 *

Ответы [ 2 ]

10 голосов
/ 22 февраля 2011

Не в MSVC, к сожалению, согласно их центру разработчиков .

Это очень расстраивает, потому что мы хотели бы использовать его в нескольких случаях, когда эквивалентный встроенный GCC сохранилмы имеем несколько критических микросекунд во внутренних циклах, но самое близкое, что мы можем получить - это поменять предложения if и else так, чтобы более вероятный случай был в ветви forward-jump-not-берется.

3 голосов
/ 02 декабря 2012

Включить Оптимизация по профилю . Компилятор не только максимизирует предсказание ветвлений, но и может полностью убрать холодный код. Этот канал 9 video объясняет различные оптимизации.

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