Подписка на новости

Опрос

Нужны ли комментарии к статьям? Комментировали бы вы?

Реклама

 

2007 №6

Особенности архитектуры и программирования двуядерных процессоров семейства Blackfin ADSP-BF561

Сотников Александр


Стремление разработчиков устройств цифровой обработки сигналов к миниатюризации и снижению стоимости конечных продуктов стимулирует создание цифровых сигнальных процессоров (ЦСП) высокой степени интеграции, которые бы эффективно справлялись как с типовыми вычислительными задачами, так и с задачами управления, характерными для микроконтроллеров. Отвечая на потребности рынка, компания Analog Devices несколько лет назад начала выпуск процессоров семейства Blackfin (ADSP BF5xx), архитектура которых совмещает в себе основные достоинства двух классов вычислительных устройств — ЦСП и микроконтроллеров. Однако в ряде задач, например, в задачах обработки видеоизображений с высоким разрешением, производительности одного процессора, даже при тактовой частоте ядра 750 МГц, уже недостаточно, поэтому в 2005 году семейство Blackfin было дополнено двухъядерным процессором ADSP BF561. Эта статья посвящена обзору внутренней организации ADSP BF561 и методик программирования, позволяющих оптимально использовать его архитектурные особенности в зависимости от поставленной задачи.

Архитектура ADSP BF561

В основе процессора ADSP BF561, как и его предшественников ADSP BF535 и ADSP BF531/2/3, лежит «микросигнальная» архитектура MSA (Microsignal architecture), разработанная совместно компаниями Analog Devices и Intel. Основные функциональные блоки процессора ADSP BF561 показаны на рис. 1.

Архитектура процессора ADSP BF561
Рис. 1. Архитектура процессора ADSP BF561

ADSP BF561 — это симметричный двухъядерный процессор, то есть два его ядра полностью идентичны и равноправны. Каждое из ядер включает в себя следующие компоненты (рис. 2):

  • вычислительный блок;
  • регистровые файлы;
  • блок формирования адресов;
  • блок управления.
Архитектура ядра Blackfin
Рис. 2. Архитектура ядра Blackfin

Основу вычислительного блока составляют два умножителя-накопителя (MAC), каждый из которых представляет собой комбинацию 16-разрядного умножителя и 40-разрядного аккумулятора. Стандартные арифметические и логические операции над 16- и 32-разрядными данными производятся двумя 40-разрядными арифметико-логическими устройствами (АЛУ). 40-разрядное устройство сдвига позволяет выполнять операции логического, арифметического и циклического сдвига, осуществлять нормализацию и извлечение экспоненты, манипулировать отдельными битами или наборами битов входных операндов. Кроме того, в состав вычислительного блока входят четыре 8-разрядных видео-АЛУ, поддерживающих некоторые операции над 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 имеет сложную систему прерываний. Каждое из ядер процессора взаимодействует со своим контроллером прерываний, в котором применяется двухуровневый механизм управления. Все прерывания периферийных узлов, прерывания каналов 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. Достоинством гетерогенной модели является возможность параллельной разработки ПО двумя командами разработчиков, каждая из которых отвечает за реализацию алгоритмов, выполняемых на каком-то одном из ядер. Также при использовании гетерогенной модели упрощается процесс отладки и тестирования, поскольку изменение программы, выполняемой одним из ядер, во многих случаях никак не отражается на программе, выполняемой другим ядром. Недостаток этой модели программирования заключается в сложности перераспределения вычислительной нагрузки между ядрами.

Построение системы обработки видеоизображений с использованием гетерогенной модели программирования
Рис. 3. Построение системы обработки видеоизображений с использованием гетерогенной модели программирования

Помимо гетерогенной модели программирования симметричные процессоры поддерживают еще несколько моделей программирования: гомогенную модель, модель «ведущий — ведомый» и конвейерную модель. Рассмотрим каждую из них более подробно.

В гомогенной модели оба ядра выполняют одну и ту же программу, но обрабатывают при этом разные данные. Например, в задаче многоканальной обработки звука при таком подходе каждое из ядер может обрабатывать половину от общего числа каналов, а в задаче обработки видеоизображений на одно ядро можно возложить задачу обработки четных, а на другое — нечетных кадров. Такую модель целесообразно использовать в задачах, где требуется большой объем вычислений. Как правило, при использовании этой схемы оба ядра процессора после необходимой инициализации входят в бесконечный цикл, в котором производится вся обработка и выдача результатов.

В модели «ведущий — ведомый», как и в гомогенной модели, нагрузка при выполнении интенсивных вычислений поровну распределяется между ядрами процессора, однако на одно из них, которое является ведущим, возлагаются также и задачи общего управления. Второе ядро занимается исключительно типичными для цифровых сигнальных процессоров вычислениями и является в данной схеме ведомым. Синхронизация работы ядер может осуществляться через семафоры или прерывания. При использовании семафоров ведущее ядро сигнализирует ведомому о необходимости начала обработки нового блока данных записью заранее оговоренного значения в ячейку общей памяти. Ведомое ядро после завершения обработки текущего блока данных опрашивает в цикле состояние этой ячейки. При использовании прерываний ведомое ядро по завершении обработки блока данных входит в режим ожидания, из которого ведущее ядро может вывести его выдачей прерывания. Недостаток этой модели заключается в том, что если одно ядро уже обработало свою порцию данных, а другое еще занимается обработкой, то первое ядро не может перейти к следующей задаче, а должно дождаться завершения обработки во втором ядре. Это приводит к снижению эффективности использования ресурсов процессора.

И, наконец, еще одна модель программирования, которая поддерживается симметричными процессорами, — это конвейерная модель, в которой отдельные шаги алгоритма распределяются между ядрами, причем выходные данные, получаемые по завершении этапа в одном ядре процессора, являются входными данными для следующего этапа в другом ядре процессора. Рассмотрим в качестве примера задачу кодирования видеоизображений формата MPEG2. При использовании конвейерной схемы обработки одно ядро двухъядерного процессора может выполнять преобразование цветового пространства и анализ движения. Результаты работы первого ядра (вектора движения) записываются в область общей памяти. Одновременно с этим второе ядро извлекает из общей памяти векторы, рассчитанные первым ядром на предыдущем шаге, и осуществляет оставшуюся часть обработки. При условии оптимального распределения задач между ядрами, то есть при приблизительно равной вычислительной нагрузке на ядра, конвейерная модель позволяет достичь наибольшей производительности среди всех перечисленных моделей программирования. Недостаток этой модели заключается в том, что эффективность распределения задач сильно зависит от архитектуры и системы памяти конкретного процессора, и поэтому перенос программ с одной платформы на другую затруднителен.

Заключение

Наличие дополнительного процессорного ядра в 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.

Скачать статью в формате PDF  Скачать статью Компоненты и технологии PDF

 


Другие статьи по данной теме:

Сообщить об ошибке