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

  • PTXXYYY

  • Инициализировать сетку процессоров

  • NP = NUMROC (M, MB, MYROW, RSRC, NPROW) NQ = NUMROC (N, NB, MYCOL, CSRC, NPCOL), здесь NP

  • MYROW , MYCOL –координаты процессора в сетке процессоров; IRSRC , ICSRC

  • NPROW , NPCOL

  • CALL PDGESV(N, NRHS, A, IA, JA, DESCA, IPIV, B, IB, JB, DESCB, INFO), где N

  • Освободить сетку процессоров.

  • BLACS_EXIT (0). Следующий пример демонстрирует возможности пакета (заимст- вован из [29]) ScaLAPACK. Используется подпрограмма PDGEMM

  • PetscInitialize(int *argc, char ***argv, char *file, char *help);

  • PetscInitialize автоматически вызывает MPI_Init

  • MPI_Init

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


    Скачать 1.61 Mb.
    НазваниеОрганизация вычислений в многопроцессорных системах
    АнкорПрограммирование для многопроцессорных систем в стандарте MPI - Шпаковский Г.И., Серикова Н.В..pdf
    Дата15.03.2018
    Размер1.61 Mb.
    Формат файлаpdf
    Имя файлаПрограммирование для многопроцессорных систем в стандарте MPI - .pdf
    ТипКонтрольные вопросы
    #16702
    КатегорияИнформатика. Вычислительная техника
    страница20 из 26
    1   ...   16   17   18   19   20   21   22   23   ...   26
    13.1. БИБЛИОТЕКА SCALAPACK
    Основой для построения ScaLAPACK послужили следующие биб- лиотеки, которые в большинстве своем используются на нижних уровнях иерархии организации ScaLAPACK [28].
    BLAS
    (Basic Linear Algebra Subprograms) – библиотека высокока- чественных процедур, “строительными блоками” для которых явля- ются вектора, матрицы или их части. Уровень 1 BLAS используется для выполнения операций вектор-вектор, уровень 2 BLAS – для вы- полнения матрично-векторных операций, наконец, уровень 3 BLAS – для выполнения матрично-матричных операций. Поскольку програм- мы BLAS являются эффективными, переносимыми и легко доступны- ми, они используются как базовые компоненты для развития высоко- качественного программного обеспечения для задач линейной алгеб- ры. Так были созданы широко известные пакеты LINPACK, EISPACK, которые затем были перекрыты пакетом LAPACK, получившим большое распространение.
    LAPACK
    – набор реализаций “продвинутых” методов линейной алгебры. LAPACK содержит процедуры для решения систем линей-

    246
    ных уравнений, задач нахождения собственных значений и фактори- зации матриц. Обрабатываются заполненные и ленточные матрицы, но не разреженные матрицы общего вида. Во всех случаях можно об- рабатывать действительные и комплексные матрицы с одиночной и удвоенной точностью. Процедуры LAPACK построены таким обра- зом, чтобы как можно больше вычислений выполнялось с помощью обращений к BLAS с использованием всех его трех уровней. Вследст- вие крупнозернистости операций уровня 3 BLAS, их использование обеспечивает высокую эффективность на многих высокопроизводи- тельных компьютерах, в частности, если производителем создана спе- циализированная реализация. ScaLAPACK является успешным ре- зультатом переноса пакета LAPACK на системы с передачей сообще- ний. Но в таких системах необходимы процедуры, обеспечивающие обмен данными между взаимодействующими процессами. Для этого в
    ScaLAPACK используется библиотека BLACS.
    BLACS
    (Basic Linear Algebra Communication Subprograms) – набор базовых коммуникационных процедур линейной алгебры, созданных для линейной алгебры. Вычислительная модель состоит из одномер- ной или двумерной решетки процессов, где каждый процесс содержит часть матрицы или вектора. BLACS включает синхронизируемые send/receive процедуры для передачи матриц или подматриц от одного процесса другому, для передачи подматриц многим процессам, или для вычисления глобальной редукции (sum, max или min). Имеются процедуры для создания, изменения или опроса решетки процессов.
    Поскольку несколько ScaLAPACK алгоритмов требуют операций broadcasts или reductions среди различных подмножеств процессов,
    BLACS позволяет процессу быть членом нескольких перекрываю- щиxся или изолированных решеток процессов, каждая из которых связана с контекстом. BLACS используется как коммуникационный слой проекта ScaLAPACK, который переносит библиотеку LAPACK на машины с распределенной памятью. Пример операции посылки данных в BLACS, которая аналогична операции SEND в MPI:
    vTRSD2D( ICONTXT, UPLO, DIAG, M, N, A, LDA, RDEST, CDEST),
    где ICONTXT – целочисленный дескриптор, указывающий на кон- текст, M – количество обрабатываемых строк матрицы, N – число об- рабатываемых столбцов матрицы, A – указатель на начало посылае- мого (под)массива, LDA – расстояние между двумя элементами в строке матрицы, UPLO указывает, является треугольная матрица

    247
    верхней или нижней, DIAG указывает, является ли диагональ матри- цы unit diagonal, RDEST – координаты строки принимающего процес- са, CDEST – координаты столбца принимающего процесса.
    Подпрограммы библиотеки ScaLAPACK разделяются на три кате- гории:
    драйверные
    подпрограммы, каждая из которых решает некото- рую законченную задачу, например решение системы линейных ал- гебраических уравнений;
    вычислительные
    подпрограммы выполняют отдельные подзадачи, например LU разложение матрицы;
    служебные
    подпрограммы выполняют некоторые внутренние вспомогательные действия.
    Имена всех драйверных и вычислительных подпрограмм совпада- ют с именами соответствующих подпрограмм из пакета LAPACK, с той лишь разницей, что в начале имени добавляется символ P, указы- вающий на то, что это параллельная версия. Соответственно, принцип формирования имен подпрограмм имеет ту же самую схему, что и в
    LAPACK. В соответствие с этой схемой имена подпрограмм пакета имеют вид PTXXYYY, где Т – код типа исходных данных; XX – вид матрицы: ленточные, общего вида, трехдиагональные и т.д.; YYY – выполняемые действия данной подпрограммой: факторизация; реше- ние СЛАУ, вычисление сингулярных значений и др.
    Библиотека ScaLAPACK требует, чтобы все объекты (векторы и матрицы), являющиеся параметрами подпрограмм, были предварительно распределены по процессорам. Исходные объекты классифицируются как глобальные объекты, и параметры, описывающие их, хранятся в специальном описателе объекта – дескрипторе.
    Дескриптор некоторого распределенного по процессорам глобального объекта представляет собой массив целого типа, в котором хранится вся необходимая информация об исходном объекте. Части этого объекта, находящиеся в каком-либо процессоре, и их параметры являются локальными данными. Для того, чтобы воспользоваться драйверной или вычислительной подпрограммой из библиотеки ScaLAPACK, необходимо выполнить 4 шага:
    1. Инициализировать сетку процессоров. Инициализация сетки процессоров выполняется с помощью подпрограмм из библиотеки
    BLACS. Вызов CALL BLACS_PINFO (IAM, NPROCS) инициа- лизирует библиотеку BLACS, устанавливает некоторый стандарт- ный контекст для ансамбля процессоров (аналог коммуникатора в
    MPI), сообщает процессору его номер в ансамбле (IAM) и количе- ство доступных задаче процессоров (NPROCS).

    248 2. Распределить матрицы на сетку процессоров. Точное значение того, сколько строк и столбцов должно находится в каждом про- цессоре, позволяет вычислить подпрограмма-функция из вспомо- гательной библиотеки:
    MYROW,_RSRC,_NPROW)__NQ_=_NUMROC_(N,_NB,_MYCOL,_CSRC,_NPCOL),_здесь_NP'> NP = NUMROC (M, MB, MYROW, RSRC, NPROW)
    NQ = NUMROC (N, NB, MYCOL, CSRC, NPCOL),
    здесь NP – число строк локальной подматрицы в процессоре; NQ – число столбцов локальной подматрицы в процессоре. Входные па- раметры: M, N число строк и столбцов исходной матрицы; MB,
    NB
    размеры блоков по строкам и по столбцам; MYROW,
    MYCOL
    –координаты процессора в сетке процессоров; IRSRC,
    ICSRC
    – координаты процессора, начиная с которого выполнено распределение матрицы (подразумевается возможность распреде- ления не по всем процессорам); NPROW, NPCOL – число строк и столбцов в сетке процессоров.
    3. Вызвать вычислительную подпрограмму. Вызов подпрограммы вычислений рассмотрим на примере решения систем линейных ал- гебраических уравнений с матрицами общего вида. Имя подпро- граммы PDGESV указывает, что: тип матриц – double precision
    (второй символ D); матрица общего вида, т. е. не имеет ни сим- метрии, ни других специальных свойств (3-й и 4-й символы GE); подпрограмма выполняет решение системы линейных алгебраиче- ских уравнений
    A * X = B
    (последние символы SV). Обращение к подпрограмме и ее параметры имеют вид:
    CALL PDGESV(N, NRHS, A, IA, JA, DESCA, IPIV, B,
    IB, JB, DESCB, INFO),
    где N – размерность исходной матрицы A (полной); NRHS – коли- чество правых частей в системе (сколько столбцов в матрице B);
    А
    – на входе локальная часть распределенной матрицы A, на вы- ходе локальная часть
    LU
    разложения; IA, JA – индексы левого верхнего элемента подматрицы матрицы А, для которой находится решение (т. е. подразумевается возможность решать систему не для полной матрицы, а для ее части); DESCA – дескриптор матри- цы А (подробно рассмотрен выше); IPIV – рабочий массив целого типа, который на выходе содержит информацию о перестановках в процессе факторизации, длина массива должна быть не меньше количества строк в локальной подматрице; B – на входе локальная часть распределенной матрицы B, на выходе локальная часть по-

    249
    лученного решения (если решение найдено); IB, JB – то же самое, что IA, JA для матрицы А; DESCB –дескриптор матрицы B;
    INFO
    – целая переменная, которая на выходе содержит информа- цию о том, успешно или нет завершилась подпрограмма, и причи- ну аварийного завершения.
    4. Освободить сетку процессоров. Программы, использующие па- кет ScaLAPACK, должны заканчиваться закрытием всех BLACS процессов, то есть освобождением сетки процессоров. Это осуще- ствляется с помощью вызова подпрограммы BLACS_EXIT (0).
    Следующий пример демонстрирует возможности пакета (заимст- вован из [29]) ScaLAPACK. Используется подпрограмма PDGEMM из
    PBLAS (комбинация библиотек BLAS и BLACS), которая выполняет матричную операцию
    C
    =
    aA*B + bC
    , где
    A, В
    и
    С
    – матрицы,
    a
    и
    b
    – константы. В нашем случае полагаем
    a
    = 1,
    b
    = 0. program abcsl include 'mpif.h'
    ! параметр nm определяет максимальную размерность блока матрицы
    ! на одном процессоре, массивы описаны как одномерные parameter (nm = 1000, nxn = nm*nm) double precision a(nxn), b(nxn), c(nxn), mem(nm) double precision time(6), ops, total, t1
    ! параметр NOUT – номер выходного устройства (терминал)
    PARAMETER ( NOUT = 6 )
    DOUBLE PRECISION ONE
    PARAMETER ( ONE = 1.0D+0 )
    INTEGER DESCA(9), DESCB(9), DESCC(9)
    ! Инициализация BLACS
    CALL BLACS_PINFO( IAM, NPROCS )
    ! вычисление формата сетки процессоров, наиболее близкого к квадратному
    NPROW = INT(SQRT(REAL(NPROCS)))
    NPCOL = NPROCS/NPROW
    ! считывание параметров решаемой задачи 0-м процессором и печать этой
    ! информации ( N – размер матриц и NB – размер блоков )
    IF( IAM.EQ.0 ) THEN
    WRITE(*,* ) ' Input N and NB: '
    READ( *, * ) N, NB
    WRITE( NOUT, FMT = * )
    WRITE( NOUT, FMT = 9999 ) 'The following parameter values will be used:'
    WRITE( NOUT, FMT = 9998 ) 'N ', N
    WRITE( NOUT, FMT = 9998 ) 'NB ', NB
    WRITE( NOUT, FMT = 9998 ) 'P ', NPROW
    WRITE( NOUT, FMT = 9998 ) 'Q ', NPCOL

    250
    WRITE( NOUT, FMT = * )
    END IF
    ! Рассылка считанной информации всем процессорам call MPI_BCAST(N, 1, MPI_INTEGER, 0, MPI_COMM_WORLD, ierr) call MPI_BCAST(NB,1, MPI_INTEGER, 0, MPI_COMM_WORLD, ierr)
    ! теоретическое количество операций при умножении двух квадратных матриц ops = (2.0d0*dfloat(n)-1)*dfloat(n)*dfloat(n)
    ! инициализация сетки процессоров
    CALL BLACS_GET( -1, 0, ICTXT )
    CALL BLACS_GRIDINIT( ICTXT, 'Row-major', NPROW, NPCOL )
    CALL BLACS_GRIDINFO( ICTXT, NPROW, NPCOL, MYROW, MYCOL )
    ! если процессор не вошел в сетку, то он ничего не делает;
    ! такое может случиться, если заказано, например, 5 процессоров
    IF( MYROW.GE.NPROW .OR. MYCOL.GE.NPCOL ) GO TO 500
    ! вычисление реальных размеров матриц на процессоре
    NP = NUMROC( N, NB, MYROW, 0, NPROW )
    NQ = NUMROC( N, NB, MYCOL, 0, NPCOL )
    ! инициализация дескрипторов для 3-х матриц
    CALL DESCINIT( DESCA, N, N, NB, NB, 0, 0, ICTXT, MAX(1,NP ), INFO )
    CALL DESCINIT( DESCB, N, N, NB, NB, 0, 0, ICTXT, MAX(1,NP ), INFO )
    CALL DESCINIT( DESCC, N, N, NB, NB, 0, 0, ICTXT, MAX(1,NP ), INFO ) lda = DESCA(9)
    ! вызов процедуры генерации матриц А и В call pmatgen(a, DESCA, np, nq, b, DESCB, nprow, npcol, myrow, mycol) t1 = MPI_Wtime()
    ! вызов процедуры перемножения матриц
    CALL PDGEMM('N','N', N, N, N, ONE, A, 1, 1, DESCA,
    B, 1, 1, DESCB, 0. 0, C, 1, 1, DESCC) time(2) = MPI_Wtime() – t1
    ! печать угловых элементов матрицы C с помощью служебной подпрограммы if (IAM.EQ.0) write(*,*) 'Matrix C...'
    CALL PDLAPRNT( 1, 1, C, 1, 1, DESCC, 0, 0, 'C', 6, MEM )
    CALL PDLAPRNT( 1, 1, C, 1, N, DESCC, 0, 0, 'C', 6, MEM )
    CALL PDLAPRNT( 1, 1, C, N, 1, DESCC, 0, 0, 'C', 6, MEM )
    CALL PDLAPRNT( 1, 1, C, N, N, DESCC, 0, 0, 'C', 6, MEM )
    ! вычисление времени, затраченного на перемножение,
    ! и оценка производительности в Mflops. total = time(2) time(4) = ops/(1.0d6*total) if (IAM.EQ.0) then write(6,80) lda
    80 format(' times for array with leading dimension of',i4) write(6,110) time(2), time(4)
    110 format(2x,'Time calculation: ',f12.4, ' sec.', ' Mflops = ',f12.4) end if
    ! Закрытие BLACS процессов

    251
    CALL BLACS_GRIDEXIT( ICTXT )
    CALL BLACS_EXIT(0)
    9998 FORMAT( 2X, A5, ' : ', I6 )
    9999 FORMAT( 2X, 60A )
    500 continue stop end subroutine pmatgen(a,DESCA,np,nq,b,DESCB,nprow,npcol,myrow,mycol) integer n, i, j, DESCA(*), DESCB(*), nprow, npcol, myrow, mycol double precision a(*), b(*) nb = DESCA(5)
    ! Заполнение локальных частей матриц A и B,
    ! матрица A формируется по алгоритму A(I,J) = I, a
    ! матрица B(I,J) = 1./J здесь имеются в виду глобальные индексы. k = 0 do 250 j = 1,nq jc = (j-1)/nb jb = mod(j-1,nb) jn = mycol*nb + jc*npcol*nb + jb + 1 do 240 i = 1,np ic = (i-1)/nb ib = mod(i-1,nb) in = myrow*nb + ic*nprow*nb + ib + 1 k = k + 1 a(k) = dfloat(in) b(k) = 1.D+0/dfloat(jn)
    240 continue
    250 continue return end
    13.2. БИБЛИОТЕКА PETSC
    Библиотека PETSc [30] облегчает разработку крупномасштабных приложений на языках Fortran, C и C++, является мощным средством для численного решения дифференциальных уравнений в частных производных (ДУЧП) и связанных с этим проблем на быстродейст- вующих компьютерах. PETSc использует MPI стандарт для взаимо- действия процессов. Библиотека PETSc включает различные компо- ненты (подобно классам в С++), каждый компонент имеет дело с ча- стным семейством объектов (например, векторами) и операциями, которые нужно выполнять над этими объектами. Объекты и операции в PETSc определены на основе долгого опыта научных вычислений.
    Некоторые основные объекты PETSc представлены на рис. 13.1.

    252
    Рис. 13.1. Организация библиотеки PETSc
    Библиотеки BLAS, LAPACK и MPI уже были описаны ранее. Со- став векторных и матричных операций будет представлен несколько позже. Индексные ряды (Index Sets) являются обобщением рядов це- лочисленных индексов, которые используются для определения эле- ментов векторов и матриц при выполнении операций рассылки и сборки. Частным случаем такого ряда является обычный список коор- динат необходимых элементов.
    На основе нижеуказанных программ строятся программы более высокого уровня абстракции, которые в свою очередь являются базой следующего уровня программ: программ – решателей.
    Для подпространств Крылова (KSP) программно реализованы ме- тоды сопряженных градиентов, обобщенных сопряженных градиен- тов, би-сопряженных градиентов, методы Чебышева, Ричардсона и другие. Программы предобуславливателей (PC) используют методы полной и неполной LU-факторизации, методы Якоби, аддитивный метод Шварца и другие. PETSc содержит небольшой набор средств для рисования простых фигур (Draw). Этот набор не может конкури- ровать с более совершенными системами графики, но его наличие в
    PETSc повышает удобство использования последнего.
    SLES
    (Linear Equotion Solvers)
    Matrices
    Vectors
    Index Sets
    Прикладные коды
    PDE Solvers
    SNES
    (Nonlinear Equotion Solvers)
    RSP
    (Krolov Subspase Method)
    BLAS
    LAPACK
    MPI
    TS
    (Time Stepping)
    PC
    (Preconditionrs)
    Draw

    253
    Программы SLES являются сердцем PETSc, поскольку обеспечи- вают единообразный и эффективный доступ ко всем пакетам решения линейных систем, включая параллельные и последовательные, пря- мые и итерационные. Программы SNES предназначены для решения нелинейных систем и используют верхние уровни SLES.
    Все перечисленные ранее уровни используются для решения сис- тем ДУЧП (PDE Solvers). Компонент TS (Time Stepping) обеспечива- ет решение дифференциальных уравнений, возникающих при дискре- тизации времязависимых PDEs.
    Более полную информацию о возможностях можно получить в
    “PETSc Users Manual” [30].
    Поскольку PETSc использует MPIдля всех межпроцессорных об- менов, пользователь свободен в использовании процедур MPI в своем приложении. Однако пользователь изолирован от многих деталей пе- редачи сообщений внутри PETSc, поскольку они невидимы внутри параллельных объектов, таких как вектора, матрицы и методы реше- ния систем. Кроме того, PETSc обеспечивает средства, такие как обобщенные векторные scatters/gathers и распределенные массивы, чтобы помочь в управлении параллельными данными.
    Большинство программ PETSc начинаются обращением:
    MPI_Init'>PetscInitialize(int_*argc,_char_***argv,_char_*file,_char_*help);'>PetscInitialize(int *argc, char ***argv, char *file, char *help);
    которое инициализирует PETSc и MPI. Аргументы argc и argv являют- ся аргументами командной строки и поставляются во всех C и C++ программах. Файл аргументов в качестве опции указывает на альтер- нативное имя файла опций, который размещается по умолчанию в пользовательском директории. Конечный аргумент help есть знаковая строка, которая будет печататься, если программа выполняется с оп- цией –help.
    PetscInitialize
    автоматически вызывает MPI_Init, если он не был инициализирован ранее. В определенных обстоятельствах, когда нуж- но инициализировать MPI (или инициализация производится некото- рой другой библиотекой) необходимо сначала вызвать MPI_Init, за- тем выполнить обращение к PetscInitialize. По умолчанию
    PetscInitialize
    добавляет к MPI_COMM_WORLD коммуникатор с фиксированным именем PETSC_COMM_WORLD.
    В большинстве случаев пользователь может использовать комму- никатор PETSC_COMM_WORLD, чтобы указать все процессы в данном приложении, а PETSC_COMM_SELF указывает одиночный процесс.

    254
    Пользователи, которые хотят использовать процедуры PETSc только для подмножества процессоров внутри большой работы, или если необходимо использовать главный процесс для координации ра- боты подчиненных PETScпроцессов, должны описать альтернатив- ный коммуникатор для
    1   ...   16   17   18   19   20   21   22   23   ...   26


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