Программирование для многопроцессорных систем в стандарте MPI - Шпаковский Г.И., Серикова Н.В.. Программирование для многопроцессорных систем в стандарте MPI -. Организация вычислений в многопроцессорных системах
Скачать 1.61 Mb.
|
Задание 8.1. #include #include #include #include "mpi.h" #include "jacobi.h" /* описание Mesh как структуры */ static int do_print = 0; static int max_it = 100; int main( argc, argv ) int argc; char **argv; { int rank, size, i, j, itcnt, maxm, maxn, lrow, k; Mesh mesh; double diffnorm, gdiffnorm, *swap,t, *xlocalrow, *xnewrow; MPI_Init( &argc, &argv ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); MPI_Comm_size( MPI_COMM_WORLD, &size ); Get_command_line( rank, argc, argv, &maxm, &maxn, &do_print, &max_it ); Setup_mesh( maxm, maxn, &mesh ); for (k=0; k<2; k++) { itcnt = 0; Init_mesh( &mesh ); /* инициализация */ 315 MPI_Barrier( mesh.ring_comm ); t = MPI_Wtime(); if (do_print && rank == 0) printf( "Starting at time %f\n", t ); fflush(stdout); lrow = mesh.lrow; do { Exchange( &mesh ); /* заполнение теневых точек */ itcnt ++; diffnorm = 0.0; xnewrow = mesh.xnew + 1 * maxm; xlocalrow = mesh.xlocal + 1 * maxm; /* вычисляем новые значения (не на границах) */ for (i=1; i<=lrow; i++) { for (j=1; j } xnewrow += maxm; xlocalrow += maxm; } swap = mesh.xlocal; mesh.xlocal = mesh.xnew; mesh.xnew = swap; /* точность вычислений */ MPI_Allreduce( &diffnorm, &gdiffnorm, 1, MPI_DOUBLE, MPI_SUM, mesh.ring_comm ); gdiffnorm = sqrt( gdiffnorm ); if (do_print && rank == 0) { printf( "At iteration %d, diff is %e\n", itcnt, gdiffnorm ); fflush( stdout ); } } while (gdiffnorm > 1.0e-2 && itcnt < max_it); t = MPI_Wtime() - t; } if (rank == 0) { printf( "%s: %d iterations in %f secs (%f MFlops), m=%d n=%d np=%d\n", TESTNAME, itcnt, t, itcnt * (maxm-2.0)*(maxn-2)*(4)*1.0e-6/t, maxm, maxn, size); } MPI_Comm_free( &mesh.ring_comm ); MPI_Finalize( ); return 0; } #include #include #include #include "mpi.h" 316 #include "jacobi.h" /* процедура для получение размеров сетки из командной строки */ void Get_command_line( rank, argc, argv, maxm, maxn, do_print, maxit ) int rank, argc, *maxm, *maxn, *do_print, *maxit; char **argv; { int args[4], i; if (rank == 0) /* получение maxn из командной строки */ { *maxn = DEFAULT_MAXN; *maxm = -1; for (i=1; i { *maxn = atoi( argv[i+1] ); i++; } else if (strcmp( argv[i], "-m" ) == 0) { *maxm = atoi( argv[i+1] ); i++; } else if (strcmp( argv[i], "-maxit" ) == 0) { *maxit = atoi( argv[i+1] ); i++; } } if (*maxm < 0) *maxm = *maxn; args[0] = *maxn; args[1] = *maxm; args[2] = *do_print; args[3] = *maxit; } MPI_Bcast( args, 4, MPI_INT, 0, MPI_COMM_WORLD ); *maxn = args[0]; *maxm = args[1]; *do_print = args[2]; *maxit = args[3]; } #include #include #include #include "mpi.h" #include "jacobi.h" /* процедура размещения элементов сетки по процессам */ void Setup_mesh( maxm, maxn, mesh ) int maxm, maxn; Mesh *mesh; { int false = 0; int true = 1; int lrow, rank, size; register double *xlocal, *xnew; /* картезианская топология */ MPI_Comm_size( MPI_COMM_WORLD, &size ); MPI_Cart_create( MPI_COMM_WORLD,1,&size,&false,true,&mesh->ring_comm ); 317 /* определяем соседей*/ MPI_Cart_shift( mesh->ring_comm, 0, 1, &mesh->down_nbr, &mesh->up_nbr ); MPI_Comm_rank( mesh->ring_comm, &rank ); MPI_Comm_size( mesh->ring_comm, &size ); lrow = (maxn - 2) / size; if (rank < ((maxn - 2) % size)) lrow++; mesh->lrow = lrow; mesh->maxm = maxm; mesh->maxn = maxn; /* размещение частей сетки по процессам */ mesh->xlocal = xlocal = (double *)malloc( maxm * ( lrow + 2 ) * sizeof(double) ); mesh->xnew = xnew = (double *)malloc( maxm * ( lrow + 2 ) * sizeof(double) ); if (!mesh->xlocal || !mesh->xnew) { fprintf( stderr, "Unable to allocate local mesh\n" ); MPI_Abort( MPI_COMM_WORLD, 1 ); } } void Init_mesh( mesh ) /* процедура инициализации сетки */ Mesh *mesh; { int i, j, lrow, rank, maxm; register double *xlocal, *xnew; xlocal = mesh->xlocal; xnew = mesh->xnew; lrow = mesh->lrow; maxm = mesh->maxm; MPI_Comm_rank( mesh->ring_comm, &rank ); for (i=1; i<=lrow; i++) for (j=0; j /* заполнение граничных значений */ for (j=0; j } for (i=1; i<=lrow; i++) { xnew[i*maxm] = rank; xnew[i*maxm+maxm-1] = rank; } } #include #include #include #include "mpi.h" 318 #include "jacobi.h" void Exchange( mesh ) /* процедура обменов для заполнения теневых то- чек */ Mesh *mesh; { MPI_Status status; double *xlocal = mesh->xlocal; int maxm = mesh->maxm; int lrow = mesh->lrow; int up_nbr = mesh->up_nbr; int down_nbr = mesh->down_nbr; MPI_Comm ring_comm = mesh->ring_comm; /* передаем вверх, получаем снизу */ MPI_Send( xlocal + maxm * lrow, maxm, MPI_DOUBLE, up_nbr, 0, ring_comm ); MPI_Recv( xlocal, maxm, MPI_DOUBLE, down_nbr, 0, ring_comm, &status ); /* передаем вниз, получаем сверху */ MPI_Send( xlocal + maxm, maxm, MPI_DOUBLE, down_nbr, 1, ring_comm ); MPI_Recv( xlocal + maxm * (lrow + 1), maxm, MPI_DOUBLE, up_nbr, 1, ring_comm, &status ); } 319 ИСТОЧНИКИ И НФОРМАЦИИ 1. Argonne National Laboratory (http://www.mcs.anl.gov/mpi ). 2. Кластерные установки в России ( http://parallel.ru/parallel/russia/russian_clusters.html ). 3. Научно-исследовательский вычислительный центр МГУ ( http://www.parallel.ru). 4. Gropp W., Lusk E., Skjellum A. Using MPI: Portable Parallel Programming with the Message-Passing Interface. Second edition, published in 1999 by MIT Press, 371 p. 5. Snir M., Otto S., Huss-Lederman S. etc. MPI – The Complete Reference: Vol.1, The MPI Core. Second edition,published in 1998 by MIT Press, 426 p. 6. Gropp W., .Huss-Lederman S., Lumsdaine A. etc. MPI – The Complete Refer- ence: Vol.2, The MPI-2 Extensions. Published in 1998 by MIT Press. 7. Gropp W., Lusk E., Thakur R. Using MPI - 2: advanced features of the message- passing interface. Published in 1999 by MIT Press, 382 p. 8. Peter S. Pacheco. Parallel Programming With MPI. Published by Morgan Kauf- mann, San Francisco, California, 1997. 9. Программа Союзного государства СКИФ по разработке кластерных сис- тем, 2001 г. (http://www.botik.ru ). 10. Шпаковский Г.И., Серикова Н.В. Пособие по программированию для мно- гопроцессорных систем в среде MPI. Мн., 2001г. (http://www.bsu.by). 11. MPI: Стандарт интерфейса передачи сообщений. Перевод с англ. Шпаков- ского Г.И., Мн., 2001 г. ( http://www.bsu.by ). 12. Белорусский государственный университет (http://www.bsu.by ). 13. Шпаковский Г.И. Организация параллельных ЭВМ и суперскалярных про- цессоров: Учеб. пособие. Мн.: Белгосуниверситет, 1996. 284 с. 14. Кузюрин Н.Н., Фрумкин М.А. Параллельные вычисления: теория и алго- ритмы // Программирование. 1991. N 2. С. 3–19. 15. Bacon D.F., Grahem S.L., Sharp O.J. Compiler transformations for high per- formance computing // ASM Computing Surveys. 1994. V. 26. № 4. 16. Корнеев В.В.Параллельные вычислительные системы. М.: “Нолидж”, 1999. 320 с. 17. Буза М.К. Введение в архитектуру компьютеров: Учеб. пособие. Мн.: БГУ, 2000. 253 с. 18. Андреев А.Н. Что такое OpenMP? ( http://parallel.ru/tech/tech_dev/openmp.html ). 19. User’s Guide for MPE (unix.mcs.anl.gov/mpi/mpich/docs/mpeguide). 20. MPI: A Message – Passing Interface Standart. June 12, 1995 (http://www.mcs.anl.gov/mpi ). 21. Ортега Д., Пул У. Введение в численные методы решения дифференциаль- ных уравнений. М., 1986. 22. Математические основы криптологии: Учеб. пособие / Харин Ю.С., Бер- ник В.И., Матвеев Г.В. Мн.: БГУ, 1999. 319 с. 23. Молдовян А.А., Молдовян Н.А., Советов Б.Я. Криптография. СПб.:Из–во “Лань”, 2001. 224с. 320 24. Мулярчик С.Г. Численные методы: Конспект лекций. Мн., БГУ, 2001. 127с. 25. Самарский А.А., Гулис А.В. Численные методы. М., 1989. 26. Параллельный отладчик TotalView (http://www.etnus.com). 27. Производительность кластеров: http://parallel.ru/cluster/performance.html. 28. Библиотеки BLAS, LAPACK, BLACS, ScaLAPACK: (http://www.netlib.org). 29. Дацюк В.Н., Букатов А.А., Жегуло А.И. Многопроцессорные системы и параллельное программирование. Метод. пособие, части 1,2,3 (http://rsusu1.rnd.runnet.ru/ncube/koi8/method/m1/context.html ). 30. PETSc: http://www-fp.mcs.anl.gov/petsc/index.html. 321 ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ Абстрактный прибор 28 Атрибут 48 Баръерная синхронизация 109 Блокирующие обмены 46 Буфер 22 Буферизация 62 Версии MPI 7, 45 Визуализация статистики 42 Главный , подчиненный процесс 25,173 Графическая библиотека 36 Группа процессов 21, 145, 147 Декартова топология 161 Запуск процессов 33 Интеркоммуникатор 143 Интерфейс профилирования 241 Интракоммуникатор 144 Карта типа данных 84 Класс ошибок 228 Классы параллельных ЭВМ 9 Классы процессов 26 Кластеры 14 Код ошибок 225 Коллективный обмен 21, 108 Коммуникатор 22, 25, 150, 152 Коммуникационные сети 15 Контекст 22. 144 Криптоанализ 201 Критическая секция 17 Логфайлов анализ 40 Логфайлы 36 Логфайлов формат 37 Массово-параллельные ЭВМ 14 Масштабируемость 11, 14 Матричные задачи 173 Минимальный интерфейс 24 Множественные завершения 71 Неблокирующие обмены 63, 69 Несмежные данные 84 Нить 16 Новая группа 149 Номер процесса 21, 25 Обработчик ошибок 36 • Встроенные 225 • Создавемые пользователем 225 Отладчики 229 Параллельные библиотеки 225 Парные обмены 22, 45 Переносимость 28 Посылка 22 • Блокирующая 46 • Неблокирующая 63 Прием 22 • блокирующий 48 • неблокирующий 63 Протоколы обмена 30 Процесс 15, 23 Распараллеливание цикла 18 Рассылка данных 109, 121 Реализации MPICH 28 Режимы обмена 54 Решение ДУЧП 187 Решение СЛАУ 213 Самопланирование 173 Сбор данных 110 Семафор 17 Сетевой закон Амдала 12 Сигнатура типа данных 84 Событие 38 Совмещение обмена и счета 63 Состояния 38 322 Статус 50 Теневые точки 189 Тип данных 22, 47, 51 • Производный 85, 86 • Маркеры границ 89 Топология 158, 160 Тэг 22 Умножение матриц 173,179 Умножение матрицы на вектор 173 Упакованные данные 96 Ускорение 12 ЭВМ с индивидуальной памятью 10, 21 ЭВМ с разделяемой памятью 10, 14, 18 Экстент 88 Эффективности вычислений 236 323 УКАЗАТЕЛЬ ФУНКЦИЙ MPI_ADDRESS 88 MPI_ALLGATHER 124 MPI_ALLGATHERV 125 MPI_ALLREDUCE 133 MPI_ALLTOALL 126 MPI_ALLTOALLV 127 MPI_BARRIER 109 MPI_BCAST 110 MPI_BSEND 56 MPI_BUFFER_ATTACH 62 MPI_BUFFER_DETACH 62 MPI_CANCEL 80 MPI_CART_COORDS 166 MPI_CART_CREATE 160 MPI_CART_GET 165 MPI_CART_RANK 165 MPI_CART_SHIFT 168 MPI_CART_SUB 169 MPI_CARTDIM_GET 165 MPI_COMM_COMPARE 151 MPI_COMM_CREATE 152 MPI_COMM_DUP 152 MPI_COMM_FREE 153 MPI_COMM_GROUP 147 MPI_COMM_RANK 151 MPI_COMM_SIZE 150 MPI_COMM_SPLIT 152 MPI_DIMS_CREATE 161 MPI_ERRHANDLER_CREATE 226 MPI_ERRHANDLER_FREE 227 MPI_ERRHANDLER_GET 227 MPI_ERRHANDLER_SET 227 MPI_ERROR_CLASS 228 MPI_ERROR_STRING 228 MPI_GATHER 111 MPI_GATHERV 112 MPI_GET_COUNT 50 MPI_GET_ELEMENTS 92 MPI_GRAPH_CREATE 163 MPI_GRAPH_GET 164 MPI_GRAPH_NEIGHBORS 166 MPI_GRAPH_NEIGHBORS_COUNT 166 MPI_GRAPHDIMS_GET 164 MPI_GROUP_COMPARE 146 MPI_GROUP_DIFFERENCE 148 MPI_GROUP_EXCL 149 MPI_GROUP_FREE 150 MPI_GROUP_INCL 149 MPI_GROUP_INTERSECTION 148 MPI_GROUP_RANK 145 MPI_GROUP_SIZE 145 MPI_GROUP_TRANSLATE_RANKS146 MPI_GROUP_UNION 147 MPI_IBSEND 65 MPI_IPROBE 78 MPI_IRECV 66 MPI_IRSEND 66 MPI_ISEND 65 MPI_ISSEND 66 MPI_PACK 97 MPI_PACK_SIZE 99 MPI_PCONTROL 142 MPI_PROBE 78 MPI_RECV 48 MPI_REDUCE 128 MPI_REDUCE_SCATTER 135 324 MPI_RSEND 57 MPI_SCAN 135 MPI_SCATTER 120 MPI_SCATTERV 121 MPI_SEND 46 MPI_SENDRECV 82 MPI_SENDRECV_REPLACE 83 MPI_SSEND 57 MPI_TEST 68 MPI_TEST_CANCELLED 81 MPI_TESTALL 74 MPI_TESTANY 72 MPI_TESTSOME 76 MPI_TOPO_TEST 163 MPI_TYPE_COMMIT 90 MPI_TYPE_CONTIGUOUS 85 MPI_TYPE_EXTENT 88 MPI_TYPE_FREE 90 MPI_TYPE_HINDEXED 87 MPI_TYPE_HVECTOR 86 MPI_TYPE_INDEXED 86 MPI_TYPE_LB 89 MPI_TYPE_SIZE 89 MPI_TYPE_STRUCT 87 MPI_TYPE_UB 90 MPI_TYPE_VECTOR 85 MPI_UNPACK 98 MPI_WAIT 68 MPI_WAITALL 73 MPI_WAITANY 71 MPI_WAITSOME 75 |