Особенности архитектуры и программирования
двухъядерных процессоров семейства Blackfin ADSP-BF561
Александр СОТНИКОВ
Стремление разработчиков устройств цифровой обработки сигналов к миниатюризации и снижению стоимости конечных продуктов стимулирует создание цифровых сигнальных процессоров (ЦСП) высокой степени интеграции, которые бы эффективно справлялись как с типовыми вычислительными задачами, так и с задачами управления, характерными для микроконтроллеров. Отвечая на потребности рынка, компания Analog Devices несколько лет назад начала выпуск процессоров семейства Blackfin (ADSP BF5xx), архитектура которых совмещает в себе основные достоинства двух классов вычислительных устройств — ЦСП и микроконтроллеров. Однако в ряде задач, например, в задачах обработки видеоизображений с высоким разрешением, производительности одного процессора, даже при тактовой частоте ядра 750 МГц, уже недостаточно, поэтому в 2005 году семейство Blackfin было дополнено двухъядерным процессором ADSP BF561. Эта статья посвящена обзору внутренней организации ADSP BF561 и методик программирования, позволяющих оптимально использовать его архитектурные особенности в зависимости от поставленной задачи.
БЛОКИ УПРАВЛЕНИЯ СИСТЕМОЙ
КОНТРОЛЛЕР
ПРЕРЫВАНИЙ/
ТАЙМЕР
СТОРОЖЕВОЙ
ТАЙМЕР
КОНТРОЛЛЕР
ПРЕРЫВАНИЙ/
ТАЙМЕР
ЯДРО BLACKFIN
СТОРОЖЕВОЙ
ТАЙМЕР
РЕГУЛЯТОР
НАПРЯЖЕНИЯ/
PLL
ИНТЕРФЕЙС
JTAG
ЯДРО BLACKFIN
32 К SRAM/КЭШ ПАМЯТЬ КОМАНД 64 К SRAM/КЭШ ПАМЯТЬ ДАННЫХ 32 К SRAM/КЭШ ПАМЯТЬ КОМАНД 64 К SRAM/КЭШ ПАМЯТЬ ДАННЫХ
А л к А Г 1 к. А Г J к А Г ' к. Г
УЗЕЛ ИНТЕРФЕЙСА СИСТЕМНЫХ ШИН
ВНЕШНЯЯ ПАМЯТЬ
128 кбайт SRAM
UART0
IrDA
► SPI
► SPORT1
► GPIO
► ТАЙМЕРЫ
ПЕРИФЕРИЯ
Рис. 1. Архитектура процессора ADSP BF561
Архитектура ADSP BF561
В основе процессора ADSP BF561, как и его предшественников ADSP BF535 и ADSP BF531/2/3, лежит «микросигнальная» архитектура MSA (Microsignal architecture), разработанная совместно компаниями Analog Devices и Intel. Основные функциональные блоки процессора ADSP BF561 показаны на рис. 1.
ADSP BF561 — это симметричный двухъядерный процессор, то есть два его ядра полностью идентичны и равноправны. Каждое из ядер включает в себя следующие компоненты (рис. 2):
• вычислительный блок;
• регистровые файлы;
• блок формирования адресов;
• блок управления.
Основу вычислительного блока составляют два умножителя-накопителя (MAC), каждый из которых представляет собой комбинацию 16-разрядного умножителя и 40разрядного аккумулятора. Стандартные арифметические и логические операции над 16- и 32-разрядными данными производятся двумя 40-разрядными арифметико-логическими устройствами (АЛУ). 40-разрядное устройство сдвига позволяет выполнять операции логического, арифметического
и циклического сдвига, осуществлять нормализацию и извлечение экспоненты, манипулировать отдельными битами или на-
борами битов входных операндов. Кроме того, в состав вычислительного блока входят четыре 8-разрядных видео-АЛУ, под-
ЦСП
17
БЛОК ФОРМИРОВАНИЯ АДРЕСОВ
Рис. 2. Архитектура ядра Blackfin
держивающих некоторые операции над 8разрядными данными, характерные для задач обработки видеоизображений.
Источником и приемником данных при работе вычислительных блоков является регистровый файл данных. Регистровый файл данных содержит восемь универсальных 32разрядных регистров, каждый из которых, в зависимости от конкретной операции, может рассматриваться как одно 32-разрядное слово или как два 16-разрядных слова.
Еще один регистровый файл входит в состав блока формирования адресов. Он содержит шесть регистров указателей общего назначения (P5-P0) и специальные регистры для хранения указателя стека (SP) и кадра стека (FP). Непосредственно формированием адреса занимаются два генератора адреса данных (DAG). Они поддерживают режимы прямой адресации, косвенной адресации с пред-и постинкрементом и специфические для задач цифровой обработки сигналов режимы бит реверсной и циклической адресации. Для организации циклических буферов DAG используют четыре набора 32-разрядных регистров индекса (I), модификации (M), длины (L) и базы (B).
Блок управления отвечает за процесс выполнения команд ядром процессора. Адреса выполняемых команд формируются программным автоматом, который отрабатывает ситуации, приводящие к нарушению линейного порядка следования адресов: циклы, вызовы подпрограмм, возникновение прерываний и исключений, условные и безусловные переходы. Выработанный программным автоматом адрес поступает в 10 уров-невый конвейер команд, который обеспечивает выборку соответствующей команды и ее дешифрацию. Для повышения эффективности выполнения циклов в состав блока управления включен буфер циклов, играющий роль кэша для команд цикла.
В процессоре ADSP-BF561 используется иерархическая трехуровневая модель памяти. Отдельного пространства ввода/вывода в процессоре нет, и все ресурсы отображены в едином 32-разрядном адресном пространстве. Память первого уровня (L1) работает с тактовой частотой ядра, но имеет малый объем. Каждое из ядер имеет собственную память L1 объемом 100 кбайт, доступную только ему. Эти области памяти структурированы следующим образом:
• 32 кбайта памяти команд, из которых 16 кбайт могут быть сконфигурированы как кэш команд,
• 64 кбайта памяти данных, из которых 32 кбайта могут быть сконфигурированы как кэш данных,
• 4 кбайта SRAM scratchpad памяти (на рис. 1 не показана).
На кристалле также интегрирована менее быстродействующая память второго уровня (L2) объемом 128 кбайт. В памяти L2 могут храниться как команды, так и данные, она до-
ступна обоим ядрам и не может быть сконфигурирована как кэш. Для оптимизации обмена между памятью L1 и L2 в архитектуре процессора предусмотрен специальный контроллер DMA — IMDMA (Internal Memory DMA).
Кроме того, в пространстве внутренней памяти отображается часть регистров ядра процессора и все регистры внутренних периферийных узлов (системные регистры). И, наконец, нижние 2 кбайта в пространстве внутренней памяти процессора занимает загрузочное ПЗУ. В нем располагается программа начального загрузчика, выполняемая ядром А после сброса процессора (ядро В в процессе загрузки не участвует и находится в состоянии бездействия) в режимах загрузки из SPI EEPROM или 8/16-разрядной флэш-памяти.
Третий уровень (L3) в иерархической модели памяти процессора Blackfin занимает внешняя память. В пространстве внешней памяти может отображаться до четырех банков памяти SDRAM стандарта PC133 объемом от 16 до 512 Мбайт и до четырех банков асинхронной (ROM, SRAM, EEPROM, флэш) памяти объемом 64 Мбайта каждый. Внешние устройства ввода/вывода (FIFO, контроллеры интерфейсов и др.) также отображаются через банки асинхронной памяти. Временные параметры для банков асинхронной памяти настраиваются пользователем независимо друг от друга. Контроллеры асинхронной и синхронной памяти интегрированы внутри процессора в блоке интерфейса внешней шины (EBIU), который выполняет все необходимые операции дешифрации внутренних адресов, мультиплексирования внешних
линий, формирования специальных циклов SDRAM и т. д. Разрядность внешней шины данных процессора ADSP-BF561 составляет 32 бита.
Как и все остальные представители семейства Blackfin, процессор ADSP BF561 имеет очень богатый набор интегрированных периферийных узлов. Добавление на кристалл второго ядра привело к увеличению, по сравнению с предшествующими одноядерными моделями, количества линий ввода/вывода общего назначения (GPIO) (с 16 до 48), появлению дополнительного сторожевого таймера, дополнительного таймера ядра и девяти дополнительных таймеров общего назначения. Однако наиболее интересным, особенно в свете задач обработки видеоизображений, является наличие в ADSP BF561 второго 16-разрядного параллельного порта PPI. Параллельные порты позволяют без использования дополнительной логики подключать к процессору многие стандартные АЦП, ЦАП, видеокодеры и декодеры, и присутствие на кристалле сразу двух PPI дает возможность, например, организовать ввод оцифрованного видеосигнала, его обработку «на лету» и последующий вывод на устройство отображения без мультиплексирования внешних выводов. Помимо двух параллельных портов ADSP BF561 также имеет и несколько стандартных последовательных интерфейсов — SPI, SPORT и UART.
Процессор ADSP BF561 имеет сложную систему прерываний. Каждое из ядер процессора взаимодействует со своим контроллером прерываний, в котором применяется двухуровневый механизм управления. Все прерывания периферийных узлов, прерывания
18
ЦСП
каналов DMA и внешние прерывания (всего 61 источник) при помощи контроллера прерываний системы (SIC) отображаются в семь прерываний ядра общего назначения. Управление прерываниями ядра обеспечивает контроллер прерываний ядра (CIC), который поддерживает девять прерываний общего назначения и несколько выделенных прерываний: прерывание эмуляции, сброса, немаскируемое прерывание (NMI), исключение, прерывание аппаратной ошибки и прерывание таймера ядра.
Для обеспечения эффективной работы ядер процессора в условиях интенсивного обмена данными в состав его архитектуры помимо упоминавшегося выше контроллера IMDMA включены два независимых контроллера DMA — 32-разрядный контроллер DMA1 и 16-разрядный контроллер DMA2. Каждый из этих контроллеров имеет двенадцать каналов для выполнения пересылок между памятью и периферийными узлами и четыре канала для выполнения пересылок между пространствами внутренней и внешней памяти.
Особого внимания заслуживает еще один функциональный блок процессора ADSP BF561 — это внутренний регулятор напряжения. Возможность динамически изменять напряжение питания ядра, а также тактовые частоты ядра и интегрированной периферии позволяет варьировать потребляемую мощность в зависимости от вычислительной нагрузки на процессор. Это свойство процессоров Blackfin является незаменимым для портативных систем с батарейным питанием.
Набор команд процессора включает в себя как 16-, так и 32-разрядные команды, причем наиболее часто исполняемые команды (загрузка/сохранение регистров) кодируются 16-битами, а 32 битами кодируется большинство арифметических команд и команды манипуляции битами. Архитектура ADSP BF561 допускает произвольное размещение 16-и 32-разрядных команд в памяти. Разветвленная система внутренних шин и большое число вычислительных блоков позволяют каждому ядру процессора в одном цикле выполнять сразу несколько команд, за счет чего достигается повышенная плотность кода. Эти свойства набора команд в совокупности с поддержкой многих характерных для микроконтроллеров возможностей обеспечивают высокую эффективность при компиляции кода, написанного на языках C/C++, что значительно упрощает разработку программного обеспечения.
Перечисленные архитектурные особенности процессора ADSP BF561 позволяют разработчику строить при помощи одного относительно недорогого процессора сложные системы с интенсивной сигнальной обработкой. Однако для достижения максимальной эффективности от процессора в конкретной задаче необходимо выбрать на этапе разработки подходящую модель организации про-
граммного обеспечения системы. Моделям программирования, поддерживаемым процессором ADSP BF561, посвящен следующий раздел статьи.
Модели программирования двухъядерных процессоров
Двухъядерные процессоры по внутренней организации можно разделить на две категории — симметричные и асимметричные. В асимметричных процессорах архитектуры ядер различаются: они имеют разные наборы команд, работают зачастую на разных тактовых частотах, имеют разные системы памяти и т. д. Основное достоинство асимметричных процессоров заключается в том, что каждое из ядер в них, как правило, оптимизировано под решение конкретного набора задач. Например, одно ядро может эффективно выполнять задачи управления, характерные для микроконтроллеров, а второе — интенсивные арифметические вычисления. В симметричных процессорах, к которым относится и ADSP BF561, ядра имеют одинаковую архитектуру. Такая организация имеет свои преимущества. Во-первых, при написании программного обеспечения для симметричных процессоров не требуется применения двух разных наборов средств программирования. Во-вторых, в симметричных процессорах по сравнению с асимметричными гораздо проще перераспределять вычислительную нагрузку между двумя ядрами, то есть если вычислительных мощностей одного ядра недостаточно для выполнения поставленной задачи, часть операций может быть переложена на другое ядро. И, наконец, симметричные процессоры дают программисту большую свободу действий, поскольку они поддерживают большее число моделей программирования, чем асимметричные процессоры.
Единственная модель программирования, которая эффективно поддерживается асим-
метричными процессорами — это гетерогенная модель. В этой модели ядра процессора выполняют независимые, зачастую непересе-кающиеся задачи. Фактически они играют здесь роль автономных процессоров, которые общаются между собой посредством тех или иных механизмов взаимодействия. Например, одно ядро может принимать через сетевой интерфейс пакеты данных и передавать их на обработку другому ядру, занимаясь только поддержкой сетевых протоколов, общими задачами управления и организацией вывода информации в доступной для пользователя форме. Симметричные процессоры также поддерживают эту модель программирования, причем архитектура процессора ADSP BF561 дает здесь ряд преимуществ, поскольку он одинаково хорошо справляется как с задачами управления, так и с задачами цифровой обработки сигналов. Пример построения сетевой системы обработки видеоизображений на базе процессора ADSP BF561 с использованием описанного подхода показан на рис. 3. Достоинством гетерогенной модели является возможность параллельной разработки ПО двумя командами разработчиков, каждая из которых отвечает за реализацию алгоритмов, выполняемых на каком-то одном из ядер. Также при использовании гетерогенной модели упрощается процесс отладки и тестирования, поскольку изменение программы, выполняемой одним из ядер, во многих случаях никак не отражается на программе, выполняемой другим ядром. Недостаток этой модели программирования заключается в сложности перераспределения вычислительной нагрузки между ядрами.
Помимо гетерогенной модели программирования симметричные процессоры поддерживают еще несколько моделей программирования: гомогенную модель, модель «ведущий — ведомый» и конвейерную модель. Рассмотрим каждую из них более подробно.
В гомогенной модели оба ядра выполняют одну и ту же программу, но обрабатывают
Ядро А Память L2: Ядро А
Память команд I-1: задачи управления, организации ЭДЛ, поддержки сетевых протоколов
Память данных L1
I
совместно используемые библиотеки, программа сетевого стека
Память команд L1: алгоритм обработки видеоизображений
Память данных L1
I
I
Сетевой
интерфейс
J
Внешняя
память
Видеовход Видеовыход
Сжатые данные
Кадры изображения и опорные кадры
Рис. 3. Построение системы обработки видеоизображений с использованием гетерогенной модели программирования
при этом разные данные. Например, в задаче многоканальной обработки звука при таком подходе каждое из ядер может обрабатывать половину от общего числа каналов, а в задаче обработки видеоизображений на одно ядро можно возложить задачу обработки четных, а на другое — нечетных кадров. Такую модель целесообразно использовать в задачах, где требуется большой объем вычислений. Как правило, при использовании этой схемы оба ядра процессора после необходимой инициализации входят в бесконечный цикл, в котором производится вся обработка и выдача результатов.
В модели «ведущий — ведомый», как и в гомогенной модели, нагрузка при выполнении интенсивных вычислений поровну распределяется между ядрами процессора, однако на одно из них, которое является ведущим, возлагаются также и задачи общего управления. Второе ядро занимается исключительно типичными для цифровых сигнальных процессоров вычислениями и является в данной схеме ведомым. Синхронизация работы ядер может осуществляться через семафоры или прерывания. При использовании семафоров ведущее ядро сигнализирует ведомому о необходимости начала обработки нового блока данных записью заранее оговоренного значения в ячейку общей памяти. Ведомое ядро после завершения обработки текущего блока данных опрашивает в цикле состояние этой ячейки. При использовании прерываний ведомое ядро по завершении об-
работки блока данных входит в режим ожидания, из которого ведущее ядро может вывести его выдачей прерывания. Недостаток этой модели заключается в том, что если одно ядро уже обработало свою порцию данных, а другое еще занимается обработкой, то первое ядро не может перейти к следующей задаче, а должно дождаться завершения обработки во втором ядре. Это приводит к снижению эффективности использования ресурсов процессора.
И, наконец, еще одна модель программирования, которая поддерживается симметричными процессорами, — это конвейерная модель, в которой отдельные шаги алгоритма распределяются между ядрами, причем выходные данные, получаемые по завершении этапа в одном ядре процессора, являются входными данными для следующего этапа в другом ядре процессора. Рассмотрим в качестве примера задачу кодирования видеоизображений формата МРЕ02. При использовании конвейерной схемы обработки одно ядро двухъядерного процессора может выполнять преобразование цветового пространства и анализ движения. Результаты работы первого ядра (вектора движения) записываются в область общей памяти. Одновременно с этим второе ядро извлекает из общей памяти векторы, рассчитанные первым ядром на предыдущем шаге, и осуществляет оставшуюся часть обработки. При условии оптимального распределения задач между ядрами, то есть при при-
близительно равной вычислительной нагрузке на ядра, конвейерная модель позволяет достичь наибольшей производительности среди всех перечисленных моделей программирования. Недостаток этой модели заключается в том, что эффективность распределения задач сильно зависит от архитектуры и системы памяти конкретного процессора, и поэтому перенос программ с одной платформы на другую затруднителен.
Заключение
Наличие дополнительного процессорного ядра в ADSP BF561 приводит не просто к очевидному удвоению вычислительной мощности. Архитектурные особенности процессора дают пользователю возможность оптимизировать построение системы путем распределения задач и процессов между двумя ядрами. Для достижения оптимальных результатов разработчик должен не только хорошо ориентироваться в нюансах архитектуры, но и выбрать стратегию программирования, наиболее подходящую для решения стоящих перед ним задач. ■
Литература
1. Katz D. J., Gentile R. Embedded Media Processing // Elsevier. 2006.
2. Ning K., Yi G., Gentile R. Single-chip Dual-core Embedded Programming Models for Multimedia Applications // ECN Magazine. 2005.