Основы программирования параллельных вычислений

Основными особенностями программирования параллельных вычислений являются: более высокая производительность программ и применение специальных приемов программирования, с которыми связаны более высокая трудоемкость и проблемы с переносимостью программ. В отличие от последовательного программирования (на распространенных языках Бейсик, Паскаль, Си, Фортран и др.) при этом возникают дополнительные проблемы: управление работой множества процессоров, организация межпроцессорных пересылок данных и т.д. Наиболее распространенные подходы к распараллеливанию вычислений и обработки данных основаны на моделях параллелизма данных и параллелизма задач.

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

· обработкой данных управляет одна программа;

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

· слабая синхронизация вычислений на параллельных процессорах – выполнение команд на разных процессорах происходит, как правило, независимо и только иногда производится согласование (синхронизация) выполнения циклов или других элементов программы.

· параллельные операции над элементами массива выполняются одновременно на всех доступных данной программе процессорах.

Упрощению программирования способствует использование базовых операций:

· операций управления данными;

· операций над массивами в целом и их фрагментами;

· условных операций;

· операций приведения (вычисления для массива одного числа, например, суммы его элементов);

· операций сдвига;

· операций сканирования, например префиксная операция суммирования, при которой сумма N последовательных элементов одного массива присваивается N-му элементу другого массива;

· операций, связанные с пересылкой данных, например, между массивами разной формы, размерности и протяженности по каждому измерению.

Для составления программ в модели параллелизма данных используются специализированные языки – CM FORTRAN, C*, FORTRAN+, MPP FORTRAN, Vienna FORTRAN, а также HPF (High Performance FORTRAN – высокопроизводительный фортран), основанный на языке программирования FORTRAN-90 с его удобными операциями над массивами. Реализация модели параллелизма данных выполняется на уровне трансляции программы на машинный язык с помощью препроцессоров, использующих библиотеки с реализациями параллельных алгоритмов, предтрансляторов для предварительного анализа и оптимизации и распараллеливающих трансляторов, которые выявляют параллелизм в исходном коде программы и выполняют его преобразование в параллельные конструкции.

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

· повышенная трудоемкость разработки и отладки программ;

· необходимость обеспечения равномерной и сбалансированной загрузки всех процессоров;

· необходимость минимизации обмена данными между задачами для уменьшения времени передачи;

· повышенная опасность тупиковых ситуаций.

Однако положительными сторонами являются большая гибкость и свобода и, как следствие, возможность достижения максимального быстродействия на основе эффективного использования ресурсов. Примерами специализированных библиотек являются распространяемые свободно в исходных кодах библиотеки MPI (Message Passing Interface – Интерфейс Передачи Сообщений) и PVM (Parallel Virtual Machines). Реализации спецификации MPI представляют собой библиотеки подпрограмм, которые могут использоваться в программах на языках C/C++ и FORTRAN. Пример простейшей MPI-программы на языке С:

#include “mpi.h”

#include <stdio.h>

int main(int argc, char *argv[])

{

int myid, numprocs;

MPI_Init(&argc,&argv);

MPI_Comm_size(MPI_COMM_WORLD,&numprocs);

MPI_Comm_rank(MPI_COMM_WORLD,& myid);

fprintf(stdout,”Process %d of %d \n”, myid, numprocs);

MPI_Finalize();

return 0;

}

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

Средой выполнения параллельных программ являются операционные системы с поддержкой мультипроцессирования, многозадачности и многопоточности, например UNIX, LINUX, Microsoft Windows NT/2000/2003 Server.

Система разработки и выполнения параллельных программ PVM позволяет объединить разнородный набор компьютеров, связанных сетью в общий вычислительный ресурс, называемый Параллельной Виртуальной Машиной. Компьютеры могут быть многопроцессорными машинами любого типа: суперкомпьютерами, рабочими станциями и т.д., объединенными в сети любого вида (Ethernet, ATM и др. Поддерживаются языки C/C++ и FORTRAN и ряд других. Виртуальная машина допускает динамическое изменение конфигурации. Масштабируемость виртуальной машины позволяет включать в ее состав сотни хостов и выполнять в ее среде тысячи процессов. Система PVM может быть реализована в кластерах рабочих станций, имеющих относительно низкую стоимость – для создания кластера можно использовать даже сравнительно недорогие персональные компьютеры. Система PVM состоит из двух основных компонентов:

демона (процесса) pvmd3 (или pvdm), который запускается на всех компьютерах, входящих в состав виртуальной машины; Демоном в ОС UNIX называют процессы, управляющие различными службами, в данном случае выполнением PVM-программ.

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

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

Современное состояние программирования параллельных вычислений рассмотрено в [65].

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