Опубликован: 12.07.2010 | Уровень: специалист | Доступ: платный | ВУЗ: Алтайский государственный университет
Лекция 17:

Средства программирования многоядерных процессоров

Аннотация: В лекции приводится краткое описание специализированных библиотек и расширений языков программирования.

Специализированные библиотеки

Intel Integrated Performance Primitives

Intel IPP — это набор кросс-платформенных библиотек, содержащих большое количество высокопроизводительных функций, которые могут быть использованы для аудио- и видеокодеков (например, H.263, MPEG-4), сжатия изображений (JPEG и JPEG2000), обработки изображений (двумерных массивов), обработки сигналов (одномерных массивов или векторов), сжатия естественной речи, систем компьютерного зрения, криптографических приложений [96, 97]. Необходимость создания такого набора функций напрямую вытекает из современных реалий разработки прикладного программного обеспечения:

  • существует определенный набор вычислительно сложных функций, которые требуются для приложений;
  • разработчики вынуждены производить тщательную оптимизацию этих функций для получения необходимой производительности;
  • процесс оптимизации сложен и занимает длительное время.

Действительно, многим разработчикам требуется реализовать одну и ту же функциональность. А с ростом количества аппаратных платформ доля низкоуровневых (ассемблерных) реализаций уменьшилась значительно. Intel IPP содержит набор низкоуровневых процедур, которые позволяют эффективно исполняться мультимедийным инструкциям на любом процессоре

Примитивы в Intel IPP могут быть разделены на три основных группы по типу обрабатываемых данных:

  • "сигналы" (термин условный и используется для обозначения одномерных данных) (IPPS);
  • "изображения" (двумерные массивы цветовых данных) (IPPI);
  • матрицы небольшой размерности (массивы NxM) (IPPM).

Функции из Intel IPP, предназначенные для работы с небольшими матрицами, практически совпадают с функциями из Intel Math Kernel Library (MKL). Разница только в размерах матриц. Типичными размерами для Intel IPP являются 3x1, 4x1, 5x1, 6x1, Nx1, 3x3, 4x4, 5x5, 6x6, в то время как Intel MKL больше подходит для работы с матрицами больших размеров.

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

Каждая функция из Intel IPP имеет несколько вариантов, оптимизированных под различные архитектуры процессоров. В Intel IPP используются следующие типы оптимизаций:

  • оптимизация кода на С (px);
  • оптимизация кода для процессоров Intel Pentium III с использованием Streaming SIMD Extensions (a6);
  • оптимизация кода для процессоров Intel Pentium 4 с использованием Streaming SIMD Extensions 2 (w7);
  • оптимизация кода для процессоров Intel Pentium 4 с использованием Streaming SIMD Extensions 3 (t7);
  • оптимизация кода для процессоров Intel Xeon с использованием Intel EM64T (m7);
  • оптимизация кода для процессоров Intel Itanium и Itanium 2 (i7).

Существует четыре способа включения функциональности Intel IPP в приложение:

  • динамическая линковка;
  • статическая линковка;
  • смешанная линковка (продвинутая статическая);
  • динамическая линковка с дополнительными возможностями.

Для эффективного исполнения на любом аппаратном обеспечении целесообразно использовать динамическую линковку. В этом случае программа после запуска определяет процессор и подставляет в места вызова функций бинарный код из соответствующей библиотеки.

При использовании статической линковки достигается меньший размер программы, но ценой жесткой привязки к типу процессора. Смешанная линковка по сути является статической, но при этом позволяет уменьшить размер исполняемого файла.

Intel Math Kernel Library

Библиотека Intel Math Kernel Library (MKL) представляет собой набор функций линейной алгебры, быстрого преобразования Фурье и векторной математики для разработки научного и инженерного ПО [96, 97]. Она представлена в вариантах для Windows и Linux, есть версия для Linux-кластеров. Библиотеки MKL состоят из нескольких двоичных файлов, каждый из которых оптимизирован для определенного семейства процессоров Intel, включая Intel Itanium 2, Intel Xeon, Intel Pentium III и Intel Pentium 4.

На стадии выполнения MKL автоматически определяет модель процессора и запускает соответствующую версию вызываемой функции, что гарантирует максимальное использование возможностей процессора и максимально возможную производительность.

Все библиотеки MKL поддерживают работу в многопоточном режиме, а ключевые функции LAPACK, BLAS (третьего уровня) и дискретных преобразований Фурье (DFT) допускают распараллеливание по стандарту OpenMP.

Так как библиотека MKL максимально оптимизирована под процессоры корпорации Intel и учитывает их архитектуру, использование компонентов библиотеки более предпочтительно, чем ручное написание кода.

Parallel Extensions to the .NET Framework

