Как инструкции Thumb сравниваются с инструкциями ARM по производительности?

11

Коллега упомянул, что инструкции Thumb были значительно медленнее, чем инструкции ARM (это было для процессора AT91SAM7S32). Это правда? Каковы преимущества производительности одной инструкции над другой?

Патрик
источник

Ответы:

11

В общем

Насколько мне известно, инструкции THUMB не являются более медленными, чем инструкции ARM, а скорее ограничены в возможностях. Если вашему коду требуется только функциональность инструкций THUMB, он будет занимать меньше места, чем ARM, но будет иметь такое же количество инструкций и при прочих равных условиях выполняться с той же скоростью. Если вашему коду требуется больше функциональности, чем для выполнения команд THUMB, чем для выполнения инструкций ARM, потребуется больше времени, при прочих равных условиях (см. Ниже)

THUMB популярен в микроконтроллерах из-за меньшего размера инструкции по двум причинам:

  1. Пространство программы часто ограничено
  2. Многие микроконтроллеры имеют 16-битные шины данных для внутренней флэш-памяти.

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

Это становится меньшей проблемой, если вы можете скопировать свой код в ОЗУ перед выполнением (которое я обычно рассматривал как 32-битный для последних микроконтроллеров ARM), где единственная проблема - плотность кода. Для этого многие инструменты будут пытаться найти, какое представление более эффективно для данной функции. Если компилятор может генерировать код THUMB за меньшее количество инструкций, это произойдет, но если ARM приведет к меньшему количеству инструкций, вы получите ARM. Это режим по умолчанию для Кейла, если я правильно помню.

Ваш конкретный чип

Для вашего конкретного чипа (AT91SAM7S32) в документации упоминается, что контроллер флэш-памяти имеет буфер предварительной выборки, который может предсказать доступ для повышения эффективности, что может улучшить выполнение инструкций ARM. Однако в нем также говорится, что предварительная выборка представляет собой «двойной 32-разрядный» буфер, который «оптимизирует 16-разрядный доступ», который наиболее подходит для «работы в режиме большого пальца», что, по-видимому, указывает на то, что он не предназначен для ускорения Инструкции ARM, но чтобы ваше ядро ​​работало быстрее в режиме THUMB.

Из диаграмм видно, что флэш-память на вашем чипе на самом деле имеет 32-битную шину данных. Похоже, что prefetcher работает, считывая целые 32 бита, давая 16 процессору (в режиме THUMB) и кэшируя целые 32 бита. В течение следующего цикла, когда ЦП читает вторые 16 бит, на этот раз из кеша, контроллер флэш-памяти читает следующие 32 бита и кэширует их. Таким образом, код THUMB может выполняться без первоначального ожидания, даже если скорость флэш-памяти будет немного ниже скорости ядра процессора. Раздел 19.2.2 «Операции чтения» содержит более подробную информацию.

Поскольку ваша флэш-память - это 32-битная шина (насколько я могу судить), если ваш процессор и флэш-часы одинаковы, THUMB даст вам плотность кода только по ARM. Если вы хотите, чтобы ядро ​​вашего процессора работало быстрее, чем Flash (и обратите внимание, я не рассмотрел все временные характеристики этого чипа; я предполагаю, что процессор может работать быстрее, потому что они позволяют устанавливать состояния ожидания), чем предварительная выборка дает скорость Преимущество THUMB за счет уменьшения фактического доступа к флэш-памяти. Однако это преимущество в скорости является преимуществом для каждой инструкции. Если количество команд THUMB против команд ARM достаточно велико, это перевесит скорость на инструкцию, в результате чего ARM будет иметь более высокую скорость для каждой процедуры.

Джон ОМ.
источник