Свежий номер №5 (430) / Параллельный стиль Дата публикации: 11.02.2002 Константин Михайленко, const@anrb.ru
#include “mpi.h”/* определение функции */ double F (double x){ double c = x*x*x; return c; } int main (int argc, char **argv){ /* объявление рабочих переменных */ double sum, s, dx, a, b, x0, x1;int i, n; /* объявление переменных для MPI */ int ierror, myid, numproc; MPI_Status status; /* инициализация параллельной части приложения */ ierror = MPI_Init (&argc, &argv);if (ierror != 0) { printf (“MPI initialization error: %d”, ierror); return; } /* определение числа параллельных процессов в группе */ MPI_Comm_size (MPI_COMM_WORLD, &numproc);/* определение идентификатора процесса */ MPI_Comm_rank (MPI_COMM_WORLD, &myid);/* определение параметров интегрирования */ a = 0.0; b = 1.0; n = 20; dx = (b - a)/n/numproc; /* вычисление интеграла */ sum = 0.0; x0 = a + dx*n*myid; for (i = 0; i < n; i++) { x1 = x0 + dx; sum += (F(x0) + F(x1))*dx/2.0; x0 = x1; } /* отправка результата всеми процессами */ if (myid > 0){ MPI_Send(&sum, 1, MPI_DOUBLE, 0, 000+myid, \MPI_COMM_WORLD); } /* получение результатов процессом 0 и суммирование */ if (myid == 0){ s = sum; for (i = 0; i < numproc-1; i++) { MPI_Recv(&sum, 1, MPI_DOUBLE, MPI_ANY_SOURCE, \MPI_ANY_TAG, MPI_COMM_WORLD, &status); s += sum; } printf (“%g \n”, s); } MPI_Finalize(); }
|