Parallel Extensions to the .NET Framework (другие названия — Parallel FX Library, PFX) — это библиотека, разработанная фирмой Microsoft для использования в программах на базе управляемого (managed) кода. Она позволяет распараллеливать задачи, в которых могут использоваться специальные, координирующие (coordinating) структуры данных. Тем самым библиотека PFX упрощает написание параллельных программ, обеспечивая увеличение производительности при увеличении числа ядер или числа процессоров, исключая многие сложности современных моделей параллельного программирования. Первая версия библиотеки была представлена 29 ноября 2007 года, впоследствии выходили обновления в декабре 2007 и июне 2008 годов [100].

Parallel Extensions обеспечивает несколько новых способов организации параллелизма.

  • Параллелизм при декларативной обработке данных. Реализуется при помощи параллельного интегрированного языка запросов (PLINQ) — параллельной реализации LINQ. Отличие от LINQ заключается в том, что запросы выполняются параллельно, обеспечивая масштабируемость и загрузку доступных ядер и процессоров.
  • Параллелизм при императивной обработке данных. Реализуется при помощи библиотечных реализаций параллельных вариантов основных итеративных операций над данными, таких, как циклы for и foreach. Их выполнение автоматически распределяется на все доступные ядра/процессоры вычислительной системы.
  • Параллелизм на уровне задач. Библиотека Parallel Extensions обеспечивает высокоуровневую работу с пулом рабочих потоков, позволяя явно структурировать параллельно исполняющийся код с помощью легковесных задач. Планировщик библиотеки Parallel Extensions выполняет диспетчеризацию и управление исполнением этих задач, а также единообразный механизм обработки исключительных ситуаций.
  • Наибольшая производительность при использовании многоядерных процессоров или многопроцессорных машин. Вместо того чтобы принимать решение о верхней границе количества распараллеливаемых задач во время разработки, библиотека позволяет автоматически масштабировать выполняемые задачи, динамически вовлекая в работу все большее количество ядер, по мере того как они становятся доступными. Прирост производительности достигается при использовании Parallel Extensions на многоядерных процессорах или многопроцессорных машинах. Вместе с этим Parallel Extensions разработана так, чтобы минимизировать издержки и при выполнении на однопроцессорных машинах.

Языки программирования

Среди языков программирования можно указать как новые разработки, так и известные ранее языки, имеющие поддержку многозадачности или многопоточности.

Безусловно, наиболее массовыми языками программирования являются параллельные версии языков С и Фортран, работающие в основном через реализации MPI.

Язык Си++ часто критикуют за то, что обращение к методу класса в нем реализовано как вызов функции, в то время как Симула и Смолток позволяли объектам обмениваться сообщениями. Сторонники Си++ утверждают, что конкретный способ вызова метода класса — внутренняя кухня языка, скрытая от программиста, и что посылка сообщения является частным случаем вызова функции, только прямой вызов намного более эффективен в плане накладных расходов и машинных затрат на такты и оперативную память [98].

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

Прямой вызов функции, напротив, всегда синхронен. Обращаясь к методу класса, текущий код передает ему бразды правления и получает их только после явного возврата, который может вообще никогда не произойти! Распараллеливать программу приходится на этапе ее создания, причем реализовать динамический алгоритм, поддерживающий произвольное количество процессоров, в общем случае невозможно или крайне затруднительно, т. к. для этого фактически потребуется вручную реализовать Симула/Смолток-подобный "движок", "натянув" его поверх Си++, затратив кучу усилий и получив в итоге худшую производительность чем на чистой Симуле (Смолтоке).

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

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

Microsoft работает над новым языком программирования, известным как Axum. Особенность новой разработки в том, что этот язык изначально предназначен для написания многопоточных параллельных приложений, оптимизированных для работы на современных многоядерных процессорах [99].

По словам Джошуа Филлипса, программного менеджера Microsoft Parallel Computing Platform, пока каких-то утвержденных дат релиза Axum нет. "Новый язык в большей степени ориентирован на профессионалов, он предлагает безопасный и эффективный интерфейс для Net-программирования. Этот язык строится на веб-архитектуре, а также на принципах изолированности, масштабируемости и производительности", — говорит он.

Ранее в документах Microsoft язык Axum фигурировал под названием Maestro. Филлипс говорит, что в корпорации сейчас работают над интеграцией Axum в среду Visual Studio, оптимизацией языка для сетевого использования и повышением устойчивости платформы в целом.

Велика вероятность того, что первые варианты Axum появятся уже в среде Visual Studio 2010 в качестве движка, инкубированного в некоторые технологии. "Наша основная задача — создать безопасную, масштабируемую и более производительную модель программирования в .Net-окружении, сообщает CyberSecurity. Концепция Axum основана на полной изолированности процессов, которые будут между собой обмениваться контрольными сообщениями", — рассказывает он.

