Як інструкції Thumb порівнюють із інструкціями ARM щодо продуктивності?


11

Колега зазначив, що інструкції Thumb були значно повільнішими, ніж інструкції ARM (це було для процесора AT91SAM7S32). Це правда? Які переваги ефективності однієї інструкції, встановленої над іншою?

Відповіді:


11

В загальному

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

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

  1. Простір програми часто обмежений
  2. Багато мікроконтролерів мають 16-бітні шини даних для їх внутрішнього спалаху

З другої причини, коли ваш код не вимагає функціональності з набору інструкцій ARM, код THUMB фактично працює швидше. Це тому, що ваша інструкція може бути отримана за один цикл вводу / виводу з спалаху замість двох. Залежно від швидкості вашого інтерфейсу флеш, це друге читання може спричинити один чи більше циклів очікування за інструкцію, коли ваш процесор просто зупинений і нічого не може зробити.

Це стає менш проблемою, якщо ви можете скопіювати свій код в оперативну пам'ять перед виконанням (що я зазвичай розглядаю як 32-розрядний для останніх мікроконтролерів ARM), де єдиною проблемою є щільність коду. Для цього багато інструментів спробують знайти, яке представлення є більш ефективним для даної функції. Якщо компілятор може створити THUMB-код з меншою кількістю інструкцій, він буде, але якщо ARM приведе до меншої кількості інструкцій, ви отримаєте ARM. Це режим за замовчуванням для Keil, якщо я пам'ятаю правильно.

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

Для вашого конкретного чіпа (AT91SAM7S32) в документації зазначається, що флеш-контролер має буфер попереднього вибору, який може передбачити доступ, щоб зробити ефективнішими ефективність, що може покращити виконання інструкцій ARM. Однак він також зазначає, що попередній вибір - це "подвійний 32-бітний" буфер, який "оптимізує 16-бітовий доступ", який найбільш підходить для "запуску в режимі великого пальця", що, схоже, вказує на те, що він не призначений для прискорення роботи Вказівки щодо ARM, але щоб ваше ядро ​​працювало швидше в режимі великого пальця.

З діаграм виходить, що спалах на вашому чіпі насправді має 32-бітну шину даних. Як видається, префетер працює, читаючи цілі 32 біти, даючи 16 процесору (в режимі THUMB) і кешуючи цілі 32 біти. Під час наступного циклу, коли процесор читає другий 16 біт, цього разу з кеша, флеш-контролер зчитує наступні 32 біти і кешує його. Таким чином, THUMB-код може працювати без більше початкового очікування, навіть якщо швидкість спалаху буде трохи меншою, ніж основна швидкість процесора. У розділі 19.2.2 "Операції зчитування" є детальніше.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.