ПОД (пособие) (1184372), страница 42
Текст из файла (страница 42)
Для автоматического распараллеливания на векторныхмашинах (векторизации) достаточно было проанализировать на предмет возможностипараллельного выполнения (замены на векторные операции) только самые внутренниециклы программы. В случае мультипроцессоров приходилось уже анализироватьобъемлющие циклы для нахождения более крупных порций работы, распределяемых междупроцессорами.Укрупнение распределяемых порций работы требует анализа более крупных фрагментовпрограммы, обычно включающих в себя вызовы различных процедур. Это, в свою очередь,требует сложного межпроцедурного анализа. Поскольку в реальных программах на языкеФортран могут использоваться конструкции, статический анализ которых принципиальноневозможен (например, косвенная индексация элементов массивов), то с увеличениемпорций распределяемой работы увеличивается вероятность того, что распараллеливательоткажется распараллеливать те конструкции, которые на самом деле допускаютпараллельное выполнение.Во-вторых, в отличие от многопроцессорных ЭВМ с общей памятью, на системах сраспределенной памятью необходимо произвести не только распределение вычислений, нои распределение данных, а также обеспечить на каждом процессоре доступ к удаленнымданным - данным, расположенным на других процессорах.
Для обеспечения эффективногодоступа к удаленным данным требуется производить анализ индексных выражений нетолько внутри одного цикла, но и между разными циклами. К тому же, недостаточно простообнаруживать факт наличия зависимости по данным, а требуется определить точно тотсегмент данных, который должен быть переслан с одного процессора на другой.В третьих, распределение вычислений и данных должно быть произведено согласованно.Несогласованность распределения вычислений и данных приведет, вероятнее всего, к тому,что параллельная программа будет выполняться гораздо медленнее последовательной.Если на системе с общей памятью распараллелить один цикл, занимающий 90 процентоввремени решения задачи, то можно рассчитывать на почти десятикратное ускорениепрограммы (даже если оставшиеся 10 процентов будут выполняться последовательно).
Насистеме с распределенной памятью распараллеливание этого цикла без учетапоследовательной части может вызватьне ускорение, а замедление программы.Последовательная часть будет выполняться на одном процессоре или на всех процессорах.Если в этой части используются распределенные массивы, то для такого выполненияпотребуется интенсивный обмен данными между процессорами.Согласованное распределение вычислений и данных требует тщательного анализа всейпрограммы, и любая неточность анализа может привести к катастрофическому замедлениювыполнения программы.Невозможностьполностьюавтоматическогораспараллеливанияимеющихсяпоследовательных программ для их выполнения на кластерах, не означает, конечно,неактуальности работ в этом направлении.
Если ввести некоторую дисциплину при135написании программ, и, возможно, позволить вставлять в программу некоторые подсказкираспараллеливателю, то такие программы могут автоматически преобразовываться впрограммы, способные выполняться параллельно на кластере. Однако в этом случае следуетговорить скорее не о распараллеливании имеющихся последовательных программ, а онаписании новых параллельных программ на традиционных языках последовательногопрограммирования или их расширениях.Система программирования MPI.MPI является на данный момент самой развитой системой параллельногопрограммирования с передачей сообщений.
MPI позволяет создавать эффективные инадежные, переносимые параллельные программы высокого уровня. Эффективность инадежность обеспечиваются такими механизмами как: определение MPI операций непроцедурно, а логически, т.е. внутренние механизмы выполнения операций скрыты отпользователя; использование непрозрачных объектов в MPI (группы, коммуникаторы, типыи т.д.);хорошей реализацией функций передачи данных, адаптирующихся к структуресистемы и обеспечивающих необходимую буферизацию данных.
Переносимостьобеспечивается такими механизмами, как: определение одного вычислительногокомпьютера в виде виртуального компьютера и возможность задания произвольногоколичества таких виртуальных компьютеров в системе не зависимо от количествафизических компьютеров (зависимость только от объема оперативной памяти в системе);компиляторы для соответствующих языков на компьютерах вычислительной системы.Уровень языка параллельного программирования определяется языковыми конструкциями,с помощью которых создаются параллельные программы.
Чтобы более четко представитьсебе этот уровень нужно ответить на вопрос: - В чем одно из важных отличий в написаниипоследовательной и параллельной программ? Здесь имеется ввиду параллельная программадля рассматриваемых MIMD систем. Прежде чем создавать параллельную программу,необходимо знать общую архитектуру (виртуальной) параллельной машины и топологию(виртуальных) межпроцессорных связей, которая существенно используется припрограммировании.
Это связано с тем, что невозможно создание автоматическогораспараллеливателя, который позволял бы превращать последовательную программу впараллельную, и обеспечивал бы ее высокую производительность. Поэтому в программеприходится в явном виде задавать операторы инициации виртуальных топологий иоператоры обменов данными между (виртуальными) процессорами. При написании жепоследовательной программы знать архитектуру процессора, на котором будет исполнятьсяпрограмма, зачастую нет необходимости, поскольку учет особенностей архитектурыскалярного процессора может быть сделан компилятором с приемлемыми потерями впроизводительности программы.
Поэтому языковый уровень параллельной программыявляется заведомо ниже уровня последовательной программы, т.к. пользователю нужно вявном виде увязывать структуру алгоритма своей задачи со структурой вычислительнойсистемы. Таким образом языковый уровень рассматривается в рамках уровнейпараллельных конструкций, для создания параллельных программ.
Для решения своейзадачи, пользователь с помощью команды (в командной строке): mpirun […] -np N, задаетвычислительную систему из N виртуальных компьютеров, соединенных между собойвиртуальными каналами с топологией связи - "полный граф". В дополнение к этому,наличие операторов парных взаимодействий между процессорами в такой среде,достаточно для реализации всего спектра используемых в программах схем системныхвзаимодействий. Но отображение структуры задачи на архитектуру системы с помощьютаких операторов требует некоторых усилий при программировании.
Параллельнаяпрограмма в этом случае будет громоздкой, плохо отлаживаемой, с неэффективнымотображением структуры алгоритма на структуру системы. Наличие в системе такихсредств как: виртуальные топологии, коллективные взаимодействия, создаваемые136пользователем типы данных и др., значительно повышают уровень параллельногопрограммирования.
Виртуальные топологии обеспечивают оптимальное приближениеархитектуры системы к структурам задач при хорошей переносимости задач.Главные цели создания системы параллельного программирования:Создать интерфейс прикладного программирования для МРР систем;Обеспечить возможность эффективных коммуникаций для коммуникации точка-точка,коллективных операций, группы процессов.Допускать удобное сопряжение с языками C, Fortran 77, Fortran 90 и C++;Простой способ создания процессов для модели SPMD (одна программа используется дляобработки разных данных на разных процессорах);Основные понятия языкаГруппа - упорядоченное (от 0 до ранга группы) множество идентификаторов процессовГруппы служат для указания адресата при посылке сообщений (процесс-адресат специфицируется своим номером в группе), определяют исполнителей коллективныхопераций.
Являются мощным средством функционального распараллеливания - позволяютразделить группу процессов на несколько подгрупп, каждая из которых должна выполнятьсвою параллельную процедуру. При этом существенно упрощается проблема адресации прииспользовании параллельных процедур.Контекст - область "видимости" для сообщений, аналогичное области видимостипеременных в случае вложенных вызовов процедур. Сообщения, посланные в некоторомконтексте, могут быть приняты только в этом же контексте. Контексты - также важныесредства поддержки параллельных процедур.Коммуникаторы - позволяют ограничить область видимости (жизни, определения)сообщений рамками некоторой группы процессов, т.е.
могут рассматриваться как пара группа и контекст. Кроме того, они служат и для целей оптимизации, храня необходимыедля этого дополнительные объекты.Имеются предопределенные коммуникаторы (точнее, создаваемые при инициализацииMPI-системы): * MPI_COMM_ALL - все процессы и операции над группами (локальные,без обмена сообщениями), например, Дай размер группы. MPI_GROUP_SIZE(IN group,OUT size) Дай номер в группе обратившегося процесса. MPI_GROUP_RANK(IN group,OUT rank)Основные операции - send, receiveОперации могут быть блокирующими и неблокирующими.В операции send задается:- адрес буфера в памяти;- количество посылаемых элементов;- тип данных каждого элемента;- номер процесса-адресата в его группе;- тег сообщения;- коммуникатор.MPI_SEND(IN start, IN count, IN datatype, IN dest, IN tag, IN comm) Типы данных - свои вMPI, но имеется соответствие между ними и типами Fortran и С.В операции receive задается:- адрес буфера в памяти;- количество принимаемых элементов;- тип данных каждого элемента;- номер процесса-отправителя в его группе;- тег сообщения;- коммуникатор;- ссылка на объект-статус, содержащий необходимую информацию о состоянии ирезультате операции.137Имеется возможность указать "любой отправитель" и "любой тег".Имеется три режима коммуникаций - стандартный, режим готовности и синхронный.В стандартном режиме последовательность выдачи операций send и receive произвольна,операция send завершается тогда, когда сообщение изъято из буфера и он уже можетиспользоваться процессом.В режиме готовности операция send может быть выдана только после выдачисоответствующей операции receive, иначе программа считается ошибочной и результат ееработы неопределен.
В синхронном режиме последовательность выдачи операцийпроизвольна, но операция send завершается только после выдачи и начала выполненияоперации receive. Во всех трех режимах операция receive завершается после получениясообщения в заданный пользователем буфер приема.Неблокирующие операции не приостанавливают процесс до своего завершения , авозвращают ссылку на коммуникационный объект, позволяющий опрашивать состояниеоперации или дожидаться ее окончания. Имеются операции проверки поступающихпроцессу сообщений, без чтения их в буфер (например, для определения длины сообщенияи запроса затем памяти под него).Средства описания и создания процессов в языке Фортран-GNS.Тип данных – TASKIDПо семантике языка Fortran GNS все процессы программы получают уникальные имена системные идентификаторы, по которым производится отождествление корреспондентовпри обмене сообщениями между процессами и в терминах которых задается средавыполнения функций редукции. Эти имена вырабатываются функцией порожденияпроцессов - встроенной функцией языка NEWTASK.