Bagaimana cara membandingkan instruksi Thumb dengan instruksi ARM untuk kinerja?

11

Seorang kolega menyebutkan bahwa instruksi Thumb secara signifikan lebih lambat daripada instruksi ARM (ini untuk prosesor AT91SAM7S32). Apakah ini benar? Apa manfaat kinerja dari satu instruksi yang ditetapkan atas instruksi lainnya?

Patrick
sumber

Jawaban:

11

Secara umum

Instruksi THUMB tidak sepengetahuan saya secara intrinsik lebih lambat dari instruksi ARM, tetapi lebih terbatas dalam kemampuan. Jika kode Anda hanya membutuhkan fungsionalitas instruksi THUMB, itu akan menempati ruang lebih sedikit daripada ARM, tetapi akan menjadi jumlah instruksi yang sama dan, hal-hal lain dianggap sama, berjalan pada kecepatan yang sama. Jika kode Anda membutuhkan lebih banyak fungsi, daripada itu akan membutuhkan lebih banyak instruksi THUMB daripada instruksi ARM untuk dieksekusi dan akan memakan waktu lebih lama, lagi hal-hal lain dianggap sama (lihat di bawah)

THUMB populer di mikrokontroler karena instruksi ukurannya lebih kecil karena dua alasan:

  1. Ruang program seringkali terbatas
  2. Banyak mikrokontroler memiliki bus data 16-bit ke flash internal mereka

Untuk alasan kedua, ketika kode Anda tidak memerlukan fungsionalitas dari set instruksi ARM, kode THUMB sebenarnya berjalan lebih cepat. Ini karena instruksi Anda dapat diambil dalam satu siklus I / O dari flash bukan dua. Bergantung pada kecepatan antarmuka flash Anda, pembacaan kedua dapat menimbulkan satu atau lebih siklus menunggu per instruksi di mana CPU Anda hanya terhenti dan tidak dapat melakukan apa-apa.

Ini menjadi kurang masalah jika Anda dapat menyalin kode Anda ke RAM sebelum mengeksekusi (yang biasanya saya lihat sebagai 32-bit untuk mikrokontroler ARM baru-baru ini), di mana satu-satunya masalah adalah kepadatan kode. Untuk itu, banyak alat akan mencoba menemukan representasi mana yang lebih efisien untuk fungsi yang diberikan. Jika kompiler dapat menghasilkan kode THUMB dalam instruksi yang lebih sedikit, tetapi jika ARM menghasilkan lebih sedikit instruksi, Anda mendapatkan ARM. Ini adalah mode default untuk Keil, jika saya ingat dengan benar.

Chip spesifik Anda

Untuk chip khusus Anda (AT91SAM7S32) dokumentasi menyebutkan bahwa pengontrol flash memiliki buffer prefetch yang dapat memprediksi akses untuk membuat hal-hal lebih efisien, yang dapat meningkatkan eksekusi instruksi ARM. Namun, ini juga menyatakan bahwa prefetch adalah buffer "dual 32-bit" yang "mengoptimalkan akses 16-bit" yang paling cocok untuk "running in Thumb mode", yang tampaknya mengindikasikan bahwa itu tidak dimaksudkan untuk mempercepat Instruksi ARM, tetapi untuk memungkinkan core Anda berjalan lebih cepat dalam mode THUMB.

Dari diagram, sepertinya flash pada chip Anda sebenarnya memiliki bus data 32bit. Prefetcher tampaknya bekerja dengan membaca seluruh 32bits, memberikan 16 ke CPU (dalam mode THUMB) dan caching seluruh 32bits. Selama siklus berikutnya, ketika CPU membaca 16 bit kedua, kali ini dari cache, pengontrol flash membaca 32 bit berikutnya dan menyimpannya. Dengan cara ini, kode THUMB dapat berjalan tanpa menunggu lebih awal bahkan jika kecepatan flash akan sedikit lebih lambat dari kecepatan inti CPU. Bagian 19.2.2 "Baca Operasi" memiliki rincian lebih lanjut.

Karena flash Anda adalah bus 32-bit (sedekat yang saya tahu), jika jam CPU dan Flash Anda sama, THUMB hanya akan memberi Anda kepadatan kode lebih dari ARM. Jika Anda ingin inti CPU Anda berjalan lebih cepat dari Flash (dan perhatikan, saya tidak meninjau semua waktu dari chip ini; Saya berasumsi CPU dapat berjalan lebih cepat karena mereka membiarkan Anda mengatur status menunggu), daripada prefetch memberikan kecepatan keuntungan untuk THUMB karena pengurangan akses flash yang sebenarnya. Namun, keunggulan kecepatan itu adalah keunggulan per-instruksi. Jika jumlah instruksi THUMB vs instruksi ARM cukup besar, itu akan melebihi kecepatan per instruksi sehingga ARM memiliki kecepatan per-rutin yang lebih cepat.

John O'M.
sumber