45721 (762112), страница 2

Файл №762112 45721 (Распределенные вычисления на FreePascal под Windows) 2 страница45721 (762112) страница 22016-08-02СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 2)

1

Я назвал это файл lgn.

После всех этих действий запуск MPI программы test осуществить можно как

>mpirun -pwdfile \\ILYA\COMMON\lgn -hosts 2 ILYA 1 EKATERINA 1 \\ILYA\COMMON\test.exe

Изменив соответствующие опции, можно запускать различное число процессов. Например

>mpirun -pwdfile \\ILYA\COMMON\lgn -hosts 2 ILYA 3 EKATERINA 3 \\ILYA\COMMON\test.exe

На рисунке виден результат такого вызова. Вывод от различных процессов выделяется различным цветом, поскольку опция -nocolor отключена. Обратите внимание на то, что последовательность номер выводимой строки вовсе не совпадает с номером процесса. Этот порядок будет меняться от случая к случаю.

На этом рисунке запечатлен Диспетчер задач при запуске на компьютере EKATERINA четырех процессов. Установлен приоритет по умолчанию.

Утилита MPIRegister.exe.

Поскольку компьютеры ILYA и EKATERINA объединены в локальную сеть, у меня нет никаких проблем с безопасностью. Пароль для пользователя mpiuser хранится в открытом виде в файле lgn. Увы, так можно делать далеко не всегда. Если компьютеры, входящие в кластер, являются частью более разветвленной сети, или, более того, используют подключение к Internet, так поступать не просто не желательно, а недопустимо.

В таких случаях следует хранить пароль пользователя, от имени которого будут запускаться процессы, в системном реестре Windows в зашифрованном виде. Для этого предназначена программа MPIRegister.exe.

Опции таковы

mpiregister

Запрашивает имя пользователя и пароль (дважды). После ввода спрашивает, сделать ли установки постоянными. При ответе 'yes' данные будут сохранены на диске, а иначе — останутся в оперативной памяти и при перезагрузке будут утеряны.

mpiregister -remove

Удаляет данные о пользователе и пароле.

mpiregister -validate

Проверяет правильность сохраненных данных.

Запускать mpiregister следует только на главном компьютере. Загрузчик приложения mpirun без опции -pwdfile будет запрашивать данные, сохраненные программой mpiregister. Если таковых не обнаружит, то запросит имя пользователя и пароль сам.

Более сложные программы.

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

Функции двухточечного обмена.

Блокирующая передача (прием) — означает, что программа приостанавливает свое выполнение, до тех пор, пока передача (прием) не завершится. Это гарантирует именно тот порядок выполнения операций передачи (приема), который задан в программе.

Блокирующая передача осуществляется с помощью функции MPI_Send.

function MPI_Send( buf : pointer;

count : longint;

datatype : MPI_Datatype;

destination : longint;

tag : longint;

comm : MPI_Comm) : longint;

Осуществляет передачу count элементов указанного типа процессу под номером destination.

buf

— адрес первого элемента в буфере передачи

count

— количество передаваемых элементов в буфере

datatype

— MPI-тип этих элементов

destination

— ранг процесса-получателя (принимает значения от нуля до n-1, где n — полное число процессов)

tag

— тег сообщения

comm

— коммуникатор

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

MPI_CHAR

shortint

1

MPI_SHORT

smallint

2

MPI_INT

longint

4

MPI_LONG

longint

4

MPI_UNSIGNED_CHAR

byte

1

MPI_UNSIGNED_SHORT

word

2

MPI_UNSIGNED

longword

4

MPI_UNSIGNED_LONG

longword

4

MPI_FLOAT

single

4

MPI_DOUBLE

double

8

MPI_LONG_DOUBLE

double

8

MPI_BYTE

untyped data

1

MPI_PACKED

составной тип

-

Переменная tag — вспомогательная целочисленная переменная.

MPI-тип MPI_PACKED используется при передаче данных производных типов (сконструированных из базовых типов). Их рассмотрение выходит за рамки данной статьи.

Функция MPI_Recv реализует блокирующий прием данных.

function MPI_Recv( buf : pointer;

count : longint;

datatype : MPI_Datatype;

source : longint;

tag : longint;

comm : MPI_Comm;

var status : MPI_Status) : longint;

buf

— начальный адрес буфера приема

count

