В первой части методического пособия в п.5.2
уже рассматривалось понятие дескриптора глобальной матрицы, который необходимо
подавать в качестве фактического параметра целевой программе Комплекса,
выбранной для решения задачи. При решении систем линейных уравнений
описанным образом должен быть сформирован дескриптор глобальной
матрицы системы уравнений A (дескриптор типа 1 - если матрица
A плотная).
Если матрица A специального вида, дескриптор формируется по правилам,
описанным в первой части пособия в Приложении 1_1.
Здесь необходимо также рассмотреть правила разбиения и распределения
по процессам глобального вектора (или матрицы) правых частей B.
Прежде всего, этот вектор (матрица) всегда распределяется
по той же самой (уже заявленной пользователем) решетке процессов,
что и глобальная матрица системы A. При этом если
матрица A плотная и ее распределение описывается дескриптором типа 1,
то распределение вектора (матрицы) B также должно быть описано
дескриптором типа 1.
При этом вектор B представляется, как матрица вида (M, 1), имеющая
M строк и один столбец. Этот столбец B распределяется по процессам первого
столбца двумерной решетки процессов. Процессы из всех остальных столбцов
решетки процессов в случае, если B - вектор, не содержат
никаких его элементов. Подробнее см. в п.6.2.
Пример см. в Приложении 2_1
во второй части методического пособия.
Для случая ленточных и трехдиагональных глобальных матриц A, блочно - столбцовое распределение которых по процессам описывается с помощью дескрипторов типа 501 (см.), распределение глобального вектора (матрицы) правых частей B должно быть описано с помощью дескриптора типа 502. Он, также как и дескриптор типа 501, состоит их 7 элементов, имеющих аналогичные закрепленные символические имена. Ниже приведена таблица для элементов дескриптора типа 502.
| N | Имя | Смысл | |
|---|---|---|---|
| 1. | DTYPE_B | - | тип дескриптора для вектора(матрицы) правых частей B (сооветствующего ленточной или трехдиагональной матрице A), распределенного по решетке процессов блочно-строчным образом, DTYPE_B = 502 |
| 2. | CTXT_B | - | обозначение контекста BLACS'а, сооветствующее выбранной решетке процессов, по которой распределяется глобальный вектор (матрица) B. Целое значение, устанавливаемое подпрограммой из пакета BLACS. См. п.4.. |
| 3. | M_B | - | число строк глобального вектора (матрицы) B |
| 4. | MB_B | - | число строк в блоках, на которые разбивается глобальный вектор (матрица) B |
| 5. | CSRC_B | - | номер столбца процесса в решетке процессов, куда была распределена первая строка глобального вектора (матрицы) B |
| 6. | LLD_B | - |
ведущая размерность локального массива. LLD_B і MAX(1, LOCr(M_B)). Для систем с трехдиагональными матрицами игнорируется (положить равным 0) |
| 7. | - | в текущей версии комплекса не используется (положить равным 0) |
В отличие от глобальной ленточной матрицы A, которая подвергается блочно - столбцовому распределению (описываемому дескриптором типа 501), глобальный вектор (матрица) B подвергается так называемому блочно - строчному распределению. Это означает, что вектор (матрица) B разбивается на блоки по строкам (каждая строка целиком попадает в локальную память одного из процессов). В том случае, если B - вектор, строка вырождается в один элемент, т.е. блокируются несколько соседних элементов вектора B. Подробнее см. в п.5.4. Конкретный пример распределения вектора B по процессам можно найти в разделе "Пример использования" описания одной из подпрограмм для решения систем с ленточной матрицей A (см.).
Инициализацию дескрипторов глобальных матриц A и B необходимо сделать до обращения к подпрограммам Комплекса. Для плотных матриц, распределение которых описывается дескрипторами типа 1, инициализацию проще всего выполнить с помощью специальной служебной подпрограммы Комплекса с именем DESCINIT, которой в качестве параметров необходимо передать значения всех элементов дескриптора. В первой части пособия в п.4.2. приводится пример обращения к этой подпрограмме при инициализации дескриптора DESCA для плотной матрицы коэффициентов системы A.
Приведём здесь обращение к этой подпрограмме при инициализации дескриптора DESCB для матрицы (вектора) правых частей системы уравнений B с плотной матрицей системы A. Подобные обращения можно найти в текстах тестовых примеров к программам решения системы уравнений с плотными матрицами ( TPDGESV.f, TPDPOSV.f ).
CALL DESCINIT (DESCB, N, NRHS, NB, NBRHS, RSRC, CSRC,
ICTXT, MXLLDA, INFO)
Этот вызов подрограммы DESCINIT эквивалентен следующим операторам присваивания:
DESCB(1) = 1
DESCB(2) = ICTXT
DESCB(3) = N
DESCB(4) = NRHS
DESCB(5) = NB
DESCB(6) = NBRHS
DESCB(7) = RSRC
DESCB(8) = CSRC
DESCB(9) = MXLLDB
Здесь первый элемент обозначает тип дескриптора, второй - служебный параметр подпрограммы BLACS'а (контекст).
| M, N - | число строк и столбцов матрицы A ( M * N ); |
| N, NRHS - | число строк и столбцов матрицы B ( N * NRHS ); если B - вектор, NRHS = 1; |
|
NB - NBRHS | число строк и столбцов блоков, на которые разбивается матрица B; |
|
RSRC - CSRC | координаты процесса, куда размещается пользователем первый элемент глобальной матрицы; |
| MXLLDB - | ведущая локальная размерность матрицы B. |
Примеры инициализации дескрипторов DESCA и DESCB, имеющих типы 501 и 502, можно найти в разделе "Пример использования" описания одной из подпрограмм для решения систем с ленточной матрицей A (см.).
Рассмотрим подробнее пример по использованию подпрограммы PDGESV, которая предназначена для решения линейной системы алгебраических уравнений с плотной матрицей общего вида A. Данный пример приводится в описании этой подпрограммы (см. Приложение 2_1) в последнем разделе описания с названием "Пример использования".
Пример демонстрирует решение системы уравнений A * X = B с матрицей A размера 9 * 9. Ниже показана матричная форма записи этой системы.
| 19 3 1 12 1 16 1 3 11 |
x1 | 0 | |||
| -19 3 1 12 1 16 1 3 11 |
x2 | 0 | |||
| -19 -3 1 12 1 16 1 3 11 |
x3 | 1 | |||
| -19 -3 -1 12 1 16 1 3 11 |
x4 | 0 | |||
| -19 -3 -1 -12 1 16 1 3 11 |
x5 | = | 0 | ||
| -19 -3 -1 -12 -1 16 1 3 11 |
x6 | 0 | |||
| -19 -3 -1 -12 -1 -16 1 3 11 |
x7 | 0 | |||
| -19 3 -1 -12 -1 -16 -1 3 11 |
x8 | 0 | |||
| -19 -3 -1 -12 -1 -16 -1 -3 11 | x9 | 0 |
Для простоты решается система с одной правой частью (NRHS = 1), т.е. правая часть B системы - вектор (матрица из одного столбца).
Сначала мы должны задать решетку процессов и распределить по ней исходные глобальные матрицы A и B.
Предположим, что матрица A разделена на блоки размером MB * NB, где MB = NB = 2. Выбрана решетка процессов размером 2 * 3, т.е. NPROW = 2 и NPCOL = 3. Таким образом имеет место случай распределения матрицы A, приведенный в п.6.2 в первой части методического пособия. После подстановки конкретных значений элементов матрицы A получаем следующую картинку распределения ее элементов по процессам. (Вверху указаны номера столбцов решетки процессов, слева - номера строк решетки процессов.)
| 0 | 1 | 2 | |||
| 0 |
19 3 -19 3 |
1 3 1 3 |
1 12 1 12 |
11 11 |
1 16 1 16 |
|
-19 -3 -19 -3 |
1 3 1 3 |
-1 -12 -1 -12 |
11 11 |
1 16 -1 16 | |
| -19 -3 | -1 -3 | -1 -12 | 11 | -1 -16 | |
| 1 |
-19 -3 -19 -3 |
1 3 1 3 |
1 12 -1 12 |
11 11 |
1 16 1 16 |
|
-19 -3 -19 3 |
1 3 -1 3 |
-1 -12 -1 -12 |
11 11 |
-1 -16 -1 -16 | |
Из последнего рисунка видно, что процесс с координатами (0, 0) содержит локальный массив (часть матрицы A) размера (5, 4).
На следующем рисунке показано разбиение на блоки и распределение по той же решетке процессов исходного вектора правых частей B.
| 0 | 1 | 2 | |
| 0 |
b1 b2 | ||
|
b5 b6 | |||
| b9 | |||
| 1 |
b3 b4 | ||
|
b7 b8 |
Как видим, блоки состоят из двух соседних элементов вектора B и распределяются только в столбце решетки процессов с координатой 0. Процессы в других столбцах решетки не содержат никаких частей исходного глобального вектора B.
После вызова подпрограммы PDGESV и выполнения всех необходимых вычислений процесс (0, 0) будет содержать на месте локальной части вектора B локальную часть глобального вектора решений X. Ниже изображено, на месте каких элементов локального вектора B (обозначенных как ~bi ) с локальными индексами, какие элементы глобального вектора X с глобальными индексами оказываются расположенными по окончании вычислений. Это расположение соответствует расположению элементов исходного глобального вектора правых частей B, показанному на предыдущем рисунке. Ниже показаны также вычисленные значения элементов вектора X.
| x1 | -> | ~b1 | 0 | ||
| x2 | -> | ~b2 | -1/6 | ||
| x5 | -> | ~b3 | = | 0 | |
| x6 | -> | ~b4 | 0 | ||
| x9 | -> | ~b5 | 0 |
Аналогичное соответствие и полученные результаты изображены далее для процесса с координатами (1, 0).
| x3 | -> | ~b1 | 1/2 | ||
| x4 | -> | ~b2 | 0 | ||
| x7 | -> | ~b3 | = | -1/2 | |
| x8 | -> | ~b4 | 1/6 |
Таким образом глобальный выходной вектор решений X имеет следующее значение:
| x1 | 0 | ||
| x2 | -1/6 | ||
| x3 | 1/2 | ||
| x4 | 0 | ||
| x5 | = | 0 | |
| x6 | 0 | ||
| x7 | -1/2 | ||
| x8 | 1/6 | ||
| x9 | 0 |
Кроме того, выполняется проверка точности полученных результатов вычислением нормализованной невязки по формуле:
|| A * x - b ||
______________________ .
( || x || * || A || * eps * N )
Здесь eps означает машинное эпсилон, которое вычисляется с помощью вспомогательной подпрограммы PDLAMCH.
Как уже говорилось, фрагмент фортранного текста с реализацией этого примера приведен в разделе "Пример использования" в Приложении 2_1. В этом примере показан первый, из рассмотренных в первой части пособия в п.6.3., способов программирования на ФОРТРАНе процесса распределения исходных матриц в локальную память каждого из параллельных процессов.
Приведем здесь фортранные операторы второго, более простого способа реализации такого распределения с помощью служебной подпрограммы PDELSET (преимущества которого также рассматривались в п.6.3 первой части пособия).
AIJ = 19.0D0
DO 20 J = 1, N
DO 10 I = 1, N
IF( I.LE.J ) THEN
CALL PDELSET( A, I, J, DESCA, AIJ )
ELSE
CALL PDELSET( A, I, J ,DESCA, -AIJ )
END IF
10 CONTINUE
IF( J.EQ.1 .OR. J.EQ.7 ) AIJ = 3.0D0
IF( J.EQ.2 .OR. J.EQ.4 .OR. J.EQ.6 ) AIJ = 1.0D0
IF( J.EQ.3 ) AIJ = 12.0D0
IF( J.EQ.5 ) AIJ = 16.0D0
IF( J.EQ.8 ) AIJ = 11.0D0
20 CONTINUE
CALL PDELSET( A, 8, 2, DESCA, 3.0D0 )
BIJ = 0.0D0
J = 1
DO 30 I = 1, N
CALL PDELSET( B, I, J, DESCB, BIJ )
30 CONTINUE
CALL PDELSET( B, 3, 1, DESCB, 1.0D0 )
Полностью весь фортранный текст рассматриваемого примера приведен в Приложении 2_2.
Кроме того, в Приложении 2_3 приводится текст программы при использовании третьего (из рассмотренных в п.6.3.) способа распределения при считывании исходной матрицы из внешнего файла.