Подпрограмма:  CAL_POSVN

Назначение

Организация вызова целевой подпрограммы Комплекса для решения систем линейных алгебраических уравнений с симметричными или эрмитовыми положительно определенными матрицами и вычисление времени, затраченного на решение задачи

Описание

Эта служебная подпрограмма организует за пользователя правильный вызов целевой подпрограммы решения систем линейных алгебраических уравнений с симметричными или эрмитовыми положительно определенными матрицами и вычисляет время решения задачи на заданном числе параллельных процессов (NPROCS) с матрицей заданного порядка (N) и при заданных параметрах распараллеливания (NPROW, NPCOL, NB ).
Сначала она либо считывает из внешних файлов, заданные пользователем исходную матрицу системы и вектор (матрицу) правой части, либо строит некую "стандартную" матрицу и вектор порядка N; распределяет их части(блоки) по параллельным процессам в соответствии с используемыми алгоритмами и формирует правильный список фактических параметров для выбранной пользователем целевой подпрограммы.
После этого осуществляет вызов и счет по этой подпрограмме, вычисляя при этом время, прошедшее с момента обращения к подпрограмме до момента выхода из неё. Полученный вектор решения задачи записывается во внешний файл.

Литература:

http://software.intel.com/en-us/articles/intel-math-kernel-library-documentation/
http://www.netlib.org/scalapack/slug/index.html
http://num_anal.srcc.msu.ru/par_prog/

Использование

         CALL  CAL_POSVN( NAME, UPLO, N, NPROW, NPCOL, AMEM, MEMSIZE,
                                             NB, INFILEA, INFILEB, OUTFILE, TFILE, NPRT, CTXT )
                             

Параметры

NAME - имя целевой подпрограммы, при применении которой для решения задачи вычисляется время, затраченное на ее решение (одно из PDPOSV, PDPOSV1, PDPOSV2); (входной параметр, тип символьный);
UPLO - переменная символьного типа, означающая, сохраняется нижняя или верхняя треугольная матрица и принимающая значения 'U'(верхняя) или 'L'(нижняя) (входной параметр);
N - порядок исходной матрицы системы, при котором вычисляется время, затраченное на решение задачи (входной параметр, тип целый);
NPROW - число строк в решетке процессов, для которой измеряется время на решение задачи (входной параметр, тип целый);
NPCOL - число столбцов в решетке процессов, для которой измеряется время на решение задачи (входной параметр, тип целый);
AMEM - массив локальной рабочей памяти, в которую распределяются локальные части исходных матриц и векторов системы, хранятся элементы рабочих массивов, где формируются локальные части вектора решений системы; (входной параметр, тип DOUBLE PRECISION);
MEMSIZE - задаваемый размер массива AMEM, который должен быть больше или равен значению параметра MMIN, выданному пользователю соответствующей подпрограммой вычисления параметров PAR_POSV при задании ей набора параметров распараллеливания, при которых измеряется время, затраченное на решение задачи (см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый);
NB - размер блока матрицы, при котором измеряется время на решение задачи (входной параметр, тип целый);
INFILEA - имя файла, содержащего исходную матрицу системы (A), либо "  "(пробел); в последнем случае будет использована некая "стандартная" матрица заданного порядка (входной параметр, тип символьный);
INFILEB - имя файла, содержащего исходный вектор правой части системы (B), либо "  "(пробел); в последнем случае будет использован некий "стандартный" вектор заданного порядка (входной параметр, тип символьный);
OUTFILE - имя файла, в который в результате работы подпрограммы будет записан результирующий вектор (X) (входной параметр, тип символьный);
TFILE - имя файла, в который записывается время, затраченное на решение задачи при заданном наборе параметров распараллеливания;
при обращении к подпрограмме CAL_POSVN в цикле с разными наборами параметров распараллеливания в данный файл будут записаны все результаты таймирования, полученные при всех вычислительных экспериментах, выполненных в данном запуске подпрограммы BSTPAR9, инициирующей групповой запуск нескольких вычислительных экспериментов (т.е. нескольких вызовов подпрограммы CAL_POSVN с разными наборами параметров) (входной параметр, тип символьный);
NPRT - режим выдачи результатов вычислительного эксперимента:
= 0 - на печать не выдается ничего, кроме минимального времени счета полученного в данном эксперименте и значений параметров распараллеливания, при которых получено это минимальное время;
= 1 - на печать выдаются все результаты таймирования ( при всех испытанных в данном групповом запуске наборах параметров распараллеливания );
= 2 - на печать выдается все то же самое, что и при NPRT = 1, а также результаты решения самой задачи целевой программой Комплекса для заданной матрицы;
= 3 - на печать выдается все то же самое, что и при NPRT = 2, а также все входные параметры и матрицы
(входной параметр, тип целый);
CTXT - значение параметра контекста, соответствующего выбранной решетке процессов (входной параметр, тип целый)

