Сегодня MIPS стал Open Source, против RISC-V и ARM. Как Россия повлияла на стратегию американской процессорной компании
То, о чем говорили сторонники Open Source с 1980-х — свершилось! Сегодня архитектура процессоров MIPS стала Open Source. Учитывая, что такие компании как Broadcom, Cavium, китайский ICT и Ingenic платили MIPS за архитектурную лицензию (право сделать совместимую по системе команд микроархитектурную реализацию) миллионы долларов (иногда более десяти миллионов), это историческая веха. Теперь у RISC-V нет преимущества в этом аспекте, да и ARM придется оправдываться. У MIPS до сих пор есть технические преимущества перед RISC-V — лучшая плотность кода у nanoMIPS, лучшая поддержка аппаратной многопоточности, лучшие бенчмарки на high-end ядрах, более полная экосистема. И 8 миллиардов выпущенных чипов на основе MIPS.
Вот команда разработчиков 64-битного процессорного ядра MIPS I6400 «Samurai» и MIPS I6500 «Daimyo» в Сан-Франциско. Это ядро лицензировала в частности японская компания автомобильной электроники DENSO, поставщик Тойоты:
А вот представители российской компании ЭЛВИС-НеоТек вместе с русскими, украинскими и казахстанским разработчиком ядер MIPS и софтвера для него. ЭЛВИС-НеоТек является как лицензиатом ядер MIPS, так и разработчиком собственного по микроархитектуре ядра, совместимого с архитектурой MIPS. А также аппаратных блоков видео-обработки и алгоритмов распознавания:
Российское MIPS-коммьюнити оказано непосредственное влияние на этот шаг:
Сегодня я разговаривал с президентом MIPS Артом Свифтом. До нынешнего поста Арт был вице-председателем комитета по маркетингу RISC-V, вице-президентом Sun, DEC и Cirrus Logic. Я спросил у Арта, чем же отличается Open MIPS от не ставшего популярным Open SPARC.
Арт ответил, что Sun Microsystems была открытой только на словах и не очень любила строить коммьюнити. А вот мы в Open MIPS будем заниматься именно построением коммьюнити. Причем методы построения всемирного коммьюнити будут основаны на опыте строительства MIPS-коммьюнити в России (!), а точнее на работе с российскими компаниями (ЭЛВИС-НеоТек, Байкал Электроникс, НИИСИ, НИИМА Прогресс) и университетами, которые проводили семинары по MIPSfpga (МИЭТ, МФТИ, ИТМО, МИФИ, МГУ, СГАУ, НГТУ, ТГУ, КПИ и другие).
Немного истории. Истоки MIPS — в Стенфорде начала 1980-х годов. В 1984 году была основана компания MIPS Computer Systems, которая потом неоднократно меняла владельцев (Silicon Graphics, MIPS Technologies, Imagination Technologies, Wave Computing). В том же 1984 году возникла и компания ARM. Вот основатель MIPS Джон Хеннесси с первым чипом:
Впоследствие MIPS использовался в ранних игровых приставках Nintendo64 и Sony Playstation. Вот девушка Ирина в музее компьютеров рядом с рабочими станциями Silicon Graphics, которые использовались для съемок первых реалистично-графических голливудских фильмов, включая «Парк Юрского Периода». Эти же компьютеры упомянуты в романе русского писателя Виктора Пелевина «Поколение П». Внутри — процессор MIPS R4000:
А вот — встреча в прошлом году в Москве участников семинаров по MIPSfpga, образовательной программы, в которой университетские исследователи могут модицифировать реальный промышленный процессор MIPS interAptiv UP, синтезировать его для ПЛИС и посмотреть, как он работает, в том числе в потактовом режиме. В центре — Роберт Оуэн, менеджер образовательных программ Imagination Technologies, слева от него — Станислав Жельнио, автор российского учебного ядра schoolMIPS (его можно найти на GitHub):
В вот российский компьютер на основе процессора КОМДИВ-64, с вариантом архитектуры MIPS + спроектированной в России микроархитектурой + разработанными в России векторными расширениями архитектуры:
А вот Максим Горбунов, менеджер из НИИСИ, где был спроектирован КОМДИВ-64. Максим — второй слева, между специалистом по образовательным программам из российского Самсунга Татьяной Волковой и специалистом по образованию школьников из МФТИ Андреем Огневым:
Вот в офисе лицензиата MIPS Байкал Электроникс. Процессор Байкал-Т1 на основе MIPS P5600 «Apache» используется сейчас в российских контроллерах станков и сетевых устройствах:
А вот в Киевском Политехническом Институте на хакатоне MIPSfpga. Победители этого хакатона впоследствие получили бронзу на европейском финале конкурса Innovate FPGA, организованного Интелом:
Этот хакатон также вошел в презентации и статьи про практику MIPSfpga в университетах:
MIPS вдохновил создателей специализированных вычислительных устройств, например David Wentzlaff, который читает курс по продвинутой процессорной архитектуре в Принстоне и на Курсере:
Устройство, которое разработано Девидом, предстваляло из себя сетку (mesh) из 64 процессоров. Интересно, что сейчас Wave Computing, компания, частью которой является MIPS, тоже работает над сеткой, но из десятков тысяч процессорных элементов. Эта архитектура предназначена для ускорителя нейросетей, чипа на 7 нанометров, который Wave Computing разрабатывает совместно с Broadcom. Вот в офисе Wave Computing в Campbell, California. Слева специалист по функциональной верификации и UVM Jon Wang, а справа старший директором по Custom Design Steve Dilbeck. Стив — большой авторитет в asynchronous design, dynamic logic и разных эффектах на уровне транзисторов, когда размеры опускаются до 7 нанометров, а частоты поднимаются выше 6 гигагерц:
Архитектура процессоров. MIPS, Sparc, ARM и PowerPC
Архитектура PowerPC лежит в основе процессоров Playstation 3 и xBox 360. Ни MIPS, ни ARM на эту роль не годятся, процессоры Intel тоже, а об AMD и говорить не приходится.
Продолжение статьи об истории развития архитектур процессоров. Чтение лучше начать с первой части.
MIPS-архитектура: «Pentium 4» восьмидесятых годов
Регистровые окна SPARC
Условные инструкции ARM
Архитектура ARM (Advanced RISC Machines) разработана в 1983-85 годах в компании Acorn Computers. Команда Роджера Вильсона и Стива Фербера взяла за основу набора инструкций ARM некогда популярный, а ныне забытый процессор MOS Technology 6502 и снабдила его специальным четырехбитным кодом условия, которым можно было дополнить любую инструкцию.
Если (условие) то Выполнить1 иначе Выполнить 2
вместо того, чтобы записать традиционную конструкцию
2. Если условие выполнено, то идти к 5
используя условные инструкции, можно записать
1. Вычислить условие и поставить Флаг1 по результатам вычисления
2. Выполнить1 при условии выставленного Флаг1
3. Выполнить2 при условии невыставленного Флаг1
Еще ряд дополнений в ARM предусматривал введение инструкций, одновременно выполняющих несколько простых операций, тем самым избавляя регистры процессора от необходимости сохранять результаты промежуточных вычислений и увеличивая вычислительную плотность кода. Этот подход нетипичен для RISC-процессоров, поскольку плохо вписывается в «основную идею» их максимального упрощения, но в конечном счете он привел к тому, что процессоры Acorn при прочих равных получили большую производительность на единицу частоты. Конечно, ARM-подход тоже имеет недостатки (например, необходимость выполнять пустые инструкции), однако в общем и целом он позволяет создавать очень простые процессоры с очень хорошей производительностью.
MIPS (сокращение от названия соответствующего проекта Стэнфордского университета англ. Microprocessor without Interlocked Pipeline Stages [1] ) — система команд и микропроцессорных архитектур, разработанных компанией MIPS Computer Systems (в настоящее время Wave Computing [2] ) в соответствии с концепцией проектирования процессоров RISC (то есть для процессоров с упрощенным набором команд). Ранние модели процессора имели 32-битную структуру, позднее появились его 64-битные версии. Существует множество модификаций процессора, включая MIPS I, MIPS II, MIPS III, MIPS IV, MIPS V, MIPS32 и MIPS64, из них действующими являются MIPS32 (для 32-битной реализации) и MIPS64 (для 64-битной реализации). MIPS32 и MIPS64 определяют как набор регистров управления, так и набор команд.
Существует несколько наборов команд: MIPS32, MIPS64, microMIPS и nanoMIPS. Помимо этого, доступны дополненные наборы инструкций и модели процессоров, например, MIPS-3D, включающий в себя набор SIMD-команд для обработки чисел с плавающей запятой, предназначенный для решения простых 3D-задач, MDMX (MaDMaX) — с ещё более широкими возможностями — набором SIMD-команд и использующий 64-битные регистры с плавающей запятой для работы с целыми числами, MIPS16e, который сжимает поток команд, чтобы уменьшить объём памяти, занимаемый программами, а также MIPS MT, обеспечивающий многопотоковый режим обработки.
Архитектуру MIPS часто изучают в программе курса «Компьютерная архитектура» в университетах и технических лицеях. Эти процессоры значительно повлияли на более поздние RISC-архитектуры, в частности на Alpha.
В настоящее время различные реализации MIPS используются в основном во встроенных системах, например, в смартфонах, маршрутизаторах, шлюзах, а также до 2010-х в игровых консолях, таких, как Sony PlayStation 2 и Sony PlayStation Portable. До конца 2006 года они применялись и в компьютерах SGI. К концу 1980-х и 1990-х эта архитектура широко использовалась многими компаниями, среди них Digital Equipment Corporation, NEC, Pyramid Technology, Siemens Nixdorf и Tandem Computers. С середины до конца 1990-х годов каждым третьим микропроцессором на рынке был процессор под управлением MIPS.
От выбора архитектуры процессора зависит производительность, а также время разработки и стоимость устройства. В статье подробно описана архитектура MIPS32 ядер М4К и М14К. Сравнение архитектур MIPS32 и Cortex-M показывает преимущества первой.
Архитектура MIPS
Архитектура MIPS впервые была применена в процессоре R2000 в 1985 г. C тех пор она претерпела ряд изменений и сейчас изготавливается в двух вариантах: 32- и 64-рарядном, MIPS32 и MIPS64, соответственно.
В основе MIPS лежит гарвардская архитектура и набор команд RISC. Конвейер содержит 5 уровней (см. рис. 1) и логические схемы, обеспечивающие еще до завершения обработки инструкции быстрый доступ к данным, которые используются следующей инструкцией. Все арифметические и сдвиговые операции выполняются за один цикл. Для ускорения отдельных процессов предусмотрены опциональные специализированные расширения, в число которых входят MIPS16e, SmartMIPS, блок многопотоковых вычислений и модули обработки сигнала и объемного изображения.
Рис. 1. Структура конвейера в архитектуре MIPS32: I – выбор команды (доступ к памяти команд I-SRAM и флеш-памяти); E – выполнение ( чтение файла регистров, АЛУ); M – доступ к памяти данных (D-SRAM); A – выравнивание/накопление; W – обратная запись в файл регистров
Высокое быстродействие MIPS32 отчасти достигается за счет использования высокоскоростных интерфейсов памяти SRAM, кэш-контроллеров с высокой эффективностью и блоков распределения памяти, а также наличия большого набора регистров и ускорителей, выполняющих операции с плавающей запятой. Регистры делятся на два класса: стандартные общего назначения (РОН) и дополнительные для хранения данных или использования в качестве «теневых» регистров, которые привязываются к контроллеру прерывания, чтобы уменьшить время реакции на событие и время переключения между программным и аппаратным обеспечением.
Обработка сигналов улучшена за счет аппаратного блока деления и умножения (MDU) с программной поддержкой инструкций умножения со знаком и без, инструкций деления и умножения с накоплением (МАС). Для команд MDU предусмотрен отдельный конвейер, и они выполняются параллельно с целочисленными операциями. Блок MDU позволяет ускорить вычисление таких функций как БПФ, КИХ или БИХ. Например, МК PIC32 обрабатывает 256 выборок БПФ за 22 тыс. циклов, затрачивая 83 мкс при частоте 80 МГц. Микроконтроллеру STM32 на основе Cortex-M3 для выполнения этих же операций понадобится на 14% больше циклов.
Ядро М4К
Ядро М4К на базе MIPS32 превосходит процессоры ARM семейства Cortex-M по производительности, экономичности расхода энергии и компактности кристалла. Попробуем разобраться, за счет чего удалось этого достичь.
Во-первых, в ядре М4К предусмотрена возможность увеличения количества РОН до 16 наборов по 32 регистра. Эти регистры используются для хранения параметров и значений операндов на кристалле, чтобы уменьшить количество пересылок в модуль памяти и тем самым сократить количество циклов, повысить быстродействие. Регистры общего назначения могут также использоваться в качестве «теневых» для ускорения обработки прерываний.
При обработке прерывания или исключения ЦП определяет, какой из теневых наборов следует использовать. Выбранный набор переводится в активное состояние, после чего вектор прерывания продолжает выполнение. При этом не требуется ни сохранение контекста, ни выполнение восстановления, поскольку только подпрограмма прерывания имеет доступ к активному в текущий момент регистру. Соответственно, сокращается время обработки прерывания и уменьшается количество обращений к памяти, т.к. содержимое регистров сохраняется после обработки предыдущего прерывания или исключения, и загрузка значений из SRAM не производится.
Повышение производительности обеспечено за счет блока MDU и быстродействующей памяти SRAM, доступ к которой осуществляется с малой задержкой. Ядро М4К выполняет операции умножения с накоплением и умножения 32×16 за один цикл, а 32×32 — за 2 цикла. Как мы упоминали выше, благодаря отдельному функциональному блоку, работающему независимо от конвейера, операции умножения и деления выполняются параллельно арифметическим и сдвиговым.
Адресное пространство памяти разделено на область данных D-SRAM и область инструкций I-SRAM, что позволяет одновременно выполнять транзакции с инструкциями и данными. При желании эти области можно объединить, переведя модуль памяти в соответствующий режим (Unified).
В отличие от ARM, где нет возможности управления памятью, интерфейс I-SRAM позволяет использовать память программ для хранения энергонезависимых данных. Также SRAM позволяет прерывать длительные транзакции или отменять выполнение транзакции на любой стадии конвейера и мгновенно реагировать на внешние события, такие как исключения и прерывания (EJTAG).
Еще одна уникальная особенность MIPS32 — аппаратно-программный модуль CorExtend, позволяющий добавлять собственные устройства и расширять набор инструкций пользовательскими командами UDI. Это позволяет осуществлять тонкую оптимизацию всех «проблемных» мест системы, ускорив работу приложения. Например, с помощью CorExtend можно реализовать блок обработки графики, TCP/IP ускоритель, логические схемы безопасности и криптографии, беспроводное управление или интерфейс реального времени.
Модульность архитектуры М4К делает ее очень гибкой. Из большого количества опциональных блоков можно выбрать нужные, сократив количество вентилей и, соответственно, размер кристалла и энергопотребление. К таким блокам относятся модуль отслеживания и отладки (EJTAG), интерфейс для сопроцессора и расширения CorExtend. Кроме того, предусмотрены возможности подключения и отключения функций отладки, установки точек останова, а также выбор количества файлов регистров, скорости работы MDU и типа интерфейса SRAM. Все это позволяет варьировать характеристики ядра, в первую очередь быстродействие, в широких пределах.
Немаловажное значение имеет набор аппаратных и программных инструментов, которые предлагаются производителем для упрощения разработки, ускорения тестирования и оценки конечного проекта. Среди них можно отметить отладочный щуп EJTAG System Navigator™, набор инструментов GNU с поддержкой ОСРВ и Linux, симуляторы Cycle Accurate и Instruction Accurate, оценочные платы и пакет Navigator Integrated Component Suite. Помимо этого компания MIPS Technologies предлагает программную среду разработки с поддержкой всего спектра инструментов для MIPS. Наконец, создано сообщество сторонних производителей средств разработки. Вместе эти инструменты обеспечивают всестороннюю и полную поддержку проектирования на базе MIPS.
Сравнение архитектур ARM и MIPS
Оба ядра MIPS32 и ARM Сortex-M имеют 32-разрядную шину данных и сокращенный набор команд RISC. Однако на этом их сходство кончается. Изначально компания MIPS Technologies занималась разработкой высокопроизводительных рабочих станций и серверов, в то время как ARM начинала как разработчик процессоров для мобильных аппаратов начального уровня.
По сравнению с семействами ARM Сortex-M процессоры M4K имеют более высокое быстродействие. Частично это обусловлено более эффективной структурой набора команд (ISA — instruction set architecture) и оптимизированными программными средствами, но в большей степени это достигается за счет самой архитектуры MIPS. Перечислим основные различия между ядрами.
1. Процессоры MIPS имеют 32 встроенных регистра общего назначения, ARM — только 16.
2. В процессорах MIPS предусмотрены «теневые» регистры, позволяющие ускорить функции сохранения и восстановления при обработке прерываний. Соответственно, на контекстное переключение уходит меньше циклов.
3. В архитектуре MIPS большая часть команд содержит только одну операцию, а инструкции ARM выполняют несколько операций перед записью в регистр (смена операнда, проверка бита состояния и др.). За счет этого MIPS имеет более высокую тактовую частоту.
4. В MIPS более простая система адресов, за счет чего также повышается рабочая частота.
5. В процессорах ARM широко используются предсказатели ответвлений, что усложняет логические схемы и замедляет работу. В архитектуре MIPS они не требуются, поскольку конвейер содержит 5 уровней, а не 3, как в ARM.
6. В отличие от MIPS, в ARM не предусмотрена отложенная передача управления, поэтому при меньшей глубине конвейера обеспечивается более высокая эффективность.
7. Архитектура MIPS реализована как в 32-, так и в 64-разрядном варианте, что обеспечивает полную совместимость устройств с предыдущими поколениями.
Как показывает тестирование в от- крытой среде CoreMark [1], микроконтроллер PIC32 с ядром М4К обгоняет микроконтроллеры NXP и STMicroelectronics на базе ядра Cortex-M3 на 20—50%, а МК NXP на основе Cortex-M0 — на 63%, даже несмотря на то, что М4К выполняет два цикла ожидания при обращении к памяти, а Cortex-M — ни одного. Скорость работы М4К достигает 1,5 DMIPS/МГц, в то время как Cortex-M3 выполняет до 1,25 DMIPS/МГц, а Cortex-M0 — до 0,9 DMIPS/МГц.
За счет более высокой производительности ядра приложения на ядре М4К могут работать на меньших тактовых частотах, потребляя меньше энергии. В ядре М4К предусмотрено несколько функций управления мощностью, в т.ч. контроль активной мощности с помощью использования стробирования синхросигнала и поддержки режима пониженного потребления энергии.
Большая часть энергии расходуется схемой синхронизации и регистрами. Расширенное управление стробированием синхросигнала позволяет отключать выбранные неиспользуемые области ядра. Команда WAIT переводит ядро в режим ожидания, в котором внутренний тактовый генератор и конвейер временно приостанавливаются. При наступлении события или сброса ядро возвращается к нормальному режиму работы. В таблице 1 сведены величины энергопотребления для Cortex-M3 и М4К, произведенных по технологическим нормам 180 нм и 90 нм, оптимизированных по быстродействию или площади кристалла. Как видно, на одной и той же тактовой частоте ядро М4К заметно превосходит Cortex-M3 как по потреблению, так и по эффективности расхода энергии.
Табл. 1. Характеристики M4K и Cortex-M3 при различных технологических нормах и параметрах оптимизации
Как говорит Википедия, MIPS – микропроцессор, разработанный компанией MIPS Computer Systems (в настоящее время MIPS Technologies) и впервые реализованный 1985 году. Существует большое количество модификаций этой архитектуры, созданных специально для 3D-моделирования, быстрой обработки чисел с плавающей запятой, многопотоковых вычислений. Различные варианты этих процессоров использутся в роутерах Cisco и Mikrotik, смартфонах, планшетах и игровых консолях.
Инструкции MIPS достаточно просты для понимания, и именно с него рекомендуется начинать изучение ассемблера. Чем сейчас, собственно, и займёмся.
Структура программы на MIPS-ассемблере
Типы в MIPS-ассемблере
Вот сравнительная таблица основных типов в C++ и в MIPS: Как можно увидеть в таблице, выбор типа в для переменной в MIPS основывается только на объёме памяти, который будет занимать эта переменная. Обратите внимание, что MIPS в этом плане не различает signed- и unsigned-переменные.
Метки (символы)
Основные директивы
Немного глубже мы рассмотрим типы данных по мере их использования в коде.
Регистры
Инструкции MIPS
Примечание. C этого момента мы будем рассматривать MIPS-процессор, его инструкции и дополнения на примере замечательного симулятора MIPS под названием MARS, который можно загрузить отсюда. Имплементация MIPS в этом симуляторе полностью соответствует стандартам.
В коде в начале статьи мы уже выделили все функциональные части программы и определили инструкции и псевдоинструкции как то, что не является комментарием, символом (меткой) или директивой. Псевдоинструкции также называют макросами, они трансформируются в одну или несколько инструкций во время выполнения кода. Вот пример макроса:
переходит в набор инструкций:
Как видно, MIPS-программы всегда записываются по одной инструкции на строчку.
Типы инструкций
Также существуют инструкции для сопроцессоров, но их мы рассмотрим позже.
Инструкция syscall
Весь ввод и вывод происходит через консоль MARS’a.
Арифметические инструкции
Кстати, imm16 по умолчанию интерпретируются как позитивные. Например:
Если нужно добавить отрицательное значение, то нужно явно это указать:
А теперь можно протестировать получившийся код в MARS. Загрузите черновик вот отсюда и откройте его в MARS:
Продолжение следует
В следующей статье рассмотрим логические инструкции, а также умножение и деление целых чисел. В ней же попробуем работать с памятью и стеком. А пока предлагаю вам попробовать переписать вот этот код на MIPS-ассемблер: