Автоматизация подготовки входных данных и вызова целевых программ комплекса 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_GESVD2(NAME, SV, M, N, NPROW, NPCOL, AMEM, MEMSIZE,
NB, INFILEA, OUTFILE)
Параметры
| NAME - | имя целевой подпрограммы, с помощью которой пользователь собирается решать свою задачу (одно из PDGESVD2, PDGESVD3, PDGESVD5, PDGESVD6); (входной параметр, тип символьный); |
| SV - |
если SV = 'R' - требуется вычислить только правые сингулярные векторы матрицы; если SV = 'L' - требуется вычислить только левые сингулярные векторы матрицы; если SV = 'A' - требуется вычислить и левые и правые сингулярные векторы матрицы; (входной параметр, тип символьный); |
| M - | число строк исходной матрицы (входной параметр, тип целый); |
| N - | число столбцов исходной матрицы (входной параметр, тип целый); |
| NPROW - | число строк в решетке процессов, которое было выдано пользователю соответствущей подпрограммой вычисления параметров PAR_GESVD2(см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый); |
| NPCOL - | число столбцов в решетке процессов, которое было выдано пользователю соответствущей подпрограммой вычисления параметров PAR_GESVD2(см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый); |
| AMEM - | массив локальной рабочей памяти, в которую распределяется локальная часть исходной матрицы, хранятся элементы рабочих массивов, где формируются локальные части массивов сингулярных чисел и сингулярных векторов (входной параметр, тип DOUBLE PRECISION); |
| MEMSIZE - | задаваемый размер массива AMEM, который должен быть больше или равен значению параметра MMIN, выданному пользователю соответствующей подпрограммой вычисления параметров PAR_GESVD2 (см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый); |
| NB - | размер блока, матрицы, выданный пользователю соответствующей подпрограммой вычисления параметров PAR_GESVD2 (или фигурировавший в качестве входного значения при вычислении значений других параметров) (см.Автоматизация доступа к подпрограммам Комплекса (входной параметр, тип целый); |
| INFILEA - | имя файла, содержащего исходную матрицу (A) (входной параметр, тип символьный); |
| OUTFILE - | имя файла, в который в результате работы подпрограммы будут записаны результирующие массивы сингулярных чисел и сингулярных векторов (входной параметр, тип символьный). |
Вызываемые подпрограммы
Здесь указаны только целевые (1 - ого уровня) и базовые подпрограммы (2 - ого уровня), которые вызываются из целевых подпрограмм.
|
PDGESVD2 -
PDGESVD3 PDGESVD5 PDGESVD6 |
сингулярное разложение квадратной матрицы с вычислением всех сингулярных чисел
и сингулярных векторов; сингулярное разложение квадратной матрицы с вычислением сингулярных чисел и правых и/или левых сингулярных векторов; сингулярное разложение прямоугольной матрицы с вычислением всех сингулярных чисел и сингулярных векторов; сингулярное разложение прямоугольной матрицы с вычислением сингулярных чисел и правых и/или левых сингулярных векторов, соответственно |
Замечания по использованию
| 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 |
Необходимо вычислить сингулярные числа и сингулярные векторы матрицы с помощью
подпрограммы PDGESVD2.
Пользователь может выделить для решения задачи 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_GESVD2 были получены следующие
значения необходимых параметров.
Решетка процессов: NPROW = 2, NPCOL = 2;
NB = 2 (т.е. матрица разбивается на блоки размера 2 на 2),
Минимальный размер локальной памяти MMIN = 104.
Фрагмент фортранного текста вызывающей программы
(полный текст теста можно получить в
tcl_gesvd2.zip)
PROGRAM TCL_GESVD2
include 'mpif.h'
INTEGER M, N, NPROW, NPCOL, NB, MEMSIZE
PARAMETER ( M=5, N=5, NB=2, MEMSIZE=104)
*
DOUBLE PRECISION AMEM( MEMSIZE )
CHARACTER*(*) NAME, SV
CHARACTER INFILEA*(*), OUTFILE*(*)
PARAMETER ( INFILEA = 'gesvdA_5.dat',
$ OUTFILE = 'gesvd2_5.res')
*
PARAMETER ( SV = 'A',
$ NAME = 'PDGESVD2')
EXTERNAL CAL_GESVD2
*
NPROW = 2
NPCOL = 2
*
CALL CAL_GESVD2(NAME, SV, 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;
сингулярные векторы:
Матрица U
U (1, 1) = -0.404652434305128872
U (2, 1) = -0.404652434305128927
U (3, 1) = -0.425692654396723880
U (4, 1) = -0.465693233173190002
U (5, 1) = -0.523859133156270307
U (1, 2) = -0.389791547190647292
U (2, 2) = -0.389791547190647736
U (3, 2) = -0.275993043075253408
U (4, 2) = 0.045447631608895860
U (5, 2) = 0.786058173694953233
U (1, 3) = 0.247683855301383621
U (2, 3) = 0.247683855301383732
U (3, 3) = 0.084392957515293437
U (4, 3) = -0.874087946343403921
U (5, 3) = 0.325812072251903062
U (1, 4) = -0.350673159755203467
U (2, 4) = -0.350673159755202302
U (3, 4) = 0.857607971563088323
U (4, 4) = -0.130516617390330075
U (5, 4) = -0.039123519154543346
U (1, 5) = -0.707106781186547351
U (2, 5) = 0.707106781186547795
U (3, 5) = -0.000000000000000722
U (4, 5) = 0.000000000000000056
U (5, 5) = 0.000000000000000167
Матрица VT
VT (1, 1) = -0.404652434305128761
VT (2, 1) = 0.389791547190647070
VT (3, 1) = -0.247683855301383649
VT (4, 1) = 0.350673159755203079
VT (5, 1) = 0.707106781186547462
VT (1, 2) = -0.404652434305128983
VT (2, 2) = 0.389791547190647625
VT (3, 2) = -0.247683855301383982
VT (4, 2) = 0.350673159755202413
VT (5, 2) = -0.707106781186547684
VT (1, 3) = -0.425692654396723769
VT (2, 3) = 0.275993043075253741
VT (3, 3) = -0.084392957515293576
VT (4, 3) = -0.857607971563088101
VT (5, 3) = 0.000000000000000555
VT (1, 4) = -0.465693233173189891
VT (2, 4) = -0.045447631608895631
VT (3, 4) = 0.874087946343404698
VT (4, 4) = 0.130516617390329825
VT (5, 4) = -0.000000000000000222
VT (1, 5) = -0.523859133156270196
VT (2, 5) = -0.786058173694953788
VT (3, 5) = -0.325812072251903284
VT (4, 5) = 0.039123519154543387
VT (5, 5) = -0.000000000000000444