Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Я не знаю об 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).

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

Ответ 3

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

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

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