Проектирование высокопроизводительных систем реального времени на базе СнК


В статье рассматриваются основные способы построения программной архитектуры для многоядерных систем на базе СнК: асимметричная многопроцессорная обработка, гипервизор и симметричная многопроцессорная обработка. На основе измерения времени завершения цикла и джиттера экспериментальной системы, построенной с использованием ПЛИС Cyclone V, делается вывод об эффективности архитектуры с симметричной многопроцессорной обработкой с изоляцией ядра и предлагаются рекомендации по дальнейшей оптимизации такой системы. Статья представляет собой перевод [1].

Современные системы на базе СнК должны выполнять множество разнообразных задач, в т.ч. запускать базовые операционные системы (ОС) и выполнять высокоскоростную обработку данных. Кроме того, поскольку число ядер в СнК продолжает расти, разработчики вынуждены решать множество проблем, связанных с аппаратными средствами и программным обеспечением, что часто требует оптимального соотношения между детерминизмом реального времени и малой задержкой.

Программное обеспечение современных СнК часто состоит из множества приложений – от систем жесткого реального времени (например, для управления автомобильными электроприводами) до систем с высокой пропускной способностью (для работы с потоковым видео высокого разрешения). Такие гибридные системные решения усложняются, поскольку современные СнК все чаще применяются в высокопроизводительных системах с большим числом процессорных ядер и высокоскоростными межсоединениями. Обеспечение режима жесткого реального времени (отклик порядка нескольких мкс и джиттер не более 1 мкс) в таких системах требует тщательного анализа возможных решений и разбиения системы на разделы. Следует также предусмотреть стратегию, которая учитывала бы требования завтрашнего дня в условиях постоянно растущей сложности СнК. В настоящее время имеются три основных подхода, из которых разработчик выбирает способ реализации гибридной системы на базе СнК: асимметричная многопроцессорная обработка (Asymmetric Multi-Processing, AMP), гипервизорное решение и симметричная многопроцессорная обработка (Symmetric Multi-Processing, SMP) с изоляцией ядра (см. табл. 1).

Таблица 1. Сравнение AMP, гипервизорного решения и SMP с изоляцией ядра для гибридных систем

Степень масштаби-
руемости

Сложность начального портирова-
ния

Скорость передачи сообщений

Пропускная способность

Джиттер в режиме реального времени

AMP

Низкая

Высокая

Низкая

Снижена за счет распределения ядер

Малый в отсутствие передачи сообщений

Гипервизор

Высокая

Низкая

Низкая

Снижена за счет гипервизорного решения

Большой

SMP с изоляцией ядра

Высокая

Низкая/высокая*

Высокая

Снижена за счет распределения ядер

Малый

* Низкая – если портирование начинать с ОС на базе SMP, высокая – если портирование начинать с системы на основе множества ОС.

Асимметричная многопроцессорная обработка (AMP)

AMP – это, по сути, порт для нескольких ОС на физически отдельных процессорных ядрах. Примером может служить запуск ОС класса bare metal («голое железо»), специально предназначенной для решения задач реального времени на одном ядре, и запуск полной ОС, например встраиваемой Linux, на других ядрах. В большинстве случаев начальное портирование этих ОС на ядра не вызывает затруднений. Однако код запуска и управление ресурсами, в т.ч. памятью, кэшем и периферией, могут содержать большое число ошибок. Когда несколько ОС получают доступ к одной периферии, поведение системы становится недетерминированным и для отладки может потребоваться чрезвычайно много времени. Следовательно, возникает необходимость в архитектуре с надежной защитой, например ARM TrustZone.

Уровень сложности растет, когда передача сообщений между ОС требует разделения памяти и управления совместно с другими мерами защиты. Поскольку кэш-память, как правило, не разделяется между различными ОС, необходимо, чтобы передача сообщений выполнялась не через кэш-области, что увеличивает задержку и джиттер. Кроме того, это неэффективная программная архитектура с точки зрения масштабируемости, т.к. с увеличением числа ядер требуется повторное портиро-
вание.

Гипервизоры

Гипервизор – это система низкого программного уровня, которая запускается непосредственно на аппаратном обеспечении и управляет несколькими независимыми ОС, находящимися на более высоком уровне. Хотя начальное портирование в этом случае аналогично AMP-системе, преимущество гипервизора заключается в том, что он позволяет исключить необходимость в решении нетривиальных задач управления ресурсами и передачи сообщений. С другой стороны, недостатком гипервизора является то, что он повышает непроизводительные издержки из-за дополнительного уровня программного обеспечения, что снижает пропускную способность и производительность в режиме реального времени.

Симметричная многопроцессорная обработка (SMP)

