лекции (OpenMP), страница 8
Описание файла
Файл "лекции" внутри архива находится в папке "OpenMP". PDF-файл из архива "OpenMP", который расположен в категории "". Всё это находится в предмете "параллельное программирование для высокопроизводительных вычислительных систем" из 11 семестр (3 семестр магистратуры), которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 8 страницы из PDF
10.1, -O38 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP32 из 84Тесты NAS (класс B)70Время выполнения, в сек6050403020100MPIOpenMPCG47,9642,48EP5,085,08FT31,615,44IS1,931,04LU63,4547,44MG5,135,14Суперкомпьютер СКИФ-МГУ «Чебышев»mvapich 1.2Intel compiler, v. 11.1, -O38 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP33 из 84Алгоритм Якоби. Последовательная версия/* Jacobi program */#include <stdio.h>#define L 1000#define ITMAX 100int i,j,it;double A[L][L];double B[L][L];int main(int an, char **as){printf("JAC STARTED\n");for(i=0;i<=L-1;i++)for(j=0;j<=L-1;j++){A[i][j]=0.;B[i][j]=1.+i+j;}8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP34 из 84Алгоритм Якоби.
Последовательная версия/****** iteration loop *************************/for(it=1; it<ITMAX;it++){for(i=1;i<=L-2;i++)for(j=1;j<=L-2;j++)A[i][j] = B[i][j];for(i=1;i<=L-2;i++)for(j=1;j<=L-2;j++)B[i][j] = (A[i-1][j]+A[i+1][j]+A[i][j-1]+A[i][j+1])/4.;}return 0;}8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP35 из 84Алгоритм Якоби. MPI-версия8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP36 из 84Алгоритм Якоби. 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];8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP37 из 84Алгоритм Якоби.
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");8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP38 из 84Алгоритм Якоби. 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;}8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP39 из 84Алгоритм Якоби.
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];}}8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP40 из 84Алгоритм Якоби. 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]);8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP41 из 84Алгоритм Якоби.
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;}8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP42 из 84Алгоритм Якоби. MPI-версия8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP43 из 84Алгоритм Якоби.
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];8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP44 из 84Алгоритм Якоби.
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 */8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP45 из 84Алгоритм Якоби. 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);8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP46 из 84Алгоритм Якоби.
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));8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP47 из 84Алгоритм Якоби. 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];}8 декабря}Москва, 2015Гибридная модель программирования MPI/OpenMP48 из 84Алгоритм Якоби.
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);8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP49 из 84Алгоритм Якоби.
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;}8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP50 из 84Алгоритм Якоби. 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];8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP51 из 84Алгоритм Якоби.
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");8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP52 из 84Алгоритм Якоби. 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;}8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP53 из 84Алгоритм Якоби.