Главная страница
Навигация по странице:

  • ИСТОЧНИКИ И НФОРМАЦИИ

  • ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ

  • УКАЗАТЕЛЬ ФУНКЦИЙ

  • Программирование для многопроцессорных систем в стандарте MPI - Шпаковский Г.И., Серикова Н.В.. Программирование для многопроцессорных систем в стандарте MPI -. Организация вычислений в многопроцессорных системах


    Скачать 1.61 Mb.
    НазваниеОрганизация вычислений в многопроцессорных системах
    АнкорПрограммирование для многопроцессорных систем в стандарте MPI - Шпаковский Г.И., Серикова Н.В..pdf
    Дата15.03.2018
    Размер1.61 Mb.
    Формат файлаpdf
    Имя файлаПрограммирование для многопроцессорных систем в стандарте MPI - .pdf
    ТипКонтрольные вопросы
    #16702
    КатегорияИнформатика. Вычислительная техника
    страница26 из 26
    1   ...   18   19   20   21   22   23   24   25   26
    Задание 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 { double diff; /* умножаем на 0.25 вместо деления на 4.0 */ xnewrow[j] = (xlocalrow[j+1] + xlocalrow[j-1] + xlocalrow[maxm + j] + xlocalrow[-maxm + j]) * 0.25; diff = xnewrow[j] - xlocalrow[j]; diffnorm += diff * diff;
    } 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 { if (!argv[i]) continue; if (strcmp( argv[i], "-print" ) == 0) *do_print = 1; else if (strcmp( argv[i], "-n" ) == 0)
    { *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 { xlocal[i*maxm+j] = rank; xnew[i*maxm+j] = rank; }
    /* заполнение граничных значений */ for (j=0; j { xlocal[j] = -1; xlocal[(lrow+1)*maxm + j] = rank + 1; xnew[j] = -1; xnew[(lrow+1)*maxm + j] = rank + 1;
    } 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

    1   ...   18   19   20   21   22   23   24   25   26


    написать администратору сайта