MSU2011_MPI_OpenMP (811099), страница 2
Текст из файла (страница 2)
MPI-версия21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP28 из 125Алгоритм Якоби. MPI-версия/* Jacobi-1d program */#include <math.h>#include <stdlib.h>#include <stdio.h>#include "mpi.h"#define m_printf if (myrank==0)printf#define L 1000#define ITMAX 100int i,j,it,k;int ll,shift;double (* A)[L];double (* B)[L];21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP29 из 125Алгоритм Якоби. MPI-версияint main(int argc, char **argv){MPI_Request req[4];int myrank, ranksize;int startrow,lastrow,nrow;MPI_Status status[4];double t1, t2, time;MPI_Init (&argc, &argv); /* initialize MPI system */MPI_Comm_rank(MPI_COMM_WORLD, &myrank);/*my place in MPI system*/MPI_Comm_size (MPI_COMM_WORLD, &ranksize); /* size of MPI system */MPI_Barrier(MPI_COMM_WORLD);/* rows of matrix I have to process */startrow = (myrank *L) / ranksize;lastrow = (((myrank + 1) * L) / ranksize)-1;nrow = lastrow - startrow + 1;m_printf("JAC1 STARTED\n");21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP30 из 125Алгоритм Якоби.
MPI-версия/* dynamically allocate data structures */A = malloc ((nrow+2) * L * sizeof(double));B = malloc ((nrow) * L * sizeof(double));for(i=1; i<=nrow; i++)for(j=0; j<=L-1; j++){A[i][j]=0.;B[i-1][j]=1.+startrow+i-1+j;}21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP31 из 125Алгоритм Якоби. MPI-версия/****** iteration loop *************************/t1=MPI_Wtime();for(it=1; it<=ITMAX; it++){for(i=1; i<=nrow; i++){if (((i==1)&&(myrank==0))||((i==nrow)&&(myrank==ranksize-1)))continue;for(j=1; j<=L-2; j++){A[i][j] = B[i-1][j];}}21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP32 из 125Алгоритм Якоби.
MPI-версияif(myrank!=0)MPI_Irecv(&A[0][0],L,MPI_DOUBLE, myrank-1, 1215,MPI_COMM_WORLD, &req[0]);if(myrank!=ranksize-1)MPI_Isend(&A[nrow][0],L,MPI_DOUBLE, myrank+1, 1215,MPI_COMM_WORLD,&req[2]);if(myrank!=ranksize-1)MPI_Irecv(&A[nrow+1][0],L,MPI_DOUBLE, myrank+1, 1216,MPI_COMM_WORLD, &req[3]);if(myrank!=0)MPI_Isend(&A[1][0],L,MPI_DOUBLE, myrank-1, 1216,MPI_COMM_WORLD,&req[1]);ll=4; shift=0;if (myrank==0) {ll=2;shift=2;}if (myrank==ranksize-1) {ll=2;}MPI_Waitall(ll,&req[shift],&status[0]);21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP33 из 125Алгоритм Якоби.
MPI-версияfor(i=1; i<=nrow; i++){if (((i==1)&&(myrank==0))||((i==nrow)&&(myrank==ranksize-1))) continue;for(j=1; j<=L-2; j++)B[i-1][j] = (A[i-1][j]+A[i+1][j]+A[i][j-1]+A[i][j+1])/4.;}}/*DO it*/printf("%d: Time of task=%lf\n",myrank,MPI_Wtime()-t1);MPI_Finalize ();return 0;}21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP34 из 125Алгоритм Якоби. MPI-версия21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP35 из 125Алгоритм Якоби.
MPI-версия/*Jacobi-2d program */#include <math.h>#include <stdlib.h>#include <stdio.h>#include "mpi.h"#define m_printf if (myrank==0)printf#define L 1000#define LC 2#define ITMAX 100int i,j,it,k;double (* A)[L/LC+2];double (* B)[L/LC];21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP36 из 125Алгоритм Якоби. MPI-версияint main(int argc, char **argv){MPI_Request req[8];int myrank, ranksize;int srow,lrow,nrow,scol,lcol,ncol;MPI_Status status[8];double t1;int isper[] = {0,0};int dim[2];int coords[2];MPI_Comm newcomm;MPI_Datatype vectype;int pleft,pright, pdown,pup;MPI_Init (&argc, &argv);/* initialize MPI system */MPI_Comm_size (MPI_COMM_WORLD, &ranksize); /* size of MPI system */MPI_Comm_rank (MPI_COMM_WORLD, &myrank); /* my place in MPI system */21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP37 из 125Алгоритм Якоби.
MPI-версияdim[0]=ranksize/LC;dim[1]=LC;if ((L%dim[0])||(L%dim[1])){m_printf("ERROR: array[%d*%d] is not distributed on %d*%dprocessors\n",L,L,dim[0],dim[1]);MPI_Finalize();exit(1);}MPI_Cart_create(MPI_COMM_WORLD,2,dim,isper,1,&newcomm);MPI_Cart_shift(newcomm,0,1,&pup,&pdown);MPI_Cart_shift(newcomm,1,1,&pleft,&pright);MPI_Comm_rank (newcomm, &myrank); /* my place in MPI system */MPI_Cart_coords(newcomm,myrank,2,coords);21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP38 из 125Алгоритм Якоби.
MPI-версия/* rows of matrix I have to process */srow = (coords[0] * L) / dim[0];lrow = (((coords[0] + 1) * L) / dim[0])-1;nrow = lrow - srow + 1;/* columns of matrix I have to process */scol = (coords[1] * L) / dim[1];lcol = (((coords[1] + 1) * L) / dim[1])-1;ncol = lcol - scol + 1;MPI_Type_vector(nrow,1,ncol+2,MPI_DOUBLE,&vectype);MPI_Type_commit(&vectype);m_printf("JAC2 STARTED on %d*%d processors with %d*%d array,it=%d\n",dim[0],dim[1],L,L,ITMAX);/* dynamically allocate data structures */A = malloc ((nrow+2) * (ncol+2) * sizeof(double));B = malloc (nrow * ncol * sizeof(double));21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP39 из 125Алгоритм Якоби.
MPI-версияfor(i=0; i<=nrow-1; i++){for(j=0; j<=ncol-1; j++){A[i+1][j+1]=0.;B[i][j]=1.+srow+i+scol+j;}}/****** iteration loop *************************/MPI_Barrier(newcomm);t1=MPI_Wtime();for(it=1; it<=ITMAX; it++){for(i=0; i<=nrow-1; i++){if (((i==0)&&(pup==MPI_PROC_NULL))||((i==nrow-1)&&(pdown==MPI_PROC_NULL))) continue;for(j=0; j<=ncol-1; j++){if (((j==0)&&(pleft==MPI_PROC_NULL))||((j==ncol-1)&&(pright==MPI_PROC_NULL)))continue;A[i+1][j+1] = B[i][j];}21 февраля}Москва, 2011Гибридная модель программирования MPI/OpenMP40 из 125Алгоритм Якоби. MPI-версияMPI_Irecv(&A[0][1],ncol,MPI_DOUBLE,pup, 1215, MPI_COMM_WORLD, &req[0]);MPI_Isend(&A[nrow][1],ncol,MPI_DOUBLE,pdown, 1215, MPI_COMM_WORLD,&req[1]);MPI_Irecv(&A[nrow+1][1],ncol,MPI_DOUBLE,pdown, 1216, MPI_COMM_WORLD, &req[2]);MPI_Isend(&A[1][1],ncol,MPI_DOUBLE,pup, 1216, MPI_COMM_WORLD,&req[3]);MPI_Irecv(&A[1][0],1,vectype,pleft, 1217, MPI_COMM_WORLD, &req[4]);MPI_Isend(&A[1][ncol],1,vectype,pright, 1217, MPI_COMM_WORLD,&req[5]);MPI_Irecv(&A[1][ncol+1],1,vectype,pright, 1218, MPI_COMM_WORLD, &req[6]);MPI_Isend(&A[1][1],1,vectype,pleft, 1218, MPI_COMM_WORLD,&req[7]);MPI_Waitall(8,req,status);21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP41 из 125Алгоритм Якоби.
MPI-версияfor(i=1; i<=nrow; i++){if (((i==1)&&(pup==MPI_PROC_NULL))||((i==nrow)&&(pdown==MPI_PROC_NULL))) continue;for(j=1; j<=ncol; j++){if (((j==1)&&(pleft==MPI_PROC_NULL))||((j==ncol)&&(pright==MPI_PROC_NULL))) continue;B[i-1][j-1] = (A[i-1][j]+A[i+1][j]+A[i][j-1]+A[i][j+1])/4.;}}}printf("%d: Time of task=%lf\n",myrank,MPI_Wtime()-t1);MPI_Finalize ();return 0;}21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP42 из 125Алгоритм Якоби. MPI/OpenMP-версия/* Jacobi-1d program */#include <math.h>#include <stdlib.h>#include <stdio.h>#include "mpi.h"#define m_printf if (myrank==0)printf#define L 1000#define ITMAX 100int i,j,it,k;int ll,shift;double (* A)[L];double (* B)[L];21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP43 из 125Алгоритм Якоби.
MPI/OpenMP-версияint main(int argc, char **argv){MPI_Request req[4];int myrank, ranksize;int startrow,lastrow,nrow;MPI_Status status[4];double t1, t2, time;MPI_Init (&argc, &argv); /* initialize MPI system */MPI_Comm_rank(MPI_COMM_WORLD,&myrank); /*my place in MPI system */MPI_Comm_size (MPI_COMM_WORLD, &ranksize); /* size of MPI system */MPI_Barrier(MPI_COMM_WORLD);/* rows of matrix I have to process */startrow = (myrank * N) / ranksize;lastrow = (((myrank + 1) * N) / ranksize)-1;nrow = lastrow - startrow + 1;m_printf("JAC1 STARTED\n");21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP44 из 125Алгоритм Якоби.
MPI/OpenMP-версия/* dynamically allocate data structures */A = malloc ((nrow+2) * N * sizeof(double));B = malloc ((nrow) * N * sizeof(double));for(i=1; i<=nrow; i++)#pragma omp parallel forfor(j=0; j<=L-1; j++){A[i][j]=0.;B[i-1][j]=1.+startrow+i-1+j;}21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP45 из 125Алгоритм Якоби. MPI/OpenMP-версия/****** iteration loop *************************/t1=MPI_Wtime();for(it=1; it<=ITMAX; it++){for(i=1; i<=nrow; i++){if (((i==1)&&(myrank==0))||((i==nrow)&&(myrank==ranksize-1)))continue;#pragma omp parallel forfor(j=1; j<=L-2; j++){A[i][j] = B[i-1][j];}}21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP46 из 125Алгоритм Якоби. MPI/OpenMP-версияif(myrank!=0)MPI_Irecv(&A[0][0],L,MPI_DOUBLE, myrank-1, 1215,MPI_COMM_WORLD, &req[0]);if(myrank!=ranksize-1)MPI_Isend(&A[nrow][0],L,MPI_DOUBLE, myrank+1, 1215,MPI_COMM_WORLD,&req[2]);if(myrank!=ranksize-1)MPI_Irecv(&A[nrow+1][0],L,MPI_DOUBLE, myrank+1, 1216,MPI_COMM_WORLD, &req[3]);if(myrank!=0)MPI_Isend(&A[1][0],L,MPI_DOUBLE, myrank-1, 1216,MPI_COMM_WORLD,&req[1]);ll=4; shift=0;if (myrank==0) {ll=2;shift=2;}if (myrank==ranksize-1) {ll=2;}MPI_Waitall(ll,&req[shift],&status[0]);21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP47 из 125Алгоритм Якоби.
MPI/OpenMP-версияfor(i=1; i<=nrow; i++){if (((i==1)&&(myrank==0))||((i==nrow)&&(myrank==ranksize-1))) continue;#pragma omp parallel forfor(j=1; j<=L-2; j++)B[i-1][j] = (A[i-1][j]+A[i+1][j]+A[i][j-1]+A[i][j+1])/4.;}}/*DO it*/printf("%d: Time of task=%lf\n",myrank,MPI_Wtime()-t1);MPI_Finalize ();return 0;}21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP48 из 125Алгоритм Якоби. ОптимизированнаяMPI/OpenMP-версия/****** iteration loop *************************/t1=MPI_Wtime();#pragma omp parallel default(none) private(it,i,j) shared (A,B,myrank,nrow,ranksize,ll,shift,req,status)for(it=1; it<=ITMAX; it++){#pragma omp barrier /*Not necessary in OpenMP 3.0*/for(i=1; i<=nrow; i++){if (((i==1)&&(myrank==0))||((i==nrow)&&(myrank==ranksize-1)))continue;#pragma omp for nowaitfor(j=1; j<=L-2; j++){A[i][j] = B[i-1][j];}}21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP49 из 125Алгоритм Якоби.
ОптимизированнаяMPI/OpenMP-версия#pragma omp barrier#pragma omp single{if(myrank!=0)MPI_Irecv(&A[0][0],L,MPI_DOUBLE, myrank-1, 1215,MPI_COMM_WORLD, &req[0]);if(myrank!=ranksize-1)MPI_Isend(&A[nrow][0],L,MPI_DOUBLE, myrank+1, 1215,MPI_COMM_WORLD,&req[2]);if(myrank!=ranksize-1)MPI_Irecv(&A[nrow+1][0],L,MPI_DOUBLE, myrank+1, 1216,MPI_COMM_WORLD, &req[3]);if(myrank!=0)MPI_Isend(&A[1][0],L,MPI_DOUBLE, myrank-1, 1216,MPI_COMM_WORLD,&req[1]);ll=4; shift=0; if (myrank==0) {ll=2;shift=2;}if (myrank==ranksize-1) {ll=2;}MPI_Waitall(ll,&req[shift],&status[0]);21 февраляМосква, 2011}Гибридная модель программирования MPI/OpenMP50 из 125Алгоритм Якоби.
ОптимизированнаяMPI/OpenMP-версияfor(i=1; i<=nrow; i++){if (((i==1)&&(myrank==0))||((i==nrow)&&(myrank==ranksize-1))) continue;#pragma omp for nowaitfor(j=1; j<=L-2; j++)B[i-1][j] = (A[i-1][j]+A[i+1][j]+A[i][j-1]+A[i][j+1])/4.;}}/*DO it*/printf("%d: Time of task=%lf\n",myrank,MPI_Wtime()-t1);MPI_Finalize ();return 0;}21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP51 из 125Тесты NAS MultiZoneBT (Block Tridiagonal Solver) 3D Навье-Стокс, методпеременных направленийLU (Lower-Upper Solver) 3D Навье-Стокс, метод верхнейрелаксацииSP (Scalar PentadiagonalSolver) 3D Навье-Стокс, BeamWarning approximate factorizationhttp://www.nas.nasa.gov/News/Techreports/2003/PDF/nas-03-010.pdf21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP52 из 125Тесты NAS MultiZone21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP53 из 125Тест SP-MZ (класс A) на IBM eServer pSeries 690 Regatta2 процессора4 процессора1004590,479041,7439,564083,676,358037,836,9536,0235,33566,877030602550204015302010105001x22x18 процессов1x4MPI25DVM1621,64 21,6321,7620,8719,822020,44 20,872x2144x116 процессоров14,9812,9712,7219,21211,1110,9811,441010,479,9210,4110158106452001x821 февраляМосква, 20112x44x28x11x162x84x4Гибридная модель программирования MPI/OpenMP8x216x154 из 125Тест LU-MZ (класс A) на IBM eServer pSeries 690 Regatta2 процессора4 процессора80,0035,0071,1331,19 31,1566,2970,0028,5830,0060,13 60,8560,0032,38 31,7031,1625,0050,0020,0040,0015,0030,0020,0010,0010,005,000,001x20,002x11x48 процессоровMPI35,002x24x116 процессоровDVM16,0031,19 31,1514,0713,4914,0030,0012,3612,0312,0025,0021,5520,0019,23 19,2216,8310,7810,008,1917,8615,619,799,368,988,428,0015,006,0010,004,005,002,000,000,001x821 февраля25 октябряМосква,2011Н.