Lect_5_272015 (MPI), страница 3
Описание файла
Файл "Lect_5_272015" внутри архива находится в папке "MPI". PDF-файл из архива "MPI", который расположен в категории "". Всё это находится в предмете "параллельное программирование для высокопроизводительных вычислительных систем" из 11 семестр (3 семестр магистратуры), которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 3 страницы из PDF
*/MPI_Init(&argc, &argv); /* starts MPI */MPI_Comm_rank(MPI_COMM_WORLD, &Iam);/* get current process id */MPI_Comm_size(MPI_COMM_WORLD, &p);/* get number of processes */Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 553MPI_CART_SUB примерnrow = 3; mcol = 2; ndim = 2;root = 0; periods[0] = 1; periods[1] = 0; reorder = 1;/* create cartesian topology for processes */dims[0] = nrow;/* number of rows */dims[1] = mcol;/* number of columns */MPI_Cart_create(MPI_COMM_WORLD, ndim, dims, periods, reorder,&comm2D);MPI_Comm_rank(comm2D, &id2D);MPI_Cart_coords(comm2D, id2D, ndim, coords2D);/* Create 1D column subgrids */belongs[0] = 1;/* this dimension belongs to subgrid */belongs[1] = 0;MPI_Cart_sub(comm2D, belongs, &commcol);MPI_Comm_rank(commcol, &colID);MPI_Cart_coords(commcol, colID, 1, coords1D);Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 554MPI_CART_SUB примерMPI_Barrier(MPI_COMM_WORLD);/* aij = (i+1)*10 + j + 1; 1 matrix element to each proc */aij[0] = (coords2D[0]+1)*10 + coords2D[1]+1;if(Iam == root) {printf("\n MPI_Cart_sub example:");printf("\n 3x2 cartesian grid ==> 2 (3x1) column subgrids\n");printf("\n Iam 2D2D1D1Daij");printf("\n Rank Rank coords.
Rank coords.\n");}/* Last element of each column gathers elements of its own column */for ( i=0; i<=nrow-1; i++) {alocal[i] = -1;}Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 555MPI_CART_SUB примерlastrow = nrow - 1;MPI_Gather(aij, 1, MPI_INT, alocal, 1, MPI_INT, lastrow, commcol);MPI_Barrier(MPI_COMM_WORLD);printf("%6d|%6d|%6d %6d|%6d|%8d|",Iam,id2D,coords2D[0],coords2D[1],colID,coords1D[0]);for (i=0; i<=lastrow; i++) {printf("%6d ",alocal[i]);}printf("\n");MPI_Finalize();/* let MPI finish up ...
*/}Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 556MPI_CART_GETПараметрыsubgrid_commMPI_CommInputКоммуникаторndimsintInputЧисло измеренийdimsint *OutputМассив длин по каждому изизмеренийperiodsint *OutputПериодичность понаправлениямcoordsint *OutputКоординаты вызывающегопроцесса в решетке (массивразмера ndims )Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 557MPI_CART_GETИспользуется для получения информации о параметрахдекартовой топологии для заданного коммуникатораint MPI_Cart_sub( MPI_Comm comm, int maxdims,int *dims, int *periods, int *coords)Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 558MPI_CART_GET пример/* create Cartesian topology for processes */dims[0] = nrow;dims[1] = mcol;MPI_Cart_create(MPI_COMM_WORLD, ndim, dims, period,reorder, &grid_comm);MPI_Comm_rank(grid_comm, &me);MPI_Cart_coords(grid_comm, me, ndim, coords);/* create row subgrids */belongs[0] = 1;belongs[1] = 0;MPI_Cart_sub(grid_comm, belongs, &row_comm);/* Retrieve subgrid dimensions and other info */MPI_Cartdim_get(row_comm, &mdims);MPI_Cart_get(row_comm, mdims, dims, period, row_coords);Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 559MPI_CART_SHIFTПолучение номеров посылающего (source) ипринимающего (dest) процессов в декартовой топологиикоммуникатора comm для осуществления сдвига вдольизмерения direction на величину disp.int MPI_Cart_shift( MPI_Comm comm, intdirection, int displ, int *source, int *dest )Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 560MPI_CART_SHIFTПараметрыcommMPI_CommInputКоммуникаторdirectionintInputРазмерность, по которой будетпроизводиться сдвигdisplintInputВеличина и направлениесдвига (<0; >0; or 0)sourceint *OutputПроцесс- источникdestint *OutputПроцесс- получательСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 561MPI_CART_SHIFTДля периодических измерений осуществляетсяциклический сдвиг, для непериодических – линейныйсдвиг.Для n-мерной декартовой решетки значение directionдолжно быть в пределах от 0 до n-1.Значения source и dest можно использовать,например, для обмена функцией MPI_Sendrecv.Не является коллективной операцией!Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 562Пример декартовой решетки(send&recv, mesh)MPI_Request reqs[8];MPI_Status stats[8];MPI_Comm cartcomm;MPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_WORLD, &numtasks);if (numtasks == SIZE) {MPI_Cart_create(MPI_COMM_WORLD, 2, dims, periods,reorder, &cartcomm);MPI_Comm_rank(cartcomm, &rank);MPI_Cart_coords(cartcomm, rank, 2, coords);MPI_Cart_shift(cartcomm, 0, 1, &nbrs[UP], &nbrs[DOWN]);MPI_Cart_shift(cartcomm, 1, 1, &nbrs[LEFT], &nbrs[RIGHT]);outbuf = rank;Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 563Пример декартовой решетки(send&recv, mesh)for (i=0; i<4; i++) {dest = nbrs[i];source = nbrs[i];MPI_Isend(&outbuf, 1, MPI_INT, dest, tag, MPI_COMM_WORLD, &reqs[i]);MPI_Irecv(&inbuf[i], 1, MPI_INT, source, tag, MPI_COMM_WORLD,&reqs[i+4]);}MPI_Waitall(8, reqs, stats);printf("rank= %d coords= %d %d neighbors(u,d,l,r)= %d %d %d %dinbuf(u,d,l,r)= %d %d %d %d\n",rank,coords[0],coords[1],nbrs[UP],nbrs[DOWN],nbrs[LEFT],inbuf[UP],inbuf[DOWN],inbuf[LEFT],inbuf[RIGHT]);}elseprintf("Must specify %d tasks.
Terminating.\n",SIZE);MPI_Finalize(); }Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 564Задание 3.Разработать параллельную программудля умножения матриц. Распределение элементов матриц –ленточное, по строкам. Провести исследованиеэффективности разработанныхалгоритмов.Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 565.