Есть ли способ компилировать для ARM, а не Thumb в Xcode 4?

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

Вот что они говорят в Руководстве по разработке приложений для iOS:

Устройства iOS поддерживают два набора инструкций, ARM и Thumb. Xcode использует инструкции Thumb по умолчанию, потому что использование Thumb обычно уменьшает размер кода примерно на 35 процентов по сравнению с ARM. Приложения с обширным кодом с плавающей точкой могут работать лучше, если они используют инструкции ARM, а не Thumb. Вы можете отключить Thumb для своего приложения, чтобы оно компилировалось для ARM, установив для параметра Compile for Thumb build значение No.

Тем не менее, я не могу найти настройки "Compile for Thumb" в моих настройках сборки. Они переименовали это? Или это сейчас недоступно с Xcode 4?

3 ответа

Решение

Во-первых, совет не компилировать для набора команд Thumb для улучшения производительности с плавающей запятой действительно применим только к старым устройствам ARMv6.

Аппаратное обеспечение ARMv7 (iPhone 3G S и новее, включая все iPad) использует более эффективный набор команд Thumb-2, который не страдает от такого же замедления с плавающей запятой. Для сборок ARMv7 рекомендуется почти во всех случаях, которые вы собираете для Thumb. Я предоставлю немного больше информации об этом в моем ответе здесь.

Это может быть причиной того, что этот параметр компилятора более не представлен как общий вариант, поскольку устройства ARMv7 составляют подавляющее большинство устройств iOS.

Если вы хотите сделать это только для ваших сборок ARMv6, вы можете перейти к настройкам сборки и навести курсор мыши на опцию "Другие флаги C". Нажмите на маленькую кнопку с плюсом, которая появляется справа от этой опции, и добавьте условие для архитектуры ARMv6. Сделайте это снова, чтобы создать один для архитектуры ARMv7. Под архитектурой ARMv6 добавьте дополнительный флаг компилятора -mno-thumb (как предполагает Кевин).

Вы должны получить что-то похожее на следующее:

Настройки сборки для ARMv6

Я делаю это в одном из моих приложений, потому что я видел повышение производительности на старых устройствах ARMv6 с этим. Однако, другое из моих приложений было медленнее, когда не собиралось для Thumb на ARMv6, так что вы захотите сначала профилировать это.

Кроме того, в настоящее время существует ошибка в LLVM Compiler 3.0, который поставляется с Xcode 4.2 (который с тех пор был исправлен в 4.2.1, как я слышал), где вычисления с плавающей запятой компилируются неправильно в Thumb для ARMv6. Если вы используете именно эту версию XCode, вам нужно сделать это для правильного поведения на старых устройствах.

Я не знаю, должен ли "Compile for Thumb" существовать в Xcode 4, но вы всегда можете добавить -mno-thumb в настройке сборки других флагов.

Относительно вашего исходного вопроса: я заметил, что "Compile for Thumb" (в разделе "Генерация кода" ваших "Настройки сборки проекта") в Xcode 4.2.1 доступен только в том случае, если вы используете LLVM GCC 4.2 (если установлен в " Компилятор для C/C++/Objective-C")!

При компиляции с Apple LLVM 3.0 вы не найдете опции "Compile for Thumb". Но, как уже сказал Брэд, вы все равно можете изменить опцию "Другие флаги C", чтобы отключить режим Thumb.

Еще один интересный момент: я использую источник объединения sqlite в своем проекте (мне нужен fts - полнотекстовый поиск), и после компиляции с LLVM 3.0 у меня возникали странные и довольно случайные сбои на устройствах armv6 при доступе к базе данных: как оказалось, это было из-за режима Thumb не отключается при компиляции для устройств armv6.

Другие вопросы по тегам