2013-04-06 1 views
6

Я работаю над контроллером ARM Cortex-M3 с набором инструкций Thumb-2.ARM Thumb/Thumb-2 performance

Режим большого пальца используется для сжатия команды до 16-разрядного размера. Таким образом, размер кода уменьшается. Но с обычным режимом Thumb, почему это говорит о снижении производительности?

В случае Thumb-2, говорят, производительность повышается в соответствии с этими двумя каналами:

Повышение производительности в тех случаях, когда один 16 -битная инструкция ограничивает функции, доступные компилятору.

Заявленная цель для Thumb-2 заключалась в достижении плотности кода, аналогичной Thumb, с характеристиками, аналогичными инструкциям ARM, установленным в 32-разрядной памяти.

Что это за работа? Может ли кто-нибудь привести несколько примеров, связанных с этим?

+1

Производительность всегда относительна. Существует много случаев, когда код 'thumb' работает лучше, чем' arm'. В основном, если шина памяти является горлышком бутылки. Как правило, 'thumb' не имеет такого количества регистров, поэтому, хотя набор команд более компактен, с некоторыми алгоритмами, ему придется чаще обращаться к памяти, чтобы разливать регистры. –

+1

Если у меня есть грузовик A и грузовик B, который составляет половину от размера A. Если количество поставляемого материала соответствует грузовику A, но оно два больших для грузовика B, то он возьмет грузовик B в два раза больше поездок, чтобы сделать та же самая работа. Thumb не так эффективен, как ARM, это больше похоже на 10-15% больше инструкций, чтобы сделать то же самое, что и ARM. –

+0

См. Также: [Gcc -mthumb vs -marm] Stackoverflow (http://stackoverflow.com/questions/11062936/gcc-mthumb-against-marm) и [Аризонская бумага] (http: //www.cs.arizona .edu/~ arvind/papers/lctes02.pdf) на компиляторах Thumb и ARM. –

ответ

6

При сравнении с 32-разрядным набором команд ARM набор 16-разрядных команд большого пальца (не говоря уже о расширениях большого пальца2) занимает меньше места, потому что инструкции имеют половину размера, но в целом это падение производительности, требуется больше инструкций, чтобы сделать то же самое, что и на руке. В набор команд меньше функций, и большинство инструкций работают только с регистрами r0-r7. Сравнение Яблок с Яблоком больше инструкций для выполнения того же самого действия медленнее.

Теперь thumb2 extensions принимает ранее не заданные инструкции большого пальца и создает 32-битные указатели большого пальца. Поймите, что существует несколько наборов расширений большого пальца. ARMv6m добавляет пару дюжин, возможно. ARMv7m добавляет что-то вроде 150 инструкций к набору команд большого пальца, я не знаю, что такое ARMv8 или будущее. Таким образом, предполагая ARMv7m, они преодолели разрыв между тем, что вы можете делать большим пальцем, и тем, что вы можете сделать в ARM. Таким образом, thumb2 является уменьшенным набором команд ARM как большой палец, но не таким уменьшенным. Таким образом, может потребоваться больше инструкций, чтобы сделать то же самое в thumb2 (предположим плюс большой палец) по сравнению с ARM, делающим то же самое.

Это дает представление о проблеме, одной инструкции в руке и ее эквиваленте в большом пальце.

ARM 

and r8,r9,r10 

THUMB 

push {r0,r1} 
mov r0,r8 
mov r1,r9 
and r0,r1 
mov r1,r10 
and r0,r1 
mov r8,r0 
pop {r0,r1} 

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

mov r0,r1 
and r0,r2 

Тем не менее занимает две команды/циклов выполнения к и два регистра вместе, не изменяя операнды, и поместить результат в третий регистр. Thumb2 имеет три регистра, и поэтому вы возвращаетесь к одной инструкции с помощью расширений thumb2. И эта команда thumb2 позволяет r0-r15 в любом из этих трех регистров, где большой палец ограничен r0-r7.

Посмотрите на Справочное руководство по архитектуре ARMv5, под каждой инструкцией большого пальца отображается эквивалентная инструкция ARM. Затем перейдите к этой инструкции ARM и сравните то, что вы можете сделать с этой инструкцией, которую вы не можете сделать с помощью инструкции большого пальца. Это односторонний путь, в котором указатели большого пальца (не thumb2) имеют отношение «один к одному» с инструкцией ARM.все указатели большого пальца имеют эквивалентную инструкцию руки. но не все инструкции для рук имеют эквивалентную инструкцию большого пальца. Вы должны уметь видеть из этого упражнения ограничение на компиляторы при использовании набора инструкций большого пальца. Затем получите ARMv7m Architectural Reference Manual и посмотрите на набор команд и сравните кодировки «все варианты большого пальца» (те, которые включают ARMv4T), и те, которые ограничены ARMv6 и/или v7, и видят расширение функций между большим пальцем и thumb2, а также указатели большого пальца2, которые не имеют ни малейшего аналога. Это должно разъяснить, что компиляторы должны работать с большим и большим пальцем2. Вы можете пойти так далеко, чтобы сравнить палец + большой палец2 с полностью раздутыми инструкциями ARM (ARMv7 AR - это то, что он называется?). И посмотрите, что thumb2 намного ближе к ARM, но вы теряете, например, условные выражения для каждой команды, поэтому условное выполнение в палец становится сопоставлением с разветвлением над кодом, где в ARM иногда может быть if-then-else без разветвления. .

+0

также очень осторожны, cortex-m3 и cortex-m4 являются ARMv7m, cortex-m0 и -m1 являются ARMv6m, большая разница между расширениями большого пальца2 на этих наборах команд, а также компиляторы перескакивают вперед с помощью cortex-m3 и добавил кучу большого пальца2, и вы не смогли использовать thumb2 на cortex-m0, когда он вышел. Не уверен, что компиляторы (gcc/clang) дошли до конца. Аналогично, cortex-m4 имеет (может иметь) плавающую точку, которая является уменьшенным ароматом Cortex-A, и компиляторы боролись с плавающей точкой на коре-m4, когда она выходила. не уверены, что они догнали –

+0

, если большой палец может получить доступ только к регистру R0-R7 ... тогда как в вашем примере вы используете инструкцию mov на регистре r8, r9 & r10 ... пожалуйста, предложите? – Katoch

+0

* MOST * инструкции для большого пальца некоторые могут, в частности, конкретное перемещение в высоком/низком –

6

Thumb-2 представил инструкции переменной длины оригинальному Thumb; теперь команды могут быть смесью 16-битных и 32-битных. Это означает, что вы сохраняете преимущество размера оригинального Thumb в повседневном коде, но теперь имеете доступ к почти полному набору функций ARM в более сложном коде, но без дополнительных затрат ARM-interworking, ранее понесенных Thumb.

Помимо вышеупомянутого доступа к полному регистровому набору из всех операций с регистрами, Thumb-2 добавляет обратно условное выполнение без разветвления в виде блока IF-THEN (IT). Оригинальный Thumb удалил функцию ARM торговой марки условного исполнения почти по всем инструкциям; это теперь достигнуто в Thumb-2, добавив IT-инструкцию с условиями для четырех следующих команд.

Кроме того, набор инструкций был значительно расширен; например, Cortex-M4F реализует расширение DSP, а также расширение с плавающей запятой FPv4-SP. На самом деле, я считаю, что даже NEON может быть закодирован в Thumb2.

 Смежные вопросы

  • Нет связанных вопросов^_^