Delphi - сбориник статей


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


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

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_Wtimefunction MPI_Wtime : double;

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

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




Начало  Назад  Вперед