Е.С.Борисов
вторник, 10 июня 2003 г
Для параллельных вычислительных систем необходимо создавать специальные программы. В тексте такой программы определяются части (ветки), которые могут выполнятся параллельно, а также алгоритм их взаимодействия. Можно выделить два основных подхода к построению параллельных программ [1] :
Параллельные программы можно писать ''вручную'', непосредственно вставляя в нужные места вызовы коммуникационной библиотеки. Этот путь требует от программиста специальной подготовки. Альтернативой является использование систем автоматического и полуавтоматического распараллеливания последовательных программ.
Автоматические системы распараллеливания [5] выполняют декомпозицию последовательного алгоритма самостоятельно. На вход подается последовательная программа, на выход выдается её параллельный аналог. Пример такой системы это BERT77 средство автоматического распараллеливания Fortran-программ [6].
В случае полуавтоматической системы распараллеливания, в тексте последовательной программы выделяются блоки, которые могут выполнятся параллельно. Обычно, в текст вставляются специального вида комментарии, которые игнорируются обычным (последовательным) компилятором. Примером такой полуавтоматической системы может служить Adaptor - одна из реализаций спецификации HPF (High Performance Fortran)[4].
В данной статье предлагается полуавтоматическая система распараллеливания программ на C++ для популярной коммуникационной библиотеки MPICH.
Предлагаемый препроцессор языка C++ построен в рамках парадигмы распараллеливания по данным. В текст последовательной программы помещаются комментарии специального вида (обычный C++ компилятор их игнорирует), заменяемые препроцессором на соответствующие MPI-вызовы.
Определим метки препроцессора:
Рассмотрим классический пример параллельного программирования - вычисление . Число будем вычислять как определенный интеграл :
Согласно правилу прямоугольников интеграл можно заменить суммой:
[ mpibin ]$ ./pi
pi = 3.1415926535899708
[ mpibin ]$ mpirun -machinefile machines -np 2 pi
Process 0 on node2.home.net
Process 1 on node1.home.net
pi = 3.1415926535899708