Есть ли способ компилировать для ARM, а не Thumb в Xcode 4? - PullRequest
28 голосов
/ 05 декабря 2011

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

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

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

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

Ответы [ 3 ]

49 голосов
/ 06 декабря 2011

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

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

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

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

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

Build settings for ARMv6

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

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

8 голосов
/ 05 декабря 2011

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

3 голосов
/ 18 декабря 2011

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

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

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

...