Почему ARM имеет 16 регистров?
Почему ARM имеет только 16 регистров? Это идеальное число?
расстояние регистров с большим количеством регистров также увеличивает время обработки / мощность ?
5 ответов
поскольку количество регистров общего назначения становится меньше, вам нужно начать использовать стек для переменных. Использование стека требует дополнительных инструкций, поэтому размер кода увеличивается. Использование стека также увеличивает количество обращений к памяти, что снижает производительность и энергопотребление. Компромисс заключается в том, что для представления большего количества регистров вам нужно больше битов в вашей инструкции, и вам нужно больше места на чипе для файла регистра, что увеличивает требования к питанию. Вы можете видеть различия в количестве регистров влияют на размер кода и частоту инструкций загрузки/хранения путем компиляции одного и того же набора кода с различным количеством регистров. Результат этого вида упражнений можно увидеть в таблице 1 настоящего документа:
Расширяемый Набор Команд Computing
Register Program Load/Store
Count Size Frequency
27 100.00 27.90%
16 101.62 30.22%
8 114.76 44.45%
(они использовали 27 в качестве базы, потому что это количество GPRs, доступных на процессоре MIPS)
Как вы можете видеть, есть только незначительные улучшения в размере обеих программ и количестве загрузки / магазинов, необходимых при падении регистра до 16. Реальные штрафы не срабатывают, пока вы не опуститесь до 8 регистров. Я подозреваю, что дизайнеры ARM считали, что 16 регистров были своего рода сладким местом, когда вы искали лучшую производительность на ватт.
чтобы выбрать один из 16 регистров, вам понадобится 4bit, поэтому может быть, что это лучшее совпадение для опкодов (машинных команд), иначе вам придется ввести более сложный набор инструкций, что приведет к большему кодеру, который подразумевает дополнительные затраты (время выполнения).
Википедия говорит, что он имеет " фиксированную ширину инструкции 32 бит для облегчения декодирования и конвейеризации" так что это разумный компромисс.
бит ARM 32 имеет 16 регистров, потому что он использует только 4 бита для кодирования регистра, а не потому, что 16-идеальное число. Аналогично x86 имеет только 8 регистров, потому что в истории они используют только 3 бита для кодирования регистра, чтобы некоторые инструкции вписывались в байт.
Это такое ограниченное число, поэтому x86 или ARM при переходе на 64 бит удваивается до 16 и 32 регистров соответственно. Старая кодировка инструкции ARM не имеет оставшегося бита, достаточного для большего регистра поэтому они должны сделать компромисс, отбросив возможность выполнять почти каждую инструкцию условно и использовать 4-битное условие для новых функций.
еще в 80 - х годах (IIRC) была опубликована академическая статья, в которой рассматривался ряд различных рабочих нагрузок, сравнивая ожидаемые выгоды от производительности различного количества регистров. Это было в то время, когда процессоры RISC переходили от академических идей к основному оборудованию, и было важно решить, что было оптимальным. Процессоры уже опережали память в скорости, и RISC делал это хуже, ограничивая режимы адресации и имея отдельную нагрузку и хранилище инструкции. Наличие большего количества регистров означало, что вы можете "кэшировать" больше данных для немедленного доступа и, следовательно, меньше обращаться к основной памяти.
учитывая только степени двух, было обнаружено, что 32 регистра были оптимальными, хотя 16 не сильно отставали.
ARM уникален тем, что каждый из регистров может иметь условный код выполнения, избегая тестов и ветвей. Не забывайте, что многие 32 регистра машины фиксируют R0 до 0, поэтому условные тесты выполняются по сравнению с R0. Я знаю это по опыту. 20 лет назад мне пришлось программировать пол "Mode 7" (из терминологии SNES). Процессоры были SH2 для 32x (или, скорее, 2 из них), MIPS3000 (Playstation) и 3DO (ARM), внутренний цикл кода был 19,15 & 11. Если бы 3DO работал с той же скоростью как и другие 2, было бы в два раза быстрее. А так все шло немного медленнее.