GCC -mthumb против -marm

Я работаю над оптимизацией производительности кода ARM C/C++, скомпилированного с GCC. Процессор - Tegra 3. Как я знаю флаги -mthumb означают генерацию старых 16-битных инструкций Thumb. В различных тестах у меня увеличение производительности на 10-15% при использовании -marm против -mthumb.

-mthumb ли -mthumb только для совместимости и производительности, в то время как -marm в целом лучше? Я спрашиваю, потому что android-cmake использовал -mthumb в режиме Release и -marm в Debug. Это очень смущает меня.

Ответ 1

Thumb не является устаревшим набором команд, но на самом деле является более новым. Текущая редакция - Thumb-2, представляющая собой смешанный 16/32-разрядный набор команд. Набор инструкций Thumb1 был сжатой версией исходного набора команд ARM. ЦП будет извлекать инструкцию, распаковывать ее в ARM и затем обрабатывать. В эти дни (ARMv7 и выше) Thumb-2 предпочтительнее всего, кроме критического или системного кода. Например, GCC по умолчанию будет генерировать Thumb2 для ARMv7 (как и ваш Tegra3), поскольку более высокая плотность кода, предоставляемая 16/32-битной ISA, позволяет улучшить использование icache. Но это очень трудно измерить в обычном бенчмарке, потому что большинство тестов будут вписываться в L1 icache в любом случае.

Для получения дополнительной информации посетите сайт Википедии: http://en.wikipedia.org/wiki/ARM_architecture#Thumb

Ответ 2

ARM - это 32-битная инструкция, поэтому она имеет больше битов для выполнения большего количества операций в одной инструкции, в то время как THUMB только с 16 битами может разделить одну и ту же функциональность между двумя инструкциями. Исходя из предположения, что инструкции без памяти занимают более или менее одно и то же время, меньшее количество инструкций означает более быстрый код. Были также некоторые вещи, которые просто невозможно было сделать с помощью кода THUMB.

Идея заключалась в том, что ARM будет использоваться для критически важных для производительности функций, а THUMB (который вмещает 2 инструкции в 32-битное слово) будет использоваться для минимизации пространства хранения программ.

По мере того как кэширование памяти ЦП становилось все более критичным, наличие большего количества инструкций в icache стало большим фактором, определяющим скорость, чем функциональная плотность на инструкцию. Это означало, что код THUMB стал быстрее, чем эквивалентный код ARM. Поэтому ARM (corp) создал THUMB32, который является инструкцией переменной длины, которая включает в себя большинство функций ARM. THUMB32 должен в большинстве случаев давать более плотный и быстрый код из-за лучшего кэширования.