Масштабирование программных архитектур для многоядерных вычислительных систем будущего

Создать новую статью

01.06.2009 00:00


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

Автор: Мэтт Джиллеспи (Matt Gillespie)

 

Обзор

 

Переход к многоядерным вычислительным системам все еще находится на начальной стадии. В не столь отдаленном будущем мы почти наверняка будем вспоминать процессоры с числом ядер, которые можно пересчитать по пальцам обеих рук, с легким чувством ностальгии. По мере роста аппаратного параллелизма архитектуры ПО тоже должны совершенствоваться, иначе отставание в производительности будет становиться все более серьезным. Например, легко заметить, что в двухъядерной системе программное обеспечение без поддержки многопотоковости может использовать только 50% от теоретической мощности процессора. Это значение снижается до 25% в четырехъядерной системе, до 12,5% — в системе с восемью ядрами, и т.д. Соответственно, по мере роста числа ядер процессора отставание в производительности, связанное с отсутствующей или неполной поддержкой многопотоковости, также будет расти в геометрической прогрессии.

 

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

 

Планируйте как решение проблем, так и реализацию возможностей

 

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

 

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

 

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

 

Многопотоковость - это стратегическая необходимость

 

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

 

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

 

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

 

При описании деловых нужд полезно рассмотреть тенденции развития многоядерного оборудования. Хотя сегодня большинство процессоров могут одновременно обрабатывать максимум несколько программных потоков, очевидно, что в будущем оборудование сможет поддерживать сотни или даже тысячи таких потоков. Отраслевые ресурсы, такие как журнал Intel Software Insight, издаваемый в сети Intel® Software, могут служить инструментом, позволяющим показать заинтересованным лицам, насколько важно подготовить программное обеспечение к будущим возможностям многоядерных аппаратных архитектур. Бесплатная электронная подписка позволяет получать этот журнал с регулярностью раз в два месяца, а также по желанию организовать доставку по электронной почте статей, технических документов, примеров внедрения и кратких описаний продукта, подобранных в соответствии с профилем пользователя. Кроме того, можно получать интересующие объявления о продуктах, обучении и мероприятиях.

 

Чтобы решать технические вопросы в компании-разработчике ПО в области распараллеливания, потребуются дополнительные знания и постоянное обучение. С этой целью компания Intel предоставляет расширенные ресурсы для разработчиков ПО. Можно начать с Центра разработчика многопотокового ПО для многоядерных процессоров сети Intel® Software. В число ключевых ресурсов, представленных на этом веб-узле, входят инструкции и другая техническая документация, обучающие материалы, а также база знаний. Последняя представляет собой набор коротких статей, адресованных разработчикам; в каждой из них рассматривается конкретная задача, связанная с разработкой многопотокового ПО, и приводится конкретное решение, которое разработчик сразу может применять. В сеть Intel Software входит и обучающий портал, открывающий доступ к дистанционным и очным курсам, интерактивным семинарам и веб-трансляциям по запросу, которые посвящены широкому кругу вопросов разработки.

 

Опишите процесс распараллеливания с помощью точных, но простых терминов

 

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

 

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

 

Вот почему корректная методология работы с потоками так важна: как в части разбиения задачи на правильные подзадачи, так и в части координации работы потоков с этими подзадачами.

 

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

 

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

 

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

 

Определите трудоемкость распараллеливания для каждого приложения

 

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

 

  • Приложения с легким распараллеливанием. Сюда относятся задачи, подобные описанным выше, для которых существует очевидная многопотоковая модель. Такие задачи иногда называют "явно параллельными"; в данную категорию входит примерно 10–20 процентов всех приложений.

 

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

 

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

 

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

 

Проектируйте ПО с учетом будущих усовершенствований оборудования

 

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

 

PL=PP*CP*H,

 

где PL — это число логических процессоров, PP — число физических процессоров, CP — число исполняющих ядер в каждом процессоре, а H=2 для систем, в которых включена технология Hyper-Threading (H=1 для систем без этой технологии). Необходимо отметить, что оптимальное число потоков обычно не превышает числа логических процессоров, хотя может быть и значительно меньше, в зависимости от типа задачи.

 

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

 

Значительное увеличение производительности за счет использования таких высокопараллелизованных систем имеет еще одно очень важное преимущество: возможность решать новые типы задач, которые раньше считались слишком сложными. В основном, возможность решения такой задачи за счет параллельных вычислений зависит от новых способов ее разбиения. Одна из моделей, которая помогает наглядно продемонстрировать такой тип анализа, носит название "Распознавание, анализ и синтез" (Recognition, Mining, and Synthesis, RMS) и состоит из трех следующих компонентов:

 

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

 