Axum будет базироваться на декларативной модели. Синтаксис Axum будет в значительной мере похож на C#.

"Ранее для того, чтобы получить повышенную производительность приложения, нам приходилось ждать выхода более быстрого процессора, сейчас перед нами стоит задача эффективного использования многоядерности процессоров", — отмечает Филлипс.

"В Axum будет пять основных концепций: домен, канал, агент, схема и слой. Язык также будет поддерживать глубокую инкубацию объектов кода", — резюмирует он.

Язык параллельного программирования MC# (http://www.mcsharp.net) предназначен для написания программ, работающих на всем спектре параллельных архитектур — от многоядерных процессоров до Grid-сетей. Единственное требование к таким системам со стороны MC# — на них должна быть установлена среда исполнения CLR (Common Language Runtime) с соответствующим набором библиотек. На машинах с операционной системой Windows реализацией такой среды является Microsoft .NET Framework, а на машинах с операционной системой Linux — система Mono (http://www.mono-project.com), которая является свободной реализацией платформы .NET для Unix-подобных систем [100].

Язык MC# является адаптацией и развитием базовых идей языка Polyphonic C# на случай параллельных и распределенных вычислений. Язык Polyphonic C# был разработан в 2002 г. в Microsoft Research Laboratory (г. Кембридж, Великобритания) Н. Бентоном (N. Benton), Л. Карделли (L. Cardelli) и Ц. Фурнье (C. Fournet). Целью его создания было добавление высокоуровневых средств асинхронного параллельного программирования в язык C# для использования в серверных и клиент-серверных приложениях на базе Microsoft .NET Framework

Ключевая особенность языка Polyphonic C# заключается в добавлении к обычным, синхронным методам, так называемых "асинхронных" методов, которые предназначены играть в (многопоточных) программах две основные роли:

  1. автономных методов, предназначенных для выполнения базовой вычислительной работы и исполняемых в отдельных потоках, и
  2. методов, предназначенных для доставки данных (сигналов) обычным, синхронным методом.

Для синхронизации нескольких асинхронных методов, а также асинхронных и синхронных методов, в язык C#, кроме того, были введены новые конструкции, получившие название связок (chords).

При этом исполнение Polyphonic C#-программ, по замыслу авторов этого языка, по-прежнему предполагалось либо на одной машине, либо на нескольких машинах, с зафиксированными на них асинхронными методами, взаимодействующими между собой с использованием средств удаленного вызова методов (RMIRemote Method Invocation), которые предоставляются библиотекой System.Runtime.Remoting платформы .NET.

В случае языка MC# программист может предусмотреть исполнение автономных асинхронных методов либо локально, либо удаленно. В последнем случае, метод может быть спланирован для исполнения на другой машине, выбираемой двумя способами: либо согласно явному указанию программиста (что не является типичным случаем), либо автоматически (обычно на наименее загруженном узле кластера или машине Grid-сети). Взаимодействие асинхронных методов, в рамках языка MC#, реализуется посредством передачи сообщений с использованием каналов и обработчиков канальных сообщений. Эти каналы и обработчики определяются в MC#-программах с помощью связок в стиле языка Polyphonic C#.

Таким образом, написание параллельной, распределенной программы на языке MC# сводится к выделению с помощью специального ключевого слова async методов, которые должны быть исполнены асинхронно локально (в виде отдельных потоков), а также с помощью ключевого слова movable тех методов, которые могут быть перенесены для исполнения на другие машины.

Краткие итоги

Данная лекция, безусловно, не претендует на полноту охвата всех существующих библиотек и уж тем более языков программирования.

Даны общие сведения о наиболее популярных библиотеках, которые интересны в плане их применения в программах на различных языках.

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

Основная доля новых работ нацелена на различные способы синхронизации объектов данных и поддержку многопоточного программирования.

Краткие итоги

  1. Каковы основные причины создания специализированных библиотек для программирования многоядерных процессоров?
  2. В чем заключаются основные особенности языка MC#?
  3. Назовите языки программирования многоядерных процессоров, ориентированные на функционирование в рамках среды .Net.

Упражнения

  1. Дайте сравнительную характеристику различных моделей программирования многоядерных процессоров.
  2. Дайте характеристику средствам программирования фирм Intel, IBM, Sun.

Заключение

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

Сергей Горбунов
Сергей Горбунов

 

прошел курс и сдал экзамен   Многоядерные процессоры   

система сертификат не выдала. почему?

Селена Шаронова
Селена Шаронова
Россия, Санкт-Петербург, ГБОУ Школа №438, учитель физики, математики
Екатерина Кудрявцева
Екатерина Кудрявцева
Россия, Самара, ПГУТИ, 2013