В SMP-системах с изоляцией ядер запускается одна ОС на нескольких ядрах с внутренним разбиением ядра. Примером может служить указание со стороны ОС на распределение приложения реального времени на одном ядре, а других приложений, работающих не в режиме реального времени, на остальных ядрах. Такой подход является в высшей степени масштабируемым, поскольку ОС SMP-системы портируется без участия пользователя на растущее число ядер. Поскольку все ядра управляются одной ОС, передача сообщений между ядрами может происходить на уровне L1 кэша данных, что обеспечивает более быструю связь с меньшим джиттером.

Изоляция ядра позволяет зарезервировать ядро для приложения жесткого реального времени, ограждая его от влияния других высокопроизводительных ядер и сохраняя малый джиттер и быструю реакцию в режиме реального времени. В целом, это хорошее решение для программной архитектуры, поскольку оно позволяет выбрать используемую ОС, не создавая программное обеспечение низкого уровня (что сопряжено с возможными ошибками) для управления несколькими ОС. Начальное портирование в SMP-системах требует некоторых усилий, если изначально существует несколько ОС, но эти усилия можно в значительной степени сократить, если портирование начинается с SMP-архитекуры.

Оптимизация высокопроизводительной СнК реального времени с SMP-архитектурой

Анализ альтернативных вариантов показывает, что SMP-архитектура с изоляцией ядер обеспечивает наилучшее решение для оптимизации высокопроизводительных систем реального времени на базе СнК. Однако перед дальнейшим обсуждением особенностей такого подхода необходимо выяснить, из каких временных периодов состоит отклик системы в режиме реального времени (или время завершения цикла).

  1. Передача новых данных в системную память с портов ввода-вывода (прямой доступ к памяти).
  2. Процессор обнаруживает новые данные в системной памяти (изоляция ядра).
  3. Копирование данных в собственную память (доступ к памяти процессора – memcpy).
  4. Выполнение вычислений над данными.
  5. Копирование результата обратно в системную память (memcpy).
  6. Передача результатов обратно в порт ввода-вывода (DMA).

Поскольку джиттер и задержка накапливаются на всех этих шести этапах, необходимо оптимизировать каждый из них. Для операционных систем реального времени (ОСРВ) типа VxWorks с изоляцией ядер время реакции системы на опрос/прерывание может лежать в наносекундном диапазоне (этап 2), а время выполнения вычислений над данными зависит от приложения и является достаточно прогнозируемой величиной (этап 4). Таким образом, разработчики должны уделять основное внимание выбору оптимального соотношения между DMA-передачей и командой memcpy (этапы 1, 3, 5, 6).

Существуют два основных способа передачи данных – кэш-когерентная и не кэш-когерентная передачи, которые имеют совершенно разное влияние на время DMA-передачи и memcpy. Как видно из таблицы 2, хотя использование порта когерентности кэша ARM (ACP) приводит к более длинному пути при DMA-передаче, чтобы получить переданные данные, процессору необходимо всего лишь получить доступ к кэшу L1. Следовательно, время команды memcpy значительно меньше при кэш-когерентной передаче и определяет суммарную задержку несмотря на незначительный рост задержки DMA-передачи (см. рис. 1). Это означает, что кэш-когерентная передача обеспечивает намного меньшую задержку и меньший джиттер из-за прямого доступа к кэшу.

Рис. 1. Время выполнения кэш-когерентной и не кэш-когерентной DMA-передачи и memcpy.
Time (µ) – время, мкс; Datasize (B) – объем данных, байт; Legend – обозначение; Non-ACP DMA time (µ) – DMA-передача без когерентности кэша, мкс; Non-ACP memcpy – memcpy без когерентности кэша, мкс; ACP DMA time (µ) – кэш-когерентная DMA-передача, мкс; ACP memcpy – memcpy с когерентностью кэша, мкс

Таблица 2. Каналы кэш-когерентной и не кэш-когерентной DMA-передачи и memcpy

Без когерентности кэша

DMA-передача: ввод-вывод → межсоединения → SDRAM Memcpy: ЦП → L1 (неудачное обращение в кэш) → L2 (неудачное обращение в кэш) → межсоединения → SDRAM

Кэш-когерентная передача

DMA-передача: ввод-вывод → межсоединения → блок управления поиском (SCU) → L1 Memcpy: ЦП → L1 (попадание в кэш)

Пример решения: построение системы на базе СнК

Примером эффективного решения для полной системы является использование исходного проекта на базе комплекта разработки для СнК ПЛИС Cyclone V. Это устройство содержит двухъядерную подсистему ARM Cortex-A9, которая называется аппаратной процессорной системой (Hard Processor System, HPS), и 28-нм ПЛИС. Архитектура системы показана на рисунке 2.

