Научная статья на тему 'ВЛИЯНИЕ АРХИТЕКТУРЫ ПАРАЛЛЕЛЬНЫХ ВЫЧИСЛИТЕЛЬНЫХ СИСТЕМ НА МОДЕЛИ ПРОГРАММИРОВАНИЯ'

ВЛИЯНИЕ АРХИТЕКТУРЫ ПАРАЛЛЕЛЬНЫХ ВЫЧИСЛИТЕЛЬНЫХ СИСТЕМ НА МОДЕЛИ ПРОГРАММИРОВАНИЯ Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
52
17
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
АРХИТЕКТУРА СУПЕРКОМПЬЮТЕРОВ / ПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Шабанов Борис Михайлович, Телегин Павел Николаевич, Телегина Елена Витальевна

Рассмотрена связь программирования с архитектурой вычислительных систем. Приведены механизмы использования параллелизма по данным на общей, псевдообщей (NUMA) и распределенной памяти.The relationship between programming and the computer structure has been considered. The mechanisms of using parallelism based on the data of shared, non-uniform and distributed memory have been presented.

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Шабанов Борис Михайлович, Телегин Павел Николаевич, Телегина Елена Витальевна

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «ВЛИЯНИЕ АРХИТЕКТУРЫ ПАРАЛЛЕЛЬНЫХ ВЫЧИСЛИТЕЛЬНЫХ СИСТЕМ НА МОДЕЛИ ПРОГРАММИРОВАНИЯ»

ИНФОРМАЦИОННЫЕ ТЕХНОЛОГИИ

УДК 004.272.4, 004.42

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

Б.М.Шабанов, П.Н.Телегин, Е.В.Телегина Межведомственный суперкомпьютерный центр Российской академии наук

Рассмотрена связь программирования с архитектурой вычислительных систем. Приведены механизмы использования параллелизма по данным на общей, псевдообщей (NUMA) и распределенной памяти.

Ключевые слова: архитектура суперкомпьютеров, высокопроизводительные вычисления, параллельное программирование.

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

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

В модели c параллелизмом по данным (называется также параллелизм данных, data parallel) используется «естественный параллелизм», возникающий при обработке по одним и те же формулам регулярных структур данных, в первую очередь массивов, как в следующем примере операции над массивами:

A(1:N) = B(1:N) * C(1:N) + D(1:N).

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

© Б.М.Шабанов, П.Н.Телегин, Е.В.Телегина, 2011

Эта модель из-за простоты программирования получила широкое распространение. Элементы модели параллелизма по данным введены даже в таком последовательном языке как Фортран-95. В частности, это конструкции FORALL для организации групповых операций (параллельных циклов) и WHERE для задания условий при операциях над массивами.

В качестве примеров параллельных языков, построенных на основе модели параллелизма по данным, можно назвать CM FORTRAN, C*, Vienna FORTRAN, HIGH PERFORMANCE FORTRAN (HPF2).

Модель параллелизма по данным очень удобна при создании вычислителей класса SIMD, таких как матричные и векторные. Основным способом реализации векторных операций стала конвейерная обработка данных, и системы, построенные по данному принципу, получили название векторно-конвейерных. Образовалось два основных подхода к реализации операций над массивами: создание векторных процессоров и реализация ускорителей.

Системы, построенные на векторных процессорах, поддерживают векторные операции память-память, что обеспечивает непосредственное отображение модели программирования на реальное выполнение операций и исключительно высокую эффективность, например в системах NEC SX-9 и Cray XT5.

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

Векторные ускорители реализовывали подход разделения вычислительной и управляющей части программы. В настоящее время ускорители встраиваются внутрь кристалла (Intel SSE и IBM VMX). В микропроцессоре IBM Cell реализовано сразу восемь ускорителей.

Векторные операции в программе оформляются в виде библиотечных вызовов, оперирующих данными и операциями в ускорителе. Например, float a[4],b[4],c[4]; for(i=0;i<3;i++) c[i]=a[i]+b[i]; при использовании IBM VMX записывается как vector float a,b,c; c=vec_add(a,b);

Распространение также получили ускорители, построенные на основе графических карт, например NVIDIA Tesla/Fermi, AMD FireStream. Для их программирования используются системы программирования довольно низкого уровня, такие как CUDA и OpenCL.

