Введение в практику разработки параллельных программ в стандарте MPI. Баканов В.М - 39 стр.

UptoLike

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

- 39 -
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(comm) управление в
вызывающую программу не возвращается до тех пор, пока все процессы
группы не вызовут MPI_Barrier(comm), где comm - коммуникатор). Синхрони-
зация с помощью барьеров используется, например, для завершения всеми
процессами некоторого этапа решения задачи, результаты которого будут
использоваться на следующем этапе. Использование барьера гарантирует,
что ни один из процессов не приступит раньше времени к выполнению сле-
дующего этапа, пока результат работы предыдущего не будет окончательно
сформирован.
// 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
  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

                                               - 39 -