Распределенные вычисления на FreePascal под Windows
Распределенные вычисления на FreePascal под Windows
Илья Аввакумов, Freepascal.ru
Введение. О чем эта статья.
Статья
посвящена вопросу написания распределенных (параллельных) вычислений с
использованием компилятора FreePascal (использовалась версия 2.0.1)
Проблема
параллельных вычислений заинтересовала меня совсем не потому что это сейчас
модно. Столкнулся с задачей, когда надо было сформировать (для дальнейнего
анализа) большой массив данных. Хотелось уменьшить время вычислений имеющимися
средствами. Оказывается, организовать параллельные вычисления с использованием
моего любимого компилятора — вполне решаемая задача.
Стандартом
для параллельных приложений для многопроцессорных вычислительных систем
де-факто является MPI.
Идея
MPI-программы такова: параллельная программа представляется в виде множества
взаимодействующих (посредством коммуникационных процедур MPI) процессов.
Параллельные
вычисления требуют
1.
Разделения процессов
2.
Взаимодействия между ними
MPI
(Message Passing Interface) — стандарт на программный инструментарий для
обеспечения связи между ветвями параллельного приложения.
В
этой статье рассматривается MPICH (MPI CHameleon), свободно распространяемая
реализация MPI. Использовалась версия MPICH 1.2.5 для Windows.
Установка и настройка MPICH.
MPICH
для Windows требует
1. Windows NT4/2000/XP ( Professional или
Server). Под Win9x/ME работать не станет!
2.
Сетевое соединение по протоколу TCP/IP между машинами.
Сразу
обговорю, что все примеры тестировались на двух машинах, объединенных в
локальную сеть. Один компьютер (сетевое имя ILYA) — мой, а второй (сетевое имя
EKATERINA) — жены.
Установка.
Компьютеры,
участвующие в вычислениях, назовем кластером. MPICH должен быть установлен на
каждом компьютере в кластере.
Для
установки нужно
Либо
с официальной страницы MPICH
#"67141.files/image001.gif">
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;
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;
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.citforum.ru/