Основная трудность при использовании внешних ускорителей - необходимость передачи больших объемов данных между основной памятью и локальной памятью ускорителя.

Модель параллелизма по данным не ограничивается выполнением на системах класса SIMD. Для выполнения на системах с множественным потоком команд в языке HPF применяется отображение данных на множество реальных процессоров. В [2] предложено ввести специальный тип данных - распределение индексного пространства по процессорам. Объекты данного типа используются для выравнивания распределенных массивов и циклов. Такой тип данных, в частности, реализован в языке системы распараллеливания RATIO, а также и в языке HPF (ключевое слово TEMPLATE). В языке DVM [3] используются дополнительные к HPF директивы для явного указания динамического размещения данных.

В следующем примере на языке RATIO вводится переменная типа распределение (DIST), по ней выравниваются массивы A и B, а также пространство итераций цикла: real a(16), b(2:22) C$ratio DISTRIBUTION DIST /( N_PROC) (1:16)/ C$ratio SPLIT A(DIST) C$ratio SPLIT B(DIST+1)

do i = 1, 10 C$ratio placed pardo with (DIST)

a(i) = b(i+1)

enddo

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

Эта модель начала активно развиваться еще в 1960-е гг. и послужила толчком для развития теории и практики. Изначально результаты использовались в первую очередь для многозадачных операционных систем. Появилось большое количество языков программирования, реализующих данную концепцию, например Modula-2, ADA. В качестве элементов языков можно назвать семафоры, барьеры, критические участки программы, параллельные участки, различные варианты параллельных циклов.

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

Системы с небольшим числом процессоров представляют собой системы с общей памятью (SMP-системы). Процессоры соединены с одними и теми же модулями памяти либо через общую шину, либо через коммутатор. Это позволяет обеспечить общее адресное пространство нескольким процессорам.

Одним из основных механизмов выполнения параллельных процессов операционной системой стало многонитевое программирование (threads) «легковесных процессов», для которых не создаются полноценные процессы с отдельным адресным пространством, но которые все же могут распределяться по процессорам. Такая реализация снижает накладные расходы по организации процессов на SMP-системах. Стандарт создания нитей POSIX Pthread поддерживается всеми ведущими производителями. При использовании нитей не производится запуск нового задания, а ответвляется процесс, работающий с той же областью памяти.

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

Основные конструкции организации параллельных нитей в языке OpenMP следующие:

!$OMP PARALLEL

< параллельный код > !$OMP END PARALLEL и

!$OMP PARALLEL DO

< код распределенного цикла > !$OMP END PARALLEL DO

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

При создании SMP-систем возникают физические ограничения на количество процессоров, которые могут эффективно работать над одними модулями памяти. При увеличении количества процессоров становится необходимым разделять память между процессорами, т.е. создавать системы с распределенной памятью. Однако накопленный опыт и относительная простота параллельного программирования с общей памятью позволяют использовать этот механизм при максимально возможном количестве процессоров. Для решения этой задачи был разработан механизм создания общего адресного пространства из набора локальных памятей NUMA (Non Uniform Memory Access). Для идентичной функциональности требовалось решить проблему когерентности кэшпамятей процессоров. В таком варианте механизм стал называться CC-NUMA (от Cache Coherent).

Одной из наиболее известных систем, использующей CC-NUMA, является SGI Altix. Эта система позволяет применять общее адресное пространство 512 процессорам.

Несмотря на то что в системах с общей памятью естественным образом реализуется принцип программирования с общей памятью, для эффективного использования программист должен помнить, что применение одних и тех же переменных в разных параллельных процессах требует физической синхронизации данных и тем самым снижает эффективность. Особенно это заметно в CC-NUMA-системах, где к издержкам синхронизации добавляется латентность при доступе к данным из локальных памятей других процессоров. Заметим, что в языках программирования возможно дублирование (создание локальных копий) переменных для уменьшения взаимодействия параллельных процессов. Например, в языке OpenMP это ключевое слово PRIVATE.

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