Рис. 2. Исходный проект для экспериментальной системы на базе комплекта разработки для СнК ПЛИС Cyclone V.
HPS – аппаратная процессорная система; FPGA – ПЛИС; A9 (non-real) – ядро Cortex-A9 (для приложений, работающих не в режиме реального времени); A9 (real) – ядро Cortex-A9 (для приложений реального времени); SCU/ACP – блок управления поиском (SCU)/порт когерентности кэша (ACP); L2 – L2-кэш; L3 – L3-кэш; F2H – интерфейс; H2F – интерфейс; Write DMA – DMA-подсистема записи; Read DMA – DMA-подсистема считывания; Jitter Monitors – мониторы джиттера; Real-time data (I/O) – данные реального времени (ввод-вывод); Real-time Control Unit – блок управления режимом реального времени; Master – ведущий; Slave – ведомый

Аппаратная архитектура

  • Две DMA-подсистемы для передачи данных из портов ввода-вывода ПЛИС в ARM-процессоры, и наоборот.
  • Обе DMA-подсистемы подключены к ACP для передачи данных непосредственно в кэш и из кэша ARM-процессора.
  • IP-блок управления режимом реального времени для инициализации передачи сообщений между ARM-процессорами и DMA-подсистемами наиболее быстрым способом.
  • Мониторы джиттера собирают информацию о параметрах режима реального времени и величине джиттера путем прямого измерения DMA-сигналов, обеспечивая точность в пределах ±6,7 нс.

Программная архитектура

  • ОСРВ VxWorks, запускаемая в SMP-режиме на двухъядерном ARM-процессоре.
  • Изоляция ядра используется для закрепления приложения реального времени за первым ядром, а остальных приложений, работающих не в режиме реального времени, – за другим ядром.
  • Приложение реального времени непрерывно осуществляет вызов данных из порта ввода-вывода, выполняет вычисления над данными и пересылает результаты обратно в порт ввода-вывода.
  • Приложения, работающие не в режиме реального времени, создают нагрузку на ARM-ядро и порты ввода-вывода за счет непрерывного запуска FTP-пересылок и дешифрации данных.

На экспериментальной системе было измерено время завершения цикла и джиттер с использованием различных объемов передаваемых данных в диапазоне 32–2048 байт. Для каждого массива данных система запускалась миллионы раз, чтобы обеспечить сбор данных для построения гистограмм времени завершения цикла и джиттера или разницы между максимальным и минимальным значениями времени завершения цикла. Как видно из рисунка 3, даже при интенсивном FTP-трафике, который обрабатывает второе ядро, после выполнения миллионов тестовых прогонов была достигнута задержка на уровне мкс с менее чем 300-пс джиттером. Наблюдается некоторый разброс величины джиттера, но он контролируется в пределах 200 пс, что является незначительной величиной при используемых уровнях производительности.

Рис. 3. Результаты измерения времени завершения цикла и джиттера для экспериментальной системы на базе комплекта разработки на СнК ПЛИС Cyclone V.
Loop Time (µ) – Время завершения цикла, мкс; Datasize (Bytes) – объем данных, байт; Jitter (us) – джиттер, нс

То же самое FTP-приложение запускалось также на VxWorks SMP с помощью обоих ядер. При этом скорость увеличилась почти в два раза. Следовательно, метод SMP с изоляцией ядра снижает производительность, что вызывает необходимость в компромиссе между пропускной способностью и приложением жесткого реального времени. AMP-решение обеспечивает аналогичное снижение производительности из-за жесткого разделения ядер, но при гораздо меньшей возможности масштабирования системы в случае увеличения числа ядер.

Оптимальное решение требует компромисса

Проектирование сбалансированной системы на базе СнК для высокопроизводительных приложений и приложений реального времени требует оптимального решения с учетом следующих факторов:

  • DMA-передача данных;
  • когерентность кэша;
  • передача сообщений между ядром процессора и DMA-подсистемой;
  • разделение ОС;
  • программная масштабируемость при увеличении числа процессорных ядер.

Описанное в статье эффективное системное решение с использованием SMP-архитектуры с изоляцией ядра и кэш-когерентной передачей данных обеспечивает малые задержки, малый джиттер и работу в режиме реального времени, сохраняя при этом программную масштабируемость для перспективных поколений СнК.

Литература

  1. Nick Ni. Best practices for designing high-throughput, real-time SoC systems//www.embedded-computing.com.

Читайте также:
Windows в приложениях реального времени
Компактные операционные системы реального времени
Особенности работы операционной системы реального времени FreeRTOS
Введение в операционные системы реального времени
Стартовый комплект разработчика сверхкомпактных x86-систем реального времени на основе nanoETXexpress и VxWorks

Источник: журнал «Электронные компоненты»

Оставьте отзыв

Ваш емейл адрес не будет опубликован. Обязательные поля отмечены *