Автоматизация подготовки входных данных и вызова целевых программ комплекса 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