Сравнение производительности ARM и Thumb на iPhone 3GS, код без плавающей запятой

Мне было интересно, есть ли у кого-нибудь точные цифры производительности кода ARM и Thumb на iPhone 3GS. Специально для кода без плавающей запятой (VFP или NEON) — мне известно о проблемах с производительностью с плавающей запятой в режиме Thumb.

Есть ли момент, когда дополнительный размер кода больших инструкций ARM становится угрозой производительности? Другими словами, если мой исполняемый код относительно мал по сравнению с доступной памятью, есть ли какая-либо измеренная разница в производительности при включении режима Thumb?

Причина, по которой я спрашиваю, заключается в том, что, хотя я могу включить ARM для конкретных исходных файлов NEON в Xcode, используя параметр «-marm», это нарушает сборку симулятора, потому что GCC собирает x86. Мне было интересно, должен ли я просто отключить «компилировать как большой палец» и покончить с этим.


person Justicle    schedule 29.07.2009    source источник
comment
Ooh Random -1 голос без объяснения причин. Хороший.   -  person Justicle    schedule 29.07.2009
comment
Вау еще один. Классные люди стараются - мы все многому учимся.   -  person Justicle    schedule 29.07.2009
comment
+1 - Мне кажется разумным вопрос (только возвращает вас к нулю, хотя я боюсь ...)   -  person Matthew Murdoch    schedule 29.07.2009


Ответы (3)


Я не знаю об iPhone, но общее заявление о том, что большой палец медленнее, чем ARM, совершенно неверно. Учитывая 32-битную память с нулевым состоянием ожидания, thumb будет немного медленнее, например, 5% или 10%. Теперь, если это thumb2, это другая история, говорят, что thumb2 может работать быстрее, я не знаю, что есть в iPhone, я думаю, что это не thumb2.
Если у вас не заканчивается нулевое ожидание- укажите 32-битную память, тогда ваши результаты будут отличаться. Одна большая вещь - 32-битная память. Если вы работаете на 16-битной шине, такой как семейство GameBoy Advance, и в этой памяти или ПЗУ есть некоторые состояния ожидания, то thumb может легко превзойти ARM по производительности, даже если для выполнения той же задачи требуется больше инструкций thumb.

Протестируйте свой код! Нетрудно придумать тест, который дает интересующие вас результаты или нет. Показать, что рука отбивает большой палец, так же легко, как и большой палец отталкивает руку. Кого волнует, что такое dhrystones, важно, насколько быстро он запускает ВАШ код СЕГОДНЯ.

Что я обнаружил за годы тестирования производительности кода для ARM, так это то, что ваш код и ваш компилятор являются важным фактором. Таким образом, в теории thumb работает на несколько процентов медленнее, поскольку использует на несколько процентов больше инструкций для выполнения той же задачи. Но знаете ли вы, что ваш любимый компилятор может быть ужасным, и просто переключив компиляторы, вы сможете работать в несколько раз быстрее (gcc попадает в эту категорию)? Или использовать один и тот же компилятор и перепутать параметры оптимизации. В любом случае вы можете скрыть разницу между рукой и большим пальцем, разумно используя инструменты. Вы, вероятно, знаете это, но вы были бы удивлены, узнав, как много людей думают, что единственный способ, которым они знают, как компилировать код, является единственным способом, и единственный способ получить лучшую производительность — это использовать больше памяти или другого оборудования для решения проблемы.

Если вы используете iPhone, я слышал, что эти люди используют LLVM? Мне нравится концепция llvm во многих отношениях, и я очень хочу использовать ее в качестве своего ежедневного драйвера, когда она созреет, но обнаружил, что она производит код, который был на 10-20% (или намного больше) медленнее для конкретной задачи, которую я выполнял. Я был в режиме руки, я не пробовал режим большого пальца, и у меня был включен кеш l1 и l2. Если бы я тестировал без кешей, чтобы действительно сравнить большой палец с рукой, я, вероятно, увидел бы, что большой палец на несколько процентов медленнее, но если подумать (что меня не интересовало в то время), вы можете кэшировать в два раза больше кода большого пальца, чем кода руки, который МОЖЕТ означать, что, несмотря на то, что в целом для задачи имеется на несколько процентов больше кода, кэширование значительно большего его объема и сокращение среднего времени выборки может быть заметно быстрее. Возможно, мне придется попробовать это.

