Применение итеративного параллелизма в численных расчетах А.К. Буканова , КазНПУ имени Абая В последние годы появилось несколько типов вычислительных ресурсов, которые могут использоваться для выполнения высокопроизводительных приложений. К их числу относятся многоядерные процессоры общего назначения, реконфигурируемые аппаратные средства, графические процессоры, сигнальные процессоры и т.д. Во многих случаях использование специализированных вычислительных ресурсов обеспечивает значительный выигрыш в производительности, иногда на один-два порядка. Параллельным вычислениям в последнее время уделяется большое внимание. Это связано главным образом с двумя факторами. Первый фактор обусловлен научно-техническим прогрессом, в результате которого появились новые области знаний, требующие применения методов математического моделирования. Сами модели также существенно усложнились. В итоге происходит неуклонное возрастание потребности в ресурсоемких расчетах, которые в ряде случаев можно выполнить только на базе высокопроизводительной техники с помощью методов параллельных или распределенных вычислений. Другой существенный фактор, в результате которого интерес к параллельным вычислениям существенно вырос, состоит в повсеместном распространении параллельных компьютеров. В последнее время многопроцессорные серверы можно часто встретить на средних и крупных предприятиях, в банках, исследовательских институтах и центрах. В связи с появлением многоядерных процессоров многие пользователи стали обладателями мини-суперкомпьютеров на своих рабочих местах. Параллельные вычисления – современная многогранная область вычислительных наук, бурно развивающаяся и являющаяся наиболее актуальной в ближайшие десятилетия. Параллельная программа содержит несколько процессов, работающих совместно над выполнением некоторой задачи. Каждый процесс — это последовательная программа,а точнее — последовательность операторов, выполняемых один за другим. Последовательнаяпрограмма имеет один поток управления, а параллельная — несколько.Совместная работа процессов параллельной программы осуществляется с помощью ихвзаимодействия. Взаимодействие программируется с применением разделяемых переменныхили пересылки сообщений. Если используются разделяемые переменные, то один процессосуществляет запись в переменную, считываемую другим процессом. При пересылке сообщений один процесс отправляет сообщение, которое получает другой. При любом виде взаимодействия процессам необходима взаимная синхронизация. Существуют два основных вида синхронизации — взаимное исключение и условная синхронизация.Взаимное исключение обеспечивает, чтобы критические секции операторов не выполнялисьодновременно. Условная синхронизация задерживает процесс до тех пор, пока не выполнится определенное условие. Например, взаимодействие процессов производителя и потребителячасто обеспечивается с помощью буфера в разделяемой памяти. Производитель записывает вбуфер, потребитель читает из него. Чтобы предотвратить одновременное использование буфера и производителем, и потребителем (тогда может быть считано не полностью записанноесообщение), используется взаимное исключение. Условная синхронизация используется дляпроверки, было ли считано потребителем последнее записанное в буфер сообщение. Как и другие прикладные области компьютерных наук, параллельное программированиепрошло несколько стадий. Оно возникло благодаря новым возможностям, предоставленнымразвитием аппаратного обеспечения, и развилось в соответствии с технологическими изменениями. Через некоторое время специализированные методы были объединены в набор основных принципов и общих методов программирования. Параллельное программирование возникло в 1960_е годы в сфере операционных систем.Причиной стало изобретение аппаратных модулей, названных каналами, или контроллерамиустройств. Они работают независимо от управляющего процессора и позволяют выполнять операции ввода-вывода параллельно с инструкциями центрального процессора. Канал взаимодействует с процессором с помощью прерыванияаппаратного сигнала, который говорит:“Останови свою работу и начни выполнять другую последовательность инструкций ”. Результатом появления каналов стала проблема программирования (настоящая интеллектуальная проблема) – теперь части программы могли быть выполнены в непредсказуемомпорядке. Следовательно, пока одна часть программы обновляет значение некоторой переменной, может возникнуть прерывание, приводящее к выполнению другой части программы, которая тоже попытается изменить значение этой переменной. Вскоре после изобретения каналов началась разработка многопроцессорных машин, хотяв течение двух десятилетий они были слишком дороги для широкого использования. Однакосейчас все крупные машины являются многопроцессорными, а самые большие имеют сотни процессоров и часто называются машинами с массовым параллелизмом (massivelyparallelprocessors). Скоро даже персональные компьютеры будут иметь несколько процессоров.Многопроцессорные машины позволяют разным прикладным программам выполнятьсяодновременно на разных процессорах. Они также ускоряют выполнение приложения, если оно написано (или переписано) для многопроцессорной машины. Но как синхронизироватьработу параллельных процессов? Как использовать многопроцессорные системы для ускорения выполнения программ? Итак, при использовании каналов и многопроцессорных систем возникают и возможности, и трудности. При написании параллельной программы необходимо решать, сколькопроцессов и какого типа нужно использовать, и как они должны взаимодействовать. Этирешения зависят как от конкретного приложения, так и от аппаратного обеспечения, на котором будет выполняться программа. В любом случае ключом к созданию корректной программы является правильная синхронизация взаимодействия процессов. Под архитектурой вычислительной системы понимаются абстрактное представление ЭВМ с точки зрения программиста. Полное описание архитектуры системы включает в себя: - основные форматы представления данных; - способы адресации данных в программе; - состав аппаратных средств вычислительной машины, характеристики этих средств, принципы организации вычислительного процесса. В этой главе рассматриваются только последние аспекты архитектуры вычислительной системы. Структуру вычислительной системы можно определить как совокупность аппаратных средств ЭВМ с указанием основных связей между ними. Имеется много различных классификаций вычислительных систем. Рассмотрим наиболее часто используемые классификации. Наибольшее распространение получила классификация вычислительных систем, предложенная в 1966 г. профессором Стенфордского университета М.Д.Флином (M.J.Flynn) - классификация Флина. Эта классификация охватывает только два классификационных признака – тип потока команд и тип потока данных. Тип потока команд Одиночный Множественный Single Instruction Multiply Instruction К классификации Флина. Классификация по типу потока команд. В одиночном потоке команд в один момент времени может выполняться только одна команда. В этом случае эта единственная команда определяет в данный момент времени работу всех или, по крайней мере, многих устройств вычислительной системы. Во множественном потоке команд в один момент времени может выполняться много команд. В этом случае каждая из таких команд определяет в данный момент времени работу только одного или лишь нескольких (но не всех) устройств вычислительной системы. В одиночном потоке последовательно выполняются отдельные команды, во множественном потоке – группы команд. Тип потока данных Одиночный (ОД) Множественный(МД) Single Instruction(SD) Multiply Instruction(MD) К классификации Флина. Классификация по типу потока данных. Одиночный поток данных обязательно предполагает наличие в вычислительной системе только одного устройства оперативной памяти и одного процессора. Однако при этом процессор может быть как угодно сложным, так что процесс обработки каждой единицы информации в потоке может требовать выполнения многих команд. Множественный поток данных состоит из многих зависимых или независимых одиночных потоков данных. В соответствии со сказанным, все вычислительные системы делятся на четыре типа: - SISD (ОКОД); - MISD (МКОД); - SIMD (ОКМД); - MIMD (МКМД). Вычислительная система SISD представляет собой классическую однопроцессорную ЭВМ фон-неймановской архитектуры. На вычислительную системы MISD существуют различные точки зрения. По одно них – за всю историю развития вычислительной техники системы MISD не были созданы. По другой точке зрения (менее распространенной, чем первая) к MISD-системам относятся векторноконвейерные вычислительные системы. Мы будем придерживаться первой точки зрения. Вычислительная система SIMD содержит много процессоров, которые синхронно (как правило) выполняют одну и ту же команду над разными данными. Системы SIMD делятся на два больших класса: - векторно-конвейерные вычислительные системы; - векторно-параллельные вычислительные системы или матричные вычислительные системы. Вычислительная система MIMD содержит много процессоров, которые (как правило, асинхронно) выполняют разные команды над разными данными. Подавляющее большинство современных суперЭВМ имеют архитектуру MIMD (по крайней мере, на верхнем уровне иерархии). Системы MIMD часто называют многопроцессорными системами. Детально классификация этих систем рассмотрена в параграфе 3. Рассмотренная классификации Флина позволяет по принадлежности компьютера к классу SIMD или MIMD сделать сразу понятным базовый принцип его работы. Часто этого бывает достаточно. Недостатком классификации Флина является "переполненность" класс MIMD. Векторно-конвейерные вычислительные системы относятся к классу SIMD-систем. Основные принципы, заложенные в архитектуру векторно-конвейерных систем: - конвейерная организация обработки потока команд; - введение в систему команд набора векторных операций, которые позволяют оперировать с целыми массивами данных. Длина обрабатываемых векторов в современных векторно-конвейерных системах составляет, как правило, 128 или 256 элементов. Основное назначение векторных операций состоит в распараллеливании выполнения операторов цикла, в которых обычно сосредоточена большая часть вычислительной работы. Первый векторно-конвейерный компьютер Cray-1 появился в 1976 году. Архитектура этого компьютера оказалась настолько удачной, что он положил начало целому семейству компьютеров. Современные векторно-конвейерные системы имеют иерархическую структуру: - на нижнем уровне иерархии расположены конвейеры операций (например, конвейер (pipeline) сложения вещественных чисел, конвейер умножения таких же чисел и т.п.); - некоторая совокупность конвейеров операций объединяется в конвейерное функциональное устройство; - векторно-конвейерный процессор содержит ряд конвейерных функциональных устройств; - несколько векторно-конвейерных процессоров (2-16), объединенных общей памятью, образуют вычислительный узел; - несколько таких узлов объединяются с помощью коммутаторов, образуя либо NUMA-систему либо MPP-систему. Типичными представителями такой архитектуры являются компьютеры CRAY J90/T90, CRAY SV1, NEC SX-4/SX-5. Уровень развития микроэлектронных технологий не позволяет в настоящее время производить однокристальные векторно-конвейерные процессоры, поэтому эти системы довольно громоздки и чрезвычайно дороги. Каждая часть конвейера операций называется ступенью конвейера операций, а общее число ступеней - длиной конвейера операций. Пример 1. Рассмотрим следующий 4-х ступенчатый конвейер операций сложения вещественных чисел Таблица 1 Номер ступени Наименование 1 Вычитание порядков 2 Сдвиг одной из мантисс 3 Сложение мантисс 4 Нормализация Положим, что выполняется сложение двух -векторов вещественных чисел . Диаграмма сложения этих векторов приведена на рис. 3 К примеру 1. Временная диаграмма сложения (n*1)-векторов вещественных чисел X ,Y на 4-х ступенчатом конвейере операции сложения. В векторно-конвейерных системах в рамках одного конвейерного функционального устройства широко используется (т.е. аппаратно поддерживается)зацепление конвейеров операций. Покажем суть этой процедуры на примере. Пример 2.Положим, что в некоторой прикладной программе, исполняемой на векторно-конвейерной системе , необходимо вычислить (1) где -векторы вещественных чисел, под произведением и делением векторов понимается их покомпонентное умножение и деление, соответственно. Иными словами, операции, указанные в выражении (1), понимаются в смысле (2) Положим также, что конвейерное функциональное устройство данной векторно-конвейерной системы имеет следующие конвейеры операций: - конвейер сложения вещественных чисел; - конвейер умножения вещественных чисел; - конвейер деления вещественных чисел Тогда для повышения скорости вычисления компонент вектора E целесообразно использовать зацепление указанных конвейеров (см. рис. 4). В результате, можно сказать, получается новый конвейер, который выполняет сложную операцию (2) К примеру 2. К зацеплению конвейеров. Конвейер операций не следует путать с конвейером команд, в котором при исполнении одной команды готовится к исполнению несколько следующих команд. Так же, как в конвейере операций каждая часть конвейера команд называется ступенью конвейера команд, а общее число ступеней – длиной конвейера команд. Конвейеры команд широко используются в современных процессорах. Так процессор Intel 486 имеет 5ти ступенчатый конвейер выполнения целочисленных команд, ступенями которого являются следующие операции: - предвыборка (команда извлекается из КЭШ-памяти и размещается в одном из двух 16-байтовых буферах); - декодирование; - генерация адреса; - исполнение в АЛУ; - запись результата в КЭШ-память. Процессор Pentium 2 (суперскалярная архитектура) имеет два 8-ми ступенчатых конвейера целочисленных команд. Кроме конвейеров в векторно-конвейерных системах для ускорения работы используют различные механизмы адресации, операции с автоинкрементом (автодекрементом) адреса, механизмы ускоренной выборки и записи (многопортовая память, память с расслоением и т.д.), отдельное адресное обрабатывающее устройство, отдельное скалярное устройство для выполнения скалярных операций и пр.. Недостатком векторно-конвейерных систем является невысокая загрузка процессорных элементов. Высокая производительность достигается только на операциях с длинными векторами. На скалярных операциях и при обработке векторов и матриц невысокой размерности значительная часть устройств может простаивать. В целом, векторно-конвейерные системы характеризуются высокой производительностью при полной загрузке их вычислительных устройств, которая имеет место только при решении определенного, достаточно узкого, круга задач. В качестве примера векторно-конвейерной системы приведем легендарную супер-ЭВМ CYBER-205 фирмы CDC. CYBER-205 имеет следующие конвейерные функциональные устройства: одно конвейерное функциональное устройство «скалярных» операций с конвейерами сложения (5-ти ступенчатый); умножения (5-ти ступенчатый); логических операций сложения (3-х ступенчатый); цикла; извлечения корня; деления; 1, 2 или 4 конвейерных функциональных устройства «векторных» операций с конвейерами сложения; умножения; сдвига; логических операций; задержки. В качестве примера современной супер-ЭВМ, использующей векторноконвейерные процессоры, приведем японскую систему Fujitsu-VPP5000. На верхнем уровне Fujitsu-VPP5000 имеет MPP архитектуру. Производительность одного процессора системы составляет 9.6 Гфлопс, пиковая производительность системы может достигать 1249 Гфлопс, максимальная емкость памяти - 8 Тб. Система масштабируется до 512 узлов. Как и векторно-конвейерные системы, векторно-параллельная вычислительная система обычно имеет иерархическую структуру. На нижнем уровне иерархии находятся векторно-параллельные процессоры, представляющие собой совокупность скалярных процессоров (процессорных элементов), которые объединены некоторой коммуникационной сетью и в каждом такте синхронно выполняют одну и ту же команду над разными данными. На верхнем уровне иерархии векторно-параллельные процессоры объединяются общей памятью или коммуникационной сетью, образуя NUMA-систему либо MPP систему. Векторно-параллельные процессоры имеют в своих системах команд специальные векторные (матричные) операции, такие, как векторное и матричное сложение, умножение вектора на матрицу, умножение матрицы на константу, вычисление скалярного произведения, свертки и т.д. При выполнении векторных операций различные компоненты векторов и матриц обрабатываются параллельно на различных процессорных элементах. Основнымикомпонентами векторно-параллельногопроцессораявляются: - совокупность скалярных процессоров (Р); - совокупность модулей оперативной памяти (М); - коммуникационная среда; - устройство общего управления. Выделим две группы векторно-параллельных процессоров: процессоры с одинаковым числом скалярных процессоров и модулей памяти; векторные процессоры с различным количеством скалярных процессоров и модулей памяти. В векторно-параллельном процессоре с одинаковым числом скалярных процессоров и модулей памяти каждый скалярный процессор подключается к своему модулю памяти (см. рис. 5). Команда, выдаваемая устройством управления, содержит одинаковый адрес для всех скалярных процессоров. С помощью специального «флага» можно запретить выполнение команды на данном скалярном процессоре – «маскирование команды». В векторно-параллельном процессоре сразличным количество скалярных процессоров и модулей памяти (см. рис. 6) основной проблемой является проблема исключения конфликтов при обращении к памяти (поскольку к одному модулю памяти могут одновременно обращаться в переделе все скалярные процессоры). Для преодоления этой проблемы в системах этого класса используют изощренные схемы хранения массивов данных. Структура векторно-параллельного процессора с одинаковым числом скалярных процессоров и модулей памяти. Структура векторно-параллельного процессора с различным количеством скалярных процессоров и модулей памяти. В историческом плане наиболее известной векторно-параллельной системой является ILLIAC-IV (Burroughs). ЭВМ имела 64 процессора, объединенных в 8*8 плоскую решетку. Пиковая производительность равнялась 100 Мфлопс. Недостатком векторно-параллельных систем, как и векторноконвейерных систем, является низкая, как правило, загрузка процессорных элементов. Высокая производительность векторно-параллельных систем достигается только на векторных операциях, в то время как на скалярных операциях, а также при обработке векторов и матриц небольшой размерности, значительная часть процессорных элементов может простаивать. Программирование векторно-параллельных систем сложнее, чем векторно-конвейерных систем. В целом, векторно-параллельные системы, как и векторно-конвейерные системы, характеризуются высокой производительностью только при полной загрузке их вычислительных устройств, которая достигается при решении достаточно узкого класса задач. В качестве примера достаточно современной векторно-параллельной системы приведем вычислительную систему nCube-3 (1995 г.). Система nCube-3 масштабируется от 8 до 64 К процессорных блоков, объединенных коммуникационной сетью типа «гиперкуб» (размерностью от 3D до 16D). Максимальная производительность nCube-3 составляет несколько TFLOPS. Процессоры системы могут быть объединены в группы, каждая из которых может решать свою задачу (MIMD-режим). На сегодняшний день получили широкое распространение несколько, принципиально отличающихся друг от друга, систем параллельного програм мирования. Например, для многоядерных вычислительных систем (ВС) и па раллельных ВС с общей памятью используются многопоточные библиотеки и система программирования OpenMP. При разработке программ для систем с распределенной памятью наибольшую популярность получил стандарт MPI. Следует отметить, что программы, созданные с применением этих средств, эф фективно выполняются только на соответствующих им ВС. При переносе при ложения на параллельную ВС с другой архитектурой его, как правило, прихо дится переписывать заново. Архитектурная зависимость параллельных про грамм порождается не только различиями в организации ВС. Даже в рамках од ной архитектуры перенос программы с одной системы на другую может приве сти к разбалансировке вычислений из-за отличий в скоростных соотношениях процессоров и каналов передачи данных. Это ведет к использованию методов архитектурно-независимого параллельного программирования. Методы архитектурно-независимого параллельного программирования основаны на разделении на отдельные этапы процессов формирования логики программы и ее архитектурной привязки, что позволяет не решать эти две задачи одновременно. При таком подходе программа может разрабатываться так, как будто она использует неограниченные вычислительные ресурсы. В этом случае она может служить в качестве базовой спецификации, обеспечивающей более быстрое решение вопросов, связанных с верификацией и отладкой, по сравнению с традиционным подходом. В заключении сформулированы результаты работы: - Проведен обзор области параллельных вычислений; - Изучен коммуникационные библиотеки для организации параллельного выполнения программ; - Разаработана программа демонстрирующая параллельные вычисления посредством графического интерфейса. СПИСОК ИСПОЛЬЗОВАННЫХ ЛИТЕРАТУР 1. Воеводин В.В., Воеводин В. В. Параллельные вычисления. — Спб.: БХВПетербург, 2002. — 608 с. 2. Кутепов В. П. Интеллектуальное управление процессами и загруженностью в вычислительных системах/Изв. РАН ТиСУ 2007.№ 5 3. Яньков Сергей Георгиевич. Исследование и разработка методики отображения задач на кластерные системы с иерархически-неоднородной коммуникационной средой диссертация 2009.-168с 4. Тиц П. Г. Организация параллельных вычислений на многомашинных(многопроцессорных) вычислительных системах — диссертация 1975.-142 с. 5. Хорошевский В. Г. Архитектура вычислительных систем изд. МГТУ имени Н.Э.Баумана, 2008. 520с. 6. Ладыгин И.И., Калинина Г.А. Лабораторные работы по курсу «Вычислительные системы» М.: Издательство МЭИ, 1999, - 32 с. 7. Ладыгин И.И. Курс лекций «Вычислительные системы».8. http://www.supercomputers.ru 8. Кластеры на многоядерных процессорах / И.И. Ладыгин, А.В. Логинов, А.В. Филатов, С.Г. Яньков. М.: Издательский дом МЭИ, 2008. -112 с.10. www.wikipedia.org 9. Сервер информационных технологий www.citforum.ru 10. The Infiniband Trade Association official website http://www.infinibandta.org.