Программирование без прыжков - PullRequest
3 голосов
/ 29 ноября 2010

Я пытаюсь найти статьи, книги или что-нибудь о программировании без скачков (арка x86). Я знаю, что в целом это невозможно, но я стараюсь избегать переходов, но gcc даже с встроенным func использует переходы много раз. Кодирование только на ассемблере - это своего рода решение, но написание эквивалента в 1000 строк в C для меня как адская сторона

Ответы [ 5 ]

7 голосов
/ 29 ноября 2010

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

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

Другим хорошим направлением является улучшение параллелизма (с использованием как векторизованных инструкций SIMD, так и, если возможно, нескольких ядер).

2 голосов
/ 29 ноября 2010

Оптимизация только кода, критичного к производительности, и только тогда, когда вы действительно знаете, что он критичен к производительности. Не пытайтесь оптимизировать прыжки только потому, что вы читаете, что они снижают производительность. Все вызывает снижение производительности, и самый быстрый код - это код, который ничего не делает. Есть и другие вещи, которые намного хуже прыжков.

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

Один из конкретных способов избежать ветвей - использовать инструкции «условного перемещения». Они могут быть использованы, например, рассчитать макс или мин. Если вы разрешите компилятору использовать архитектуру SSE, он предполагает, что ЦП также поддерживает инструкции CMOV / FCOMI / FCOMIP / FUCOMI / FUCOMIP и будет их использовать (будьте осторожны: иногда может быть сложно заставить компилятор делать то, что вы хотите, см., Например, это обсуждение gamedev.net ).

2 голосов
/ 29 ноября 2010

Я думаю, вы имеете в виду ветвление.В C есть хитрые трюки, чтобы ускорить определенные операции

См. Битовые хаки:

http://www -graphics.stanford.edu / ~ seander / bithacks.html

1 голос
/ 29 ноября 2010

Это не невозможно кодировать без переходов, но попытка кажется бессмысленной.

В конце концов, если вам нужно сделать что-то более одного раза, то ваш выбор:

  • Развертывание цикла (т. Е. Повторение кода вместо цикла).
  • Каким-то образом получить указатель инструкции, чтобы посетить один и тот же код более одного раза.

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

0 голосов
/ 29 ноября 2010

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

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

Трудно фактически удалить ветви, но вы можете минимизировать их, развернув цикл.

Кто-то упомянул условное перемещениеинструкции, есть много условных инструкций для архитектуры ARM, но если они не выполняются, они преобразуются в NOP и занимают один цикл каждый.Не уверен, как они работают на x86.На самом деле он может работать медленнее, чем простая ветвь, в зависимости от длины конвейера.

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

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