— максимальное количество принимаемых элементов в буфере

datatype

— MPI-тип этих элементов

source

— ранг источника

tag

— тег сообщения

comm

— коммуникатор

status

— статус обмена

Эта функция осуществляет запрос на получение данных. При ее вызове процесс будет ожидать поступления данных от процесса под номером source. Если таковой не последует, то это приведет к повисанию программы (тупик). Так что при использовании этих функций следует проявлять бдительность.

Число принятых элементов может быть меньше значения переменной count. Если же посылаемые данные имеют больший размер, то будет выведено предупреждение об обрывании передачи.

Возвращаемая переменная status содержит информацию о передаче. Например, ее можно использовать, чтобы определить фактическое количество принятых элементов. Для этого используется функция MPI_Get_count

function MPI_Get_count(var status : MPI_Status;

datatype : MPI_Datatype;

var count : longint) : longint;

Число фактически принятых элементов — в возвращаемой переменной count.

Использование функций двухточечного обмена.

В следующем примере вычисление значений элементов массива "разводится" по двум процессам

uses mpi;

const num = 10;

var

teg, numprocs, myid : longint;

i : longint;

status : MPI_Status;

z, x : double;

arr : array[0..num] of double;

function f( x : double) : double;

begin

f := sqr(x);

end;

begin

MPI_Init(argc,argv);

teg := 0;

MPI_Comm_size(MPI_COMM_WORLD, numprocs);

MPI_Comm_rank(MPI_COMM_WORLD, myid);

for i := 0 to num do

case myid of

0:

if i mod 2 = 0 then arr[i] := f(1.0*i)

else

begin

MPI_Recv(@x,1,MPI_DOUBLE,1,teg,MPI_COMM_WORLD,status);

arr[i] := x

end;

1:

if i mod 2 = 1 then

begin

z := f(1.0*i);

MPI_Send(@z,1,MPI_DOUBLE,0,teg,MPI_COMM_WORLD);

end;

end; // case statement

if myid = 0 then for i := 0 to num do writeln(i,' ',arr[i]);

MPI_Finalize;

end.

Формируется массив заданного числа элементов так, что элементы с четными номерами рассчитывает процесс с myid=0, а нечетными — с myid=1. Конечно, вместо функции sqr может стоять любая другая. Программа написана, конечно же, в расчете на то, что процессов будет всего два. Поскольку значения myid, отличные от 0 и 1, не используются, процессы с такими номерами будут простаивать.

Улучшить программу, то есть написать такой ее вариант, чтобы использовались все процессы, предоставляю читателю :)

Функции коллективного обмена.

Коллективный обмен данными затрагивает не два процесса, а все процессы внутри коммуникатора.

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

function MPI_Bcast( buff : pointer;

count : longint;

datatype : MPI_Datatype;

root : longint;

comm : MPI_Comm) : longint;

buf

— адрес первого элемента буфера передачи

count

— максимальное количество принимаемых элементов в буфере

datatype

— MPI-тип этих элементов

root

— ранг источника рассылки

comm

— коммуникатор

Функция MPI_Bcast реализует "широковещательную передачу". Один процесс ( главный или root процесс) рассылает всем (и себе, в том числе) сообщение длины count, а остальные получают это сообщение.

function MPI_Reduce( buf : pointer;

result : pointer;

count : longint;

datatype : MPI_Datatype;

operation : MPI_Op;

root : longint;

comm : MPI_Comm) : longint;

buf

— адрес первого элемента буфера передачи

count

— количество элементов в буфере передачи

datatype

— MPI-тип этих элементов

operation

— операция приведения

root

— ранг главного процесса

comm

— коммуникатор

Функция MPI_Reduce выполняет операцию приведения над массивов данных buf, полученным от всех процессов, и пересылает результат в result одному процессу (ранг которого определен параметром root).

Как и функция MPI_Bcast, эта функция должна вызываться всеми процессами в заданном коммуникаторе, и аргументы count, datatype и operation должны совпадать.

Имеется 12 предопределенных операций приведения

MPI_MAX

максимальное значение

MPI_MIN

минимальное значение

MPI_SUM

суммарное значение

MPI_PROD

значение произведения всех элементов

MPI_LAND

логическое "и"

MPI_BAND

побитовое "и"

MPI_LOR

логическое "или"

MPI_BOR

побитовое "или"

