2009-07-29 10 views
25

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

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

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

+2

Ooh Случайный -1 голос без объяснения причин. Хороший. – Justicle

+3

Wow другой. Классные усилия людей - мы все много учимся. – Justicle

+0

+1 - Кажется, мне нужен разумный вопрос (только я вернусь к нулю, хотя я боюсь ...) –

ответ

13

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

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

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

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

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

Нижняя линия ... тест, тест, тест.

EDIT:

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

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

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

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

+0

+1 Благодарю вас за понимание LLVM. – slf

+0

Можете ли вы подробно остановиться на этом? «НЕ ОПТИМИЗАЦИЯ на шаге C до байт-кода, затем НЕ оптимизируя байт-код в отдельности, но оптимизируя после слияния файлов байт-кода в один большой (ger).Оптимизация llc на пути к руке привела к лучшим результатам ». – slf

+0

У iPhone 3GS есть Cortex-A8, который поддерживает Thumb-2. Однако я не знаю, сможет ли Xcode использовать его. Можете ли вы настроить таргетинг на конкретная версия iPhone? –

4

См. Этот PDF-документ от ARM/Thumb для компромиссов по производительности/коду/потребляемой мощности.

Profile Guided Selection of ARM and Thumb Instructions
      - Факультет компьютерных наук, Университет штата Аризона Раджив Гупта

+0

Ссылка на самом деле не ответ, но я обновил ее с хорошей ссылкой. –

+0

Он заключает, что ARM-код генерирует большой код, более высокую энергию I-cache, но быстрее; Thumb code генерирует небольшой код, низкий уровень I-cache, но медленнее. –

+0

Хорошо, но это бумага 2002 года ... – Antonio

1

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

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

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