Модель RMS является очень мощной, и представляет тот тип структуры программного обеспечения, который в полной мере сможет использовать преимущества грядущего развития аппаратного параллелизма. Большие модели RMS требуют очень высокой плотности вычислений, а из-за большого объема анализируемых массивов данных применение параллельных расчетов при решении такого рода задач часто становится очевидным выбором. Согласно всему вышеизложенному, реализация RMS представляет собой хороший пример такой структуры решения с прицелом на будущее, которая позволяет разработчикам ПО надеяться, что грядущее совершенствование процессоров принесет им значительный выигрыш.

 

Внедряйте инструменты для упрощения и проверки многопотоковых моделей

 

Еще один важный фактор, который может помочь компании-разработчику ПО преуспеть в области долгосрочного перехода к параллельным приложениям, — это внедрение инструментов и технологий, позволяющих упростить создание высококачественного многопотокового ПО. Все продукты Intel® для разработчиков ПО предназначены для совместной работы и призваны облегчить разработку параллельных приложений.

 

  • Компиляторы Intel® могут автоматически распараллеливать приложение. Параметры компиляторов позволяют применять богатые возможности контроля над использованием технологий разделения на потоки. К числу таких технологий, являющихся отраслевыми стандартами, принадлежат, например, автоматическое распараллеливание и OpenMP*. Такая автоматизация делает компиляторы Intel хорошим выбором для начальных этапов распараллеливания, позволяя получить более высокую производительность при меньших затратах.
  • Библиотеки Intel® Performance Libraries предоставляют очень тонко настроенные функции ПО, с помощью которых можно легко добавить к приложениям параллелизм. Многие из этих функций предварительно распараллелены, и любая из них может быть легко распараллелена. Таким образом, эти функции хорошо подходят для реализации в многопотоковых приложениях. Кроме того, этот недорогой вариант позволяет увеличить производительность за счет распараллеливания, не прилагая особых усилий.
  • Анализатор производительности Intel® VTune™ определяет фрагменты кода, которые лучше всего подходят для ручного распараллеливания. Систематически определяя такие фрагменты и реализуя связанные с ними возможности, можно сконцентрироваться на распараллеливании той части кода, для которой оно будет иметь наибольший эффект.
  • ПО Intel® Threading Tools чрезвычайно упрощает отладку и оптимизацию производительности кода многопотокового приложения. Инструмент проверки потоков Intel® позволяет определить возможные ошибки распараллеливания в коде прежде, чем они произойдут, даже если разработчики не наблюдают этих ошибок на тестовом компьютере. Профайлер потоков Intel® Thread Profiler дает возможность проверить поведение потоков, чтобы определить потенциальные источники повышения производительности, позволяя эффективно выполнить точную настройку работы потоков.
  • Конструктивные компоненты Intel® Threading Building Blocks состоят из готовых библиотечных функций, которые упрощают разработку многопотоковых структур данных и алгоритмов, ускоряя работу программного обеспечения на многоядерном оборудовании. Готовые к использованию параллельные алгоритмы поддерживают простое встраивание в приложения, позволяя добиться масштабируемого ускорения работы ПО за счет определения числа доступных исполняющих ядер и динамической подгонки кода на этой основе.

 

Джеймс Рейндерс (James Reinders), директор по маркетингу и бизнесу отделения продуктов Intel® для разработчиков ПО, так описывает перспективы развития: "Как мне кажется, в ближайшем будущем разработчикам предстоит столкнуться с очень значительными изменениями. Через десяток лет мы оглянемся назад и поймем, насколько сильно изменился подход к написанию кода программ. Параллелизм получит повсеместное распространение. И, говоря по правде, здесь кроется немало возможностей как для компаний, так и для каждого отдельного разработчика ПО, включая разработчиков инструментов. Это касается и нашей команды в группе разработки программного обеспечения Intel. Прямо сейчас у нас есть отличная возможность еще раз подумать, распланировать стратегии программирования на следующее десятилетие и найти способы, чтобы задействовать весь потенциал многоядерной архитектуры процессоров".

 

Заключение

 

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

 

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

 

Дополнительные ресурсы

 

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

 

  • Сообщество разработчиков Intel® Multi-Core объединяет широкий спектр ресурсов для разработчиков. Эти ресурсы относятся к созданию программного обеспечения, которое оптимальным образом использует преимущества многоядерных процессоров.
  • Портал многоядерной технологии и исследований Intel® обеспечивает доступ к ряду ресурсов, посвященных имеющейся технологии многоядерных систем Intel, а также новым разработкам и исследованиям.
  • Продукты для разработчиков ПО Intel® позволяют упростить разработку высококачественных параллельных приложений с помощью инструментов, которые можно интегрировать в популярные среды разработки.

 

Об авторе

 

 

Мэтт Джиллеспи (Matt Gillespie) — независимый технический писатель и редактор. Он работает в регионе Чикаго и специализируется на новых технологиях аппаратного и программного обеспечения. Прежде чем заняться собственным бизнесом, Мэтт создавал обучающие программы для разработчиков ПО в корпорации Intel и был сотрудником технической веб-службы федерального банка Калифорнии. В последние несколько лет Мэтт работает писателем и редактором.