Смекни!
smekni.com

Распределенные вычисления на FreePascal под Windows (стр. 3 из 3)

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

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.

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