1 include stdlib h include mpi h mainint
Пример 1. «Привет» #include <stdlib. h> #include "mpi. h" main(int argc, char **argv) { int me, size; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &me); MPI_Comm_size(MPI_COMM_WORLD, &size); printf("Hi, I’m process %d of %d n", me, size); MPI_Finalize(); }
Типы данных в MPI datatype C datatype MPI_CHAR signed char MPI_INT signed int MPI_LONG signed long int MPI_UNSIGNED_CHAR unsigned char MPI_UNSIGNED_SHORT unsigned short int MPI_UNSIGNED unsigned int MPI_UNSIGNED_LONG unsigned long int MPI_FLOAT float MPI_DOUBLE double MPI_LONG_DOUBLE long double
Пример 2. 1. «Все одному» #include "mpi. h" main (int argc, char **argv) { char message[20]; int myrank, size, i; MPI_Status status; MPI_Init (&argc, &argv); MPI_Comm_rank (MPI_COMM_WORLD, &myrank); MPI_Comm_size(MPI_COMM_WORLD, &size); if (myrank==0) /* code for process zero */ { strcpy (message, "Hello, there"); for (i=1; i<size; i++) MPI_Send(message, strlen(message)+1, MPI_CHAR, i, 99, MPI_COMM_WORLD); } else /* code for process one */ { MPI_Recv (message, 20, MPI_CHAR, 0, 99, MPI_COMM_WORLD, &status); printf ("proc %d received : %s: n", myrank, message); } MPI_Finalize(); }
Пример 2. 2: Парный обмен #include "mpi. h" main(int argc, char **argv) { int me, size, n; int SOME_TAG=0; MPI_Status status; MPI_Init (&argc, &argv); MPI_Comm_rank (MPI_COMM_WORLD, &me); MPI_Comm_size (MPI_COMM_WORLD, &size); if ((me % 2)==0) { /* send unless highest-numbered process */ if ((me+1) < size) { MPI_Send (&me, 1, MPI_INT, me+1, SOME_TAG, MPI_COMM_WORLD); MPI_Recv(&n, 1, MPI_INT, me+1, SOME_TAG, MPI_COMM_WORLD, &status); printf("me %d received %dn", me, n); } } else { MPI_Recv(&n, 1, MPI_INT, me-1, SOME_TAG, MPI_COMM_WORLD, &status); MPI_Send (&me, 1, MPI_INT, me-1, SOME_TAG, MPI_COMM_WORLD); printf("me %d received %dn", me, n); } MPI_Finalize(); }
Пример 3: Обмен по кольцу без блокировки #include "mpi. h" #include <stdio. h> main(int argc, char **argv) { int numtasks, rank, next, prev, buf[2], tag 1=1, tag 2=2; MPI_Request reqs[4]; MPI_Status stats[4]; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &numtasks); MPI_Comm_rank(MPI_COMM_WORLD, &rank); prev = rank - 1; next = rank + 1; if (rank == 0) prev = numtasks - 1; if (rank == (numtasks - 1)) next = 0; MPI_Irecv(&buf[0], 1, MPI_INT, prev, tag 1, MPI_COMM_WORLD, &reqs[0]); MPI_Irecv(&buf[1], 1, MPI_INT, next, tag 2, MPI_COMM_WORLD, &reqs[1]); MPI_Isend(&rank, 1, MPI_INT, prev, tag 2, MPI_COMM_WORLD, &reqs[2]); MPI_Isend(&rank, 1, MPI_INT, next, tag 1, MPI_COMM_WORLD, &reqs[3]); MPI_Waitall(4, reqs, stats); printf("me %d recv %d %dn", rank, buf[0], buf[1]); MPI_Finalize(); }
Пример 4. Вычисление числа где #include "mpi. h" #include <math. h> main ( int argc, char **argv ) { int n=0, myid, numprocs, i; double mypi, h, sum, x, t 1, t 2, PI 25 DT = 3. 141592653589793238462643; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &numprocs); MPI_Comm_rank(MPI_COMM_WORLD, &myid); if (myid == 0) t 1 = MPI_Wtime(); if (argc>1) n=atoi(argv[1]); else { printf("number of points is neededn"); return; }
h = 1. 0/ (double) n; sum = 0. 0; for (i = myid +1; i <= n; i+= numprocs) { x = h * ( (double)i - 0. 5); sum += (4. 0 / (1. 0 + x*x)); } mypi = h * sum; // Cуммирования mypi со всех процессоров в переменную pi MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (myid == 0) { t 2 = MPI_Wtime(); printf ("pi is approximately %. 16 f. Error is %. 16 fn", pi, fabs(pi - PI 25 DT)); printf ("'time is %f seconds n", t 2 -t 1); } MPI_Finalize(); }
- Slides: 37