Параллельное программирование в стандарте MPI. Баканов В.М - 45 стр.

UptoLike

Составители: 

- 45 -
localsum=0.0;
for (j=myrank; j<intervals; j+= ntasks) {
x = (j + 0.5) * width;
localsum += 4 / (1 + x*x);
}
Заметим, что нагрузка каждого процесса вычислением конкретного значе-
ния столь простой подинтегральной функции было бы крайне нерациональ-
ным решением, т.к. время обмена сообщениями (посылка главным процессом
значения параметра функции и прием вычисленного значения) сравнимо со
временем вычисления функции и существенно повысило бы время выполне-
ния программы (чрезмерно много коротких пересылок); подобный подход
является примером излишне тонкозернистого (fine-grained) параллелизма. В
целом следует стремиться к использованию возможно меньшего количества
максимально длинномерных обменов.
В качестве функции времени совместно с
MPI_Wtime
применяется стан-
дартная С-функция локального для вычислительного узла времени
ftime
(функция
F_TIME
). В программе использованы исключительно (блокирую-
щие) функции обменаточка-точка
MPI_Send/MPI_Recv
, активно использует-
ся барьерная функция
MPI_Barrier
(при вызове
MPI_Barrier(MCW)
управление в
вызывающую программу не возвращается до тех пор, пока все процессы
группы не вызовут
MPI_Barrier(MCW)
, где
MCW
коммуникатор). Синхрони-
зация с помощью барьеров используется, например, для завершения всеми
процессами некоторого этапа решения задачи, результаты которого будут
использоваться на следующем этапе. Использование барьера гарантирует,
что ни один из процессов не приступит раньше времени к выполнению сле-
дующего этапа, пока результат работы предыдущего не будет окончательно
сформирован.
// source code PI_01.C program
#include “mpi.h”
#include <stdio.h>
#include <math.h>
#include <sys/timeb.h> // for ftime
double f_time(void); /* define real time by ftime function */
#include “f_time.c”
double compute_interval (int myrank, int ntasks, long intervals);
int main(int argc, char ** argv)
{
long intervals=100; // number of integration’s parts
int i, myrank,ranksize;
double pi, di, send[2], recv[2],
t1,t2, t3,t4, t5,t6,t7, // time’s moments
pi_prec=4.0*(atanl(1.0)-atan(0.0)); // pi precision
MPI_Status status;
                                              - 45 -

  localsum=0.0;
  for (j=myrank; j
#include 

#include  // for ftime
double f_time(void); /* define real time by ftime function */
#include “f_time.c”

double compute_interval (int myrank, int ntasks, long intervals);

int main(int argc, char ** argv)
{
 long intervals=100; // number of integration’s parts
 int i, myrank,ranksize;
 double pi, di, send[2], recv[2],
          t1,t2, t3,t4, t5,t6,t7, // time’s moments
          pi_prec=4.0*(atanl(1.0)-atan(0.0)); // pi precision
 MPI_Status status;