MPI_LXOR

логическое исключающее "или"

MPI_BXOR

побитовое исключающее "или"

MPI_MAXLOC

индекс максимального элемента

MPI_MINLOC

индекс минимального элемента

Использование коллективных функций ( вычисление числа π).

Следующая программа демонстрирует вычисление определенного интеграла.

uses mpi;

// паскаль версия файла cpi.c из дистрибутива MPICH

var i, n, numprocs, myid : longint;

teg : longint;

status : MPI_Status;

startwtime, endwtime : double;

mypi, pimy, h, sum, x : double;

fname : text;

function f( r : double) : double;

begin

f := 4.0/(1 + sqr(r))

end;

begin

MPI_Init(argc,argv);

teg := 0;

MPI_Comm_size(MPI_COMM_WORLD, numprocs);

MPI_Comm_rank(MPI_COMM_WORLD, myid);

n := 0;

if myid=0 then

begin

Assign(fname,'n.in');

{$I-}

Reset(fname);

Readln(fname,n);

Close(fname);

{$I+}

startwtime := MPI_Wtime;

end;

MPI_Bcast( @n, 1, MPI_INT, 0, MPI_COMM_WORLD);

if n<>0 then

begin

h := 1.0/n;

sum := 0.0;

i := myid + 1;

while i <= n do

begin

x := h*( i - 0.5);

sum := sum + f(x);

i := i + numprocs;

end;

mypi := h*sum;

MPI_Reduce( @mypi, @pimy, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

if myid = 0 then

begin

writeln('; error is', abs(pimy-pi));

endwtime := MPI_WTime;

writeln('wall clock ', endwtime-startwtime)

end;

end;

MPI_Finalize;

end.

Файл n.in, содержащий в первой строке число разбиений (чем больше число, тем точнее считается π) должен присутствовать в том каталоге, где находится исполняемый файл.

Обратите внимание на то, что в этой программе нет case-вилок &mdash все процессы вызывают одни и те же функции.

Полезная функция MPI_Wtime

function MPI_Wtime : double;

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

В каталоге SDK/Examples также можно найти файл systest.c. Здесь находится версия этой программы, написанная на паскале.

Заключение.

Модуль mpi.pp содержит описание 230 функций MPI. У меня нет никакой возможности перечислить их все, да я и не ставил перед собой такой задачи. Я могу лишь гарантировать, что все функции, которые я использовал в приведенных примерах, работают правильно.

Если же Вам удалось найти (а еще лучше &mdash исправить) какой-либо баг в файле mpi.pp &mdash большая просьба сообщить об этом мне на mailto:avva14@mail.ru?subject=mpi.pp.

Замеченные мною баги:

1. Функции MPI_Info_c2f, MPI_Info_f2c и MPI_Request_c2f

Что они делают, я не знаю. В текущем модуле mpi.pp эти функции остаются нереализованными.

Благодарности.

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

Также выношу благодарность Шихалеву Ивану, который сильно помог в исправлении неточностей и ошибок первоначальной версии модуля mpi.pp.

Полезные ссылки.

1. http://www.mpi-forum.org/ — сайт, посвященный стандарту MPI.

2. http://www-unix.mcs.anl.gov/ — официальный сайт MPICH.

3. http://www.parallel.ru/ — ведущий русскоязычный сайт по параллельным вычислениям. На форуме будьте осторожны — там люди программируют на Си !

4. http://www.parallel.uran.ru/doc/mpi_tutor.html — хороший учебник по MPI для начинающих.

Не могу не порекомендовать также и печатную литературу по этой тематике:

1. С. Немнюгин, О. Стесик. Параллельное программирование для многопроцессорных вычислительных систем. "БХВ-Петербург" СПб, 2002.

Основы параллельного программирования изложены в доступной форме, большую часть книги занимает именно описание функций библиотеки MPI.

2. В.Д. Корнеев. Параллельное программирование в MPI. "Институт компьютерных исследований" М, Ижевск, 2003.

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

Список литературы

Для подготовки данной работы были использованы материалы с сайта http://www.citforum.ru/

Характеристики

Тип файла
Документ
Размер
178,82 Kb
Тип материала
Учебное заведение
Неизвестно

Список файлов статьи

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6521
Авторов
на СтудИзбе
302
Средний доход
с одного платного файла
Обучение Подробнее