До сих пор компания Arm определяла все инструкции для своих ядер с преимуществом переносимости кода между решениями, поэтому код, скомпилированный для микроконтроллера на основе Arm Cortex-M33, будет работать на другом без изменений (речь идет о коде, работающем непосредственно на ядре).
Но, благодаря архитектуре с открытым исходным кодом RISC-V многие увидели преимущество пользовательских инструкций для конкретных задач, несмотря на риски фрагментации. На проходящей в эти дни Arm Techcon 2019, компания Arm объявила о поддержке пользовательских инструкций для встраиваемых процессоров ARMv8-M, начиная с ядер Arm Cortex-M33.
Внедрение пользовательских инструкций Arm для конкретных встраиваемых приложений и приложений IoT начнется в первом полугодии 2020 года без дополнительных затрат для лицензиатов и без риска фрагментации программного обеспечения с использованием исключения NOCP, если инструкции недоступны.
Сотрудники компании Arm далее объясняют:
Настраиваемые пользовательские инструкции активируются благодаря модификациям ЦП, которые резервируют пространство кодирования для проектировщиков, чтобы легко добавлять пользовательские расширения канала данных при сохранении целостности существующей программной экосистемы. Эта функция вместе с существующим интерфейсом сопроцессора позволяет расширять процессоры Cortex-M33 ускорителями различных типов, оптимизированными для использования в периферийных вычислениях, включая машинное обучение (ML) и искусственный интеллект (AI).
В частности, пользовательские инструкции Arm для Armv8-M добавляют настраиваемый модуль внутри процессора, который имеет тот же интерфейс, что и стандартное арифметико-логическое устройство (ALU) ЦПУ. Существует несколько областей пространства кодирования, доступных для настройки, и вы можете выбрать до восьми областей в зависимости от типа инструкций, которые вы хотите реализовать.
Разработчикам SoC все равно придется следовать классам расширения команд для общего назначения и FPU/M-Profile Vector Extension (MVE). В объявлении приводятся цитаты из STMicro, NXP и Silicon Labs, поэтому, с большой вероятностью, в 2020 или 2021 годах, стоит ожидать нового микроконтроллера Arm Cortex-M33 с пользовательскими инструкциями от этих компаний.
Вот пример кода (функция подсчета населения), который можно оптимизировать с помощью пользовательских инструкций:
1 2 3 4 5 6 7 |
int popcount(uint32_t x) { int n = 0; for (int i = 0; i < 32; ++i) { n += (x >> i) & 1; } return n; } |
Рукописная, оптимизированная сборка будет выглядеть следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 |
MOV.W r1, #0x55555555 AND.W r1, r1, r0, LSR #1 SUBS r0, r0, r1 MOV.W r1, #0x33333333 AND.W r1, r1, r0, LSR #2 BIC r0, r0, #0xCCCCCCCC ADD r0, r1 MOV.W r1, #0x01010101 ADD.W r0, r0, r0, LSR #4 BIC r0, r0, #0xF0F0F0F0 MULS r0, r1, r0 LSRS r0, r0, #24 |
Этот код может быть заменен одной пользовательской инструкцией, которая экономит место, повышает производительность и эффективность, выполняя всего один цикл:
1 |
CX1A p0, r0, #0 // population in r0, return r0 |
Более подробную информацию, включая технические документы, можно найти на странице продукта
Выражаем свою благодарность источнику из которого взята и переведена статья, сайту cnx-software.com.
Оригинал статьи вы можете прочитать здесь.