Вызываемые подпрограммы

Здесь указаны только целевые (1 - ого уровня) и базовые подпрограммы (2 - ого уровня), которые вызываются из целевых подпрограмм.

PDPOSV - PDPOSV1   
PDPOSV2   
    
решение системы с симметричной (эрмитовой) положительно определенной матрицей методом Холецкого или
решение системы с симметричной (эрмитовой) положительно определенной матрицей методом Холецкого и оценка обратного числа обусловленности, или
решение системы с симметричной (эрмитовой) положительно определенной матрицей методом Холецкого и с итерационным уточнением решения и оценкой границ ошибок соответственно
PDPOTRF - PZPOTRF    Треугольное разложение симметричной (эрмитовой) положительно определенной матрицы методом Холецкого
PDPOTRS - PZPOTRS    Решение системы с симметричной (эрмитовой) положительно определенной матрицей с использованием разложения Холецкого, полученного подпрограммой PDPOTRF(PZPOTRF) Выполнение итерационного уточнения решения системы A X = B, AT X = B или AH X = B, полученного подпрограммой PDGETRS (PZGETRS), и оценка границ ошибок полученного решения
MINTPOSV - Построение некоторой "стандартной" матрицы системы и вектора правой части заданного порядка N и распределение их частей(блоков) по параллельным процессам ( в том случае, если не были заданы файлы с исходными матрицей и вектором )

Замечания по использованию

  1.  Используются подпрограммы BLACS_EXIT, BLACS_GET, BLACS_GRIDEXIT, BLACS_GRIDINFO BLACS_GRIDINIT, BLACS_PINFO, BLACS_SETUP ( из пакета BLACS в составе MKL-библиотеки), DESCINIT, ICEIL, NUMROC, PDLAPRNT ( из пакета ScaLAPACK(TOOLS) в составе MKL-библиотеки), PDLAREAD, PDLAWRITE, MPI_Wtime()
  2.  Время, затраченное на решение задачи, присваивается переменной  time,  описанной в общем блоке

Пример использования

Требуется вычислить время, необходимое для решения системы уравнений с помощью подпрограммы PDPOSV.
Матрица системы - порядка 7000. Для решения задачи предполагается использовать 8 процессоров, образующих решетку 1 * 8.
Матрица делится на блоки 56 * 56 (т.е. NB = 56 )
При предварительном обращении к подпрограмме PAR_POSV с указанными выше параметрами был вычислен максимальный размер локальной памяти, необходимой для решения задачи MMIN = 6333237. Для вычисления используется "стандартная" матрица, построение и распределение которой по процессам выполняется служебной подпрораммой  MINTPOSV.

Фрагмент фортранного текста вызывающей программы
(полный текст теста можно получить в tcl_posvn.zip)

      PROGRAM  TCL_POSVN

      include 'mpif.h'
      INTEGER                 CTXT, N, NPROW, NPCOL, NB, NPRT, MEMSIZE
      PARAMETER          ( N=7000, NB=56, MEMSIZE=6333300, NPRT= 1 )
*
      DOUBLE PRECISION   AMEM( MEMSIZE )
      CHARACTER*(*)           NAME, UPLO
      CHARACTER          INFILEA*(*), INFILEB*(*), OUTFILE*(*), TFILE*(*)
      PARAMETER         ( INFILEA = '  ', INFILEB = '  ',
     $                                OUTFILE = 'BSTPARRES',
     $                                TFILE = 'BSTRES')
*
      PARAMETER         ( UPLO = 'U',
     $                                NAME = 'PDPOSV')
      COMMON   time, J
      EXTERNAL  CAL_POSVN, BLACS_GET, BLACS_GRIDINIT, BLACS_GRIDINFO
*
      NPROW = 1
      NPCOL = 8
*
      J = 1
*
      CALL BLACS_GET( -1, 0, CTXT )
*
      CALL BLACS_GRIDINIT( CTXT, 'R', NPROW, NPCOL )
      CALL BLACS_GRIDINFO( CTXT, NPROW, NPCOL, MYROW, MYCOL )
*
      CALL CAL_POSVN(NAME, UPLO, N, NPROW, NPCOL, AMEM, MEMSIZE,
     $                                   NB, INFILEA, INFILEB, OUTFILE, TFILE, NPRT, CTXT )

*
      STOP
      END

Результаты:

   Время решения задачи   time  =  0.420D+01

 Решение системы (в файле OUTFILE)

 X = ( 1.D0,  2.D0, 3.D0, .  .  .  .  .  .  .  .  .  6999.D0, 7000.D0 )


 Добавим, что минимальное время получено для решетки (  4,  2 ) и  NB =  120   time =  0.258D+01