Если вы используете llvm, у вас есть другая проблема, связанная с несколькими местами для выполнения оптимизации. Переходя от C к байт-коду, вы можете оптимизировать, затем вы можете оптимизировать сам байт-код, затем вы можете объединить весь свой байт-код и оптимизировать его в целом, затем при переходе от байт-кода к ассемблеру вы можете оптимизировать. Если бы у вас было только 3 исходных файла и предполагалось, что для каждой возможности было только два уровня оптимизации, а те, которые не оптимизируются или оптимизируются, с gcc у вас было бы 8 комбинаций для тестирования, с llvm количество экспериментов почти на порядок выше. . Больше, чем вы можете пробежать, от сотен до тысяч. Для одного теста, который я запускал, НЕ оптимизировался на этапе C для байт-кода, а затем НЕ оптимизировал байт-код, когда он был отдельным, но оптимизировал после объединения файлов байт-кода в один большой (ger). Оптимизация ООО на пути к вооружению дала наилучшие результаты.

Итог... тест, тест, тест.

РЕДАКТИРОВАТЬ:

Я использовал слово байт-код, я думаю, что правильным термином является бит-код в мире LLVM. Я имею в виду код в файлах .bc...

Если вы переходите с C на ARM с помощью LLVM, в середине есть битовый код (bc). Существуют параметры командной строки для оптимизации на этапе C to bc. После bc вы можете оптимизировать для каждого файла, от bc до bc. Если вы решите, вы можете объединить два или более файла bc в большие файлы bc или просто превратить все файлы в один большой файл bc. Затем каждый из этих объединенных файлов также можно оптимизировать.

Моя теория, за которой пока стоит всего пара тестовых случаев, заключается в том, что если вы не выполняете никакой оптимизации до тех пор, пока у вас не будет всей программы/проекта в одном большом файле bc, у оптимизатора будет максимальное количество информации, с которой можно работать. делать свою работу. Так что это означает переход от C к bc без оптимизации. Затем объедините все файлы bc в один большой файл bc. Как только вы получите все это в виде одного большого файла bc, позвольте оптимизатору выполнить свой шаг оптимизации, максимизируя информацию и, надеюсь, качество оптимизации. Затем перейдите от оптимизированного файла bc к ассемблеру ARM. Настройка по умолчанию для llc включает оптимизацию, вы хотите разрешить эту оптимизацию, поскольку это единственный шаг, который знает, как оптимизировать для цели. Оптимизация bc to bc является общей и не зависит от цели (AFAIK).

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

person old_timer    schedule 02.08.2009
comment
Вы можете остановиться на этом? НЕ оптимизация на этапе C для байт-кода, а затем НЕ оптимизация байт-кода в то время как отдельно, но оптимизация после слияния файлов байт-кода в один большой (ger). Оптимизация ООО на пути к вооружению дала наилучшие результаты. - person slf; 17.10.2009
comment
IPhone 3GS имеет Cortex-A8, который поддерживает Thumb-2. Однако я не знаю, позволит ли Xcode вам его использовать. Можете ли вы настроить таргетинг на конкретную версию iPhone? - person Adam Goode; 18.10.2009
comment
Насколько я знаю, Apple еще не включила LLVM для ARM в Xcode, ИМХО, он не готов к прайм-тайму на ARM. - person catlan; 18.10.2009
comment
Конкретная информация в этом ответе устарела. Xcode по умолчанию использует компилятор LLVM для новых проектов. И с настройками проекта по умолчанию компилятор LLVM создает сборку THUMB ARM. - person Berik; 31.08.2012

См. этот PDF-файл от ARM/Thumb, чтобы узнать о компромиссах производительности/размера кода/энергопотребления.

Выбор инструкций ARM и Thumb на основе профиля
– Департамент компьютерных наук, Аризонский университет, Раджив Гупта

person Justicle    schedule 29.07.2009
comment
Ссылка на самом деле не является ответом, но я обновил ее хорошей ссылкой. - person artless noise; 16.11.2013
comment
В нем делается вывод, что код ARM генерирует большой код с более высокой энергией I-кэша, но быстрее; Код Thumb генерирует небольшой код с низким потреблением I-кэша, но медленнее. - person Fredrick Gauss; 07.08.2014

Код Thumb по существу всегда будет медленнее, чем эквивалентный ARM. Единственный случай, когда Thumb-код может дать большой выигрыш в производительности, — это если он определяет разницу между размещением вашего кода во встроенной памяти или в кэш-памяти.

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

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

person Mark Bessey    schedule 29.07.2009