С++ Советы по оптимизации кода на устройствах ARM - программирование
Подтвердить что ты не робот

С++ Советы по оптимизации кода на устройствах ARM

Я разрабатываю С++-код для расширенной реальности на устройствах ARM, и оптимизация кода очень важна для того, чтобы сохраняйте хорошую частоту кадров. Чтобы повысить эффективность до максимального уровня, думаю, важно собрать общие советы, которые упростить жизнь компиляторам и сократить количество файлов программы. Любые предложения приветствуются.

1- Избегайте дорогостоящих инструкций: деление, квадратный корень, sin, cos

  • Используйте логические сдвиги для разделения или умножения на 2.
  • Умножьте по возможности наоборот.

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

3 Используйте таблицы поиска для некоторых математических функций (sin, cos,...)

ПОЛЕЗНЫЕ ИНСТРУМЕНТЫ

  • objdump: получает код сборки скомпилированной программы. Это позволяет сравнить две функции и проверить, действительно ли она оптимизирована.
4b9b3361

Ответ 1

Чтобы ответить на ваш вопрос об общих правилах при оптимизации кода С++ для ARM, вот несколько советов:

1) Как вы упомянули, нет инструкции разделения. Используйте логические сдвиги или умножьте на инверсию, когда это возможно.
2) Память намного медленнее, чем выполнение ЦП; используйте логические операции, чтобы избежать небольших таблиц поиска.
3) Постарайтесь записать 32 бита за раз, чтобы наилучшим образом использовать буфер записи. Написание шорт или символов значительно замедлит код. Другими словами, это быстрее логического ИЛИ или меньших бит вместе и записывать их как DWORDS.
4) Имейте в виду размер вашего кеша L1/L2. Как правило, чипы ARM имеют гораздо меньше кэшей, чем Intel.
5) При необходимости используйте SIMD (NEON). Инструкции NEON довольно мощные и для "векционируемого" кода могут быть довольно быстрыми. Встроенные средства NEON доступны в большинстве сред С++ и могут быть почти такими же быстрыми, как написание вручную настроенного кода ASM.
6) Используйте подсказку предварительной выборки кеша (PLD) для ускорения чтения циклов. У ARM нет интеллектуальной логики precache, как это делают современные чипы Intel.
7) Не доверяйте компилятору генерировать хороший код. Посмотрите на выход ASM и перепишите горячие точки в ASM. Для манипуляции бит/байтом язык C не может указывать такие вещи так же эффективно, как это может быть достигнуто в ASM. ARM имеет мощные 3-операндовые инструкции, многозадачные/хранящиеся и "свободные" сдвиги, которые могут опередить то, что способен компилятор.

Ответ 2

Лучший способ оптимизации приложения - использовать хороший профилировщик. Его всегда хорошая идея написать код, думая об эффективности, но вы также хотите избежать изменений, когда вы "думаете", что код может быть медленным, это может привести к ухудшению ситуации, если вы не уверены на 100%.

Узнайте, где узкие места и сосредоточены на них.

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

В дополнение к профилированию SW, проверьте, какой вид профилирования HW доступен. Проверьте, можете ли вы получить разные показатели HW, такие как промахи кеша, доступ к шине памяти и т.д. Это также очень полезно знать, является ли ваша шина памяти или кеш узким местом.

Недавно я задал этот аналогичный вопрос и получил несколько хороших ответов: Ищете низкопрофильный профилировщик С++