Модели программирования для систем с распределенной памятью могут строиться на основе передач сообщений (message passing), что подразумевает наличие различных непересекающихся наборов данных для параллельных процессов. Взаимодействие и передача данных происходят с помощью передачи сообщений. Для снижения транспортных расходов на передачу данных алгоритмы для данной модели обычно конструируются таким образом, чтобы использовать «крупноблочный» параллелизм.

Для программирования систем с распределенной памятью чаще всего используются коммуникационные библиотеки PVM и MPI, обеспечивающие передачи сообщений между процессорами. Причем MPI фактически стал международным стандартом программирования модели с передачей сообщений. Главным достоинством программ, написанных с использованием MPI, является их переносимость. Реализации MPI существуют практически для всех многопроцессорных вычислительных систем. MPI включает

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

В следующем примере приведены два вызова подпрограмм MPI - передачи и приема вещественной переменной A соответственно от процессора номер 0 к процессору номер 1:

call MPI_SEND(A, 1, MPI_REAL, 1, TAG, & MPI_COMM_WORLD, ierr);

call MPI_RECV(A, 1, MPI_REAL, 0, TAG, & MPI_COMM_WORLD, status, ierr);

Другой подход программирования для систем с распределенной памятью реализован в языках с разделенным глобальным адресным пространством (PGAS). Разделы памяти привязываются к физическим процессорам или ядрам, что делает языки PGAS удобным средством программирования также и систем с архитектурой NUMA. Языки mpC [4], UPC и Co-array Fortran (рекомендован как часть нового стандарта языка Фортран 2008) не содержат явных передач данных, однако позволяют адресовать локальные копии элементов данных. Операция над локальными копиями данных, принадлежащим разным процессорам, подразумевает передачу данных. Например, в языке Co-array Fortran конструкция me = this_image() if(me>1) x(:, о) = x(:, n)[me-1] if (me<num_images()) x(:, n+1) = x(:, 1)[me+1] производит обмен границами массива x.

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

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

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

Системы могут поддерживать несколько видов топологии. В частности, IBM Blue Gene поддерживает трехмерный тор, используемый в основном в вычислениях, и дерево, приспособленное для коллективных операций.

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

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

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

Литература

1. Foster I. Designing and Building Parallel Programs. - Addison-Wesley, 1995. - 430 с.

2. Melnikov V., Shabanov B., Telegin P., Chernjaev A. Automatic Parallelization of Programs for MIMD Computers, in Modern Geometric Computing for Visualization. - Tokyo, Springer-Verlag, 1992. -С. 253-262.

3. Коновалов Н.А, Крюков В.А. Параллельные программы для вычислительных кластеров и сетей // Открытые системы. - 2002. - № 3. - С. 12-18.

4. Ластовецкий А.Л. Программирование параллельных вычислений на неоднородных сетях компьютеров на языке mpC. Интерактивный учебный курс. http://www.ispras.ru/~mpc/tutorial/tutor-koi.html#_first

5. Selim G. Akl. Design and Analysis of Parallel Algorithms. - Prentice Hall, 1989. - 350 с.

6. Телегин П.Н., Шабанов Б.М. Связь моделей программирования и архитектуры параллельных вычислительных систем // Программные продукты и системы. - 2007, № 2. - С. 5-8.

7. Grids for Experimental Science: The Virtual Control Room, in proceedings of the Challenges of Large Applications in Distributed Environments (CLADE) / K.Keahey, M.E.Papka, Q.Peng et al. // Honolulu, HI, June 07, 2004.

Статья поступила 26 августа 2010 г.

Шабанов Борис Михайлович - кандидат технических наук, заместитель директора Межведомственного суперкомпьютерного центра РАН. Область научных интересов: высокопроизводительные вычислительные системы, архитектура ЭВМ, эффективность выполнения программ, использование суперкомпьютеров в научных расчетах.

Телегин Павел Николаевич - кандидат технических наук, заведующий отделом Межведомственного суперкомпьютерного центра РАН. Область научных интересов: параллельное программирование, инструментальные средства программирования, автоматическое распараллеливание программ, эффективность выполнения программ, архитектуры высокопроизводительных вычислительных систем. E-mail: telegin@jscc.ru

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

i Надоели баннеры? Вы всегда можете отключить рекламу.