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

Назначение

Автоматизация подготовки входных данных и вызова целевых программ комплекса PARALG вычисления сингулярных чисел матриц

Описание

Эта служебная подпрограмма организует за пользователя правильный вызов целевых программ вычисления сингулярных чисел матриц на распределенной памяти. Она считывает из внешнего файла исходную матрицу, распределяет ее части(блоки) по параллельным процессам в соответствии с используемыми алгоритмами и формирует правильный список фактических параметров для выбранной пользователем целевой программы. После чего осуществляет вызов этой программы. Полученный в результате счета массив сингулярных чисел записывается во внешний файл.

Литература:

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_GESVD1(NAME, M, N, NPROW, NPCOL, AMEM, MEMSIZE,
                                               NB, INFILEA, OUTFILE)

Параметры

NAME - имя целевой подпрограммы, с помощью которой пользователь собирается решать свою задачу (одно из PDGESVD1, PDGESVD4); (входной параметр, тип символьный);
M - число строк исходной матрицы (входной параметр, тип целый);
N - число столбцов исходной матрицы (входной параметр, тип целый);
NPROW - число строк в решетке процессов, которое было выдано пользователю соответствущей подпрограммой вычисления параметров PAR_GESVD1(см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый);
NPCOL - число столбцов в решетке процессов, которое было выдано пользователю соответствущей подпрограммой вычисления параметров PAR_GESVD1(см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый);
AMEM - массив локальной рабочей памяти, в которую распределяется локальная часть исходной матрицы, хранятся элементы рабочих массивов, где формируются локальные части массива сингулярных чисел (входной параметр, тип DOUBLE PRECISION);
MEMSIZE - задаваемый размер массива AMEM, который должен быть больше или равен значению параметра MMIN, выданному пользователю соответствующей подпрограммой вычисления параметров PAR_GESVD1 (см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый);
NB - размер блока, матрицы, выданный пользователю соответствующей подпрограммой вычисления параметров PAR_GESVD1 (или фигурировавший в качестве входного значения при вычислении значений других параметров) (см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый);
INFILEA - имя файла, содержащего исходную матрицу (A) (входной параметр, тип символьный);
OUTFILE - имя файла, в который в результате работы подпрограммы будет записан результирующий массив сингулярных чисел (входной параметр, тип символьный).

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

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

PDGESVD1 - PDGESVD4    сингулярное разложение квадратной матрицы с вычислением всех сингулярных чисел;
сингулярное разложение прямоугольной матрицы с вычислением всех сингулярных чисел;
соответственно

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

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

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

Необходимо вычислить сингулярные числа матрицы с помощью программы PDGESVD1.
Пользователь может выделить для решения задачи 4 параллельных процессора. Матрица - квадратная порядка 5.
Пусть матрица А имеет вид:

           |   1   2   3   4   5   |
           |   2   1   3   4   5   |
           |   3   3   1   4   5   |
           |   4   4   4   1   5   |
           |   5   5   5   5   1   |

При предварительном обращении к подпрограмме PAR_GESVD1 были получены следующие значения необходимых параметров.
Решетка процессов: NPROW = 2, NPCOL = 2; NB = 2 (т.е. матрица разбивается на блоки размера 2 на 2), Минимальный размер локальной памяти MMIN = 67.

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

      PROGRAM   TCL_GESVD1
      include 'mpif.h'
      INTEGER                         M, N, NPROW, NPCOL, NB, MEMSIZE
      PARAMETER                  ( M=5, N=5, NB=2, MEMSIZE=67 )
*
      DOUBLE PRECISION   AMEM( MEMSIZE )
      CHARACTER*(*)           NAME
      CHARACTER                 INFILEA*(*), OUTFILE*(*)
      PARAMETER                 ( INFILEA = 'gesvdA_5.dat',
     $                                        OUTFILE = 'gesvd1_5.res')
*
      PARAMETER                 ( NAME = 'PDGESVD1')
      EXTERNAL                    CAL_GESVD1
*
      NPROW = 2
      NPCOL = 2
*
      CALL CAL_GESVD1(NAME, M, N, NPROW, NPCOL, AMEM, MEMSIZE, NB,
     $                                    INFILEA, OUTFILE)
*
      STOP
      END

Содержимое файла с исходной матрицей  'gesvdA_5.dat':

           5           5
     0.10000D+01
     0.20000D+01
     0.30000D+01
     0.40000D+01
     0.50000D+01

     0.20000D+01
     0.10000D+01
     0.30000D+01
     0.40000D+01
     0.50000D+01

     0.30000D+01
     0.30000D+01
     0.10000D+01
     0.40000D+01
     0.50000D+01

     0.40000D+01
     0.40000D+01
     0.40000D+01
     0.10000D+01
     0.50000D+01

     0.50000D+01
     0.50000D+01
     0.50000D+01
     0.50000D+01
     0.10000D+01

Результаты:

 сингулярные числа (в файле OUTFILE)

  S( 1 ) =  17.2323289653599;
  S( 2 ) =  5.42527830414530;
  S( 3 ) =  3.51682585287666;
  S( 4 ) =  2.29022480833794;
  S( 5 ) =  0.999999999999999;