Ядро процессора Cortex-A8
Характеристики ядра:
архитектура ARMv7;
двойной симметричный конвейер с упреждающей выборкой;
суперскалярное ядро;
13-ступенчатый конвейер;
кэш-память-память второго уровня, емкость кэш-памяти второго уровня - от 64К байт до 2М байт;
ряд фирменных подсистем (Jazelle, TrustZone и так далее);
ориентировано на задачи, требующие достаточно высокого быстродействия (на уровне 2000 MIPS Dhrystone) при невысоком энергопотреблении и тепловыделении.
ядро Cortex-A8 работало при частотах до 1 ГГц;
65-нм технологический процесс;
максимальное энергопотребление составляло 300 мВт.
Структура ядра Cortex-A8 приведена на рис. 32.3.
Рис. 32.3. Структура ядра Cortex-A8
В ядре реализована система команд Thumb 2 (обеспечивалась "упаковка" 32-разрядных команд в 16-разрядные, что уменьшало размер программ и важно при подготовке модулей, записываемых в постоянную память). Уменьшение размера программ при использовании режима Thumb 2 связано с внесением в систему команд ряда дополнительных команд (около 130 команд). Поскольку Thumb - 16-разрядная система команд, на которую отображается основное подмножество 32-разрядных команд ARM, но поскольку оставались "неэмулируемые" команды, приходилось писать дополнительные программы для реализации тех действий, которые решает единственная 32-разрядная команда.
Важнейшая особенность - отсутствие необходимости переключаться между режимами ARM и Thumb при обработке прерываний и доступ к полному набору регистров. В итоге сохраняется малый размер программ, свойственный режиму Thumb, и скорость, как правило, на уровне программ с 32-разрядными командами ARM.
Сопроцессор NEON предназначался для повышения быстродействия при обработке потоковых данных. У него была собственная система команд, с собственным набором регистров и конвейером. Она позволяла обрабатывать как целочисленную арифметику, так и с плавающей точкой, возможность загрузки структурированных данных (допускалась работа с данными, не выровненными по границам машинного слова, байта и т. д.).
Средства Jazelle RCT обеспечивали снижение размера Java-программ (до 70%) за счет динамического преобразования (JIT) байт-кода (что закономерно повышало скорость и снижало энергопотребление).
TrustZone - традиционная для ARM система реализации защиты. Фактически она позволяла динамически переключать процессор в "безопасный" режим и общий, причем в первом допускалось выполнение только "безопасных" программ (например, размещенных в заранее заданном блоке).
Улучшена подсистема вычислений с плавающей точкой (версия VFPv3). В частности, до 32 увеличено число регистров для вычислений с двойной точностью, реализованы команды для преобразования чисел с плавающей и фиксированной точкой.
С технической точки зрения одной из наиболее существенных особенностей была система "статического планирования" для суперскалярного конвейера.
Конвейер - 13-ступенчатый, на протяжении работы собиралась статистика, которая затем использовалась при предсказании ветвлений (размещалась в буфер меток перехода и глобальный буфер хронологии). Кроме ветвлений, прогнозировался и стек возвращения (для прогнозирования адресов возврата из подпрограмм).
Схема кэш-памяти была достаточно сложна, но главный эффект в росте производительности обеспечивало появление кэш-памяти второго уровня. Благодаря этой кэш-памяти удалось существенно снизить не только количество обращений к оперативной памяти и число циклов ожидания (с этим вполне справлялся и кэш-память первого уровня), но и число конфликтов на главной системной шине.
Обработка команд сопроцессора NEON начиналась в конце главного конвейера (соответственно, все предсказания ветвлений, результаты операции и прочее уже отработаны), и, что важнее, все необходимые данные уже находятся в кэш-памяти первого уровня.
Средства буферизации данных между блоками ядра и сопроцессором NEON также позволяли нивелировать влияние многоступенчатой буферизации при изменении содержимого кэш-памяти (для потоковых данных это могло быть критично). Сам модуль NEON не связан с главным целочисленным конвейером ядра.
Подсистема выполнения команд позволяла выбирать до двух правильных команд сопроцессора NEON за цикл, в сопроцессоре NEON имелась 128-разрядная шина и собственные средства работы с кэш-памятью, а также три целочисленных конвейера SIMD, конвейер загрузки, два конвейера для вычислений с плавающей точкой (с одинарной точностью) и модуль векторных вычислений. Вычисления велись скалярно, поскольку логика предсказания ветвлений и обработки неправильных предсказаний в этом случае привела бы к потере производительности.