Как уже говорилось в первой части пособия в п.5.2, при работе с ленточными глобальными матрицами A размера M на N используется блочно-столбцовое разбиение их на блоки. Это означает, что в блок объединяются несколько соседних столбцов матрицы. Все блоки имеют одинаковый размер, т.е. содержат одно и то же число столбцов (за исключением, может быть, последнего блока). Последний блок может содержать меньшее число столбцов, чем остальные.
Размер блока выбирается исходя из числа столбцов N глобальной матрицы A и числа процессоров P, используемых для решения задачи. При этом используется одномерная решетка процессов размером 1 * P. Каждый процесс должен получить один из блоков матрицы. Таким образом, размер блока NB определяется из формулы: NB і [ N / P ]. Если N делится на P нацело, все блоки, распределяемые на все процессы, имеют одинаковый размер. В противном случае последний блок, распределяемый на последний процесс, имеет размер < NB. При этом K - й столбец матрицы A попадает в память процесса с номером [ K / NB ]. Как уже говорилось, процессы нумеруются от 0 до (P - 1). Координаты первого процесса в такой решетке есть (0,0), а последнего - (0, P - 1). На рисунке условно показано разбиение некоторой глобальной матрицы A размера M * N на 3 блока по столбцам для распределения ее по трем процессам (координаты процессов в решетке указаны под соответствующими блоками).
1 1 | | | | | | | | | | M | | N | ||
| | | | | | | | | | | |
| | | | | | | | | | | |
| | | | | | | | | | | | |
(0,0) | (0,1) | (0,2) |
Такой способ распределения матрицы A позволяет использовать в подпрограммах высоко эффективные алгоритмы, называемые "разделяй и властвуй" [см.].
Рассмотрим схему размещения элементов глобальной ленточной матрицы A в локальной памяти параллельных процессов на конкретных примерах.
Пусть матрица A имеет размеры 7 * 7 и ширину ленты, равную 2 :
a11 | a12 | a13 | 0 | 0 | 0 | 0 | |
a21 | a22 | a23 | a24 | 0 | 0 | 0 | |
a31 | a32 | a33 | a34 | a35 | 0 | 0 | |
0 | a42 | a43 | a44 | a45 | a46 | 0 | |
0 | 0 | a53 | a54 | a55 | a56 | a57 | |
0 | 0 | 0 | a64 | a65 | a66 | a67 | |
0 | 0 | 0 | 0 | a75 | a76 | a77 |
Пусть матрица распределяется по решетке процессов 1 * 3 с размером блоков NB_A = 3.
Рассмотрим несколько случаев распределения по решетке процессов несимметричных и симметричных положительно определенных ленточных матриц.
5.1. Случай несимметричной ленточной матрицы, при факторизации которой используются алгоритмы без выбора ведущего элемента.
Пусть число поддиагоналей BWL матрицы A равно 2, а число наддиагоналей BWU равно 2.
Ниже на рисунке представлено распределение такой матрицы по процессам. Символом "*" отмечены элементы в двумерном локальном массиве, которые в дальнейших вычислениях не используются.
Процессы | (0,0) | (0,1) | (0,2) |
* * a13 * a12 a23 a11 a22 a33 a21 a32 a43 a31 a42 a53 | a24 a35 a46 a34 a45 a56 a44 a55 a66 a54 a65 a76 a64 a75 * | a57 a67 a77 * * |
Из этого рисунка видно, что ведущая размерность этих локальных массивов (т.е. число строк в блоках глобальной матрицы A, которые помещаются в каждый процессор) должна быть равна BWL + 1 + BWU (т.к. элементы изображенных массивов заносятся в локальную память по столбцам). О ведущей размерности локальных массивов см. в первой части пособия в п.5.2.2.
5.2. Случай несимметричной ленточной матрицы, при факторизации которой используются алгоритмы с выбором ведущего элемента по столбцам.
В этом случае, в отличие от случая 1, необходимо дополнительное пространство для хранения информации о производимых в процессе факторизации перестановках. А именно, в каждом локальном массиве количество элементов в начале каждого столбца должно быть увеличено на величину, равную сумме числа поддиагоналей и числа наддиагоналей, т.е. BWL + BWU.
В рассматриваемом нами примере имеем BWL = 2 и BWU = 2. Ниже на рисунке представлено распределение глобальной ленточной матрицы по процессам с выделением необходимого дополнительного пространства. Дополнительно резервируемые элементы в каждом локальном массиве обозначены буквами "F".
Процессы | (0,0) | (0,1) | (0,2) |
F F F F F F F F F F F F * * a13 * a12 a23 a11 a22 a33 a21 a32 a43 a31 a42 a53 |
F F F F F F F F F F F F a24 a35 a46 a34 a45 a56 a44 a55 a66 a54 a65 a76 a64 a75 * |
F F F F a57 a67 a77 * * |
Из этого рисунка видно, что ведущая размерность такого локального массива должна быть равна 2 * (BWL + BWU) + 1.
5.3. Случай симметричной положительно определенной ленточной матрицы, у которой в памяти сохраняется только нижний треугольник (параметр UPLO в подпрограммах обработки таких матриц полагается равным "L").
Пусть ширина ленты такой матрицы BW = 2. Ниже на рисунке представлено распределение такой матрицы ( 7 * 7 ) по той же решетке процессов ( 1 * 3 ).
Процессы | (0,0) | (0,1) | (0,2) |
a11 a22 a33 a21 a32 a43 a31 a42 a53 |
a44 a55 a66 a54 a65 a76 a64 a75 * |
a77 * * |
5.4. Случай симметричной положительно определенной ленточной матрицы, у которой в памяти сохраняется только верхний треугольник (параметр UPLO в подпрограммах обработки таких матриц полагается равным "U").
Ниже на рисунке представлено распределение такой матрицы по той же решетке процессов ( 1 * 3 ).
Процессы | (0,0) | (0,1) | (0,2) |
* * a31 * a21 a32 a11 a22 a33 | a42 a53 a64 a43 a54 a65 a44 a55 a66 | a75 a76 a77 |
Из двух последних рисунков видно, что ведущая размерность такого локального массива равна BW + 1.
Кроме этого, при решении систем линейных уравнений предполагается, что вектор (матрица) правых частей B (размером N * NRHS) распределяется по той же решетке процессов, что и описанные выше матрицы A, но только не блочно - столбцовым, а блочно - строчным образом. Это означает, что в блоки объединяются соседние строки матрицы B (или просто соседние элементы, если B - вектор). Ниже на рисунке условно представлено блочно - строчное разбиение матрицы (вектора) B для распределения ее по той же решетке процессов ( 1 * 3 ), что и соответствующая ленточная (или трехдиагональная) матрица A.
1 NRHS Процессы _ _ _ _ _ _ _ _ _ _ _ 1 | | | | (0,0) | | _ _ _ _ _ _ _ _ _ _ _ | | | | (0,1) | | _ _ _ _ _ _ _ _ _ _ _ | | | | (0,2) N | | _ _ _ _ _ _ _ _ _ _ _
Распределение элементов вектора B по этим процессам будет следующим.
(0,0) | (0,1) | (0,2) | |
b1 b2 b3 |
b4 b5 b6 |
b7 * * |
Конкретные примеры распределения матрицы A и вектора B по процессам можно найти в разделе "Пример использования" описаний подпрограмм в разделе Интернет - ресурса по численному анализу "Комплекс программ по линейной алгебре для вычислений на распределенной памяти" (см.).
Приведем здесь фортранные операторы реализующие 2 - ой способ распределения матрицы A вида
2 | -1 | 0 | 0 | 0 | 0 | 0 | |
-1 | 2 | -1 | 0 | 0 | 0 | 0 | |
0 | -1 | 2 | -1 | 0 | 0 | 0 | |
0 | 0 | -1 | 2 | -1 | 0 | 0 | |
0 | 0 | 0 | -1 | 2 | -1 | 0 | |
0 | 0 | 0 | 0 | -1 | 2 | -1 | |
0 | 0 | 0 | 0 | 0 | -1 | 1 |
с помощью служебной подпрограммы PDELSET.
Рассмотрим пример трехдиагональной глобальной матрицы A размером 7 * 7 ( N_A = 7)
a11 | a12 | 0 | 0 | 0 | 0 | 0 | |
a21 | a22 | a23 | 0 | 0 | 0 | 0 | |
0 | a32 | a33 | a34 | 0 | 0 | 0 | |
0 | 0 | a43 | a44 | a45 | 0 | 0 | |
0 | 0 | 0 | a54 | a55 | a56 | 0 | |
0 | 0 | 0 | 0 | a65 | a66 | a67 | |
0 | 0 | 0 | 0 | 0 | a76 | a77 |
Как и ленточные матрицы, трехдиагональные следует распределять по одномерной решетке процессов. Пусть нам необходимо распределить указанную матрицу по решетке процессов 1 * 3.
6.1. Если матрица A несимметричная, она представляется в памяти в виде трех отдельных векторов (D, DL, DU), каждый из которых содержит элементы одной из диагоналей.
Все три вектора должны иметь одинаковую длину, равную длине вектора главной диагонали (D), т.е. быть выровнены. В нашем примере длина всех векторов должна быть равна 7. При этом элементы нижней диагонали должны быть сдвинуты к концу вектора DL, т.е. первый элемент нижней диагонали должен занимать положение второго элемента вектора DL. И, наоборот, элементы верхней диагонали должны быть сдвинуты к началу вектора DU, т.е. ее последний элемент должен занимать положение предпоследнего элемента вектора DU.
Сказанное проиллюстрировано на рисунке ниже. На нем также показано, как эти векторы должны быть разделены на блоки (если величина блока NB_A выбрана равной 3). Как и в случае ленточных матриц здесь действует аналогичное правило: в локальную память каждого из процессов должен быть распределен один блок главной диагонали матрицы A, а также по одному блоку двух других диагоналей.
Процессы
(0,0) | (0,1) | (0,2) | |
DL D DU |
* a21 a32 a11 a22 a33 a12 a23 a34 |
a43 a54 a65 a44 a55 a66 a45 a56 a67 |
a76 a77 * |
Символом "*" отмечены элементы, которые не используются при вычислениях.
6.2. Если трехдиагональная матрица A является симметричной положительно определенной, она должна быть представлена в памяти в виде двух векторов, один из которых (D), содержит элементы главной диагонали, а другой (E) - элементы одной из кодиагоналей.
Если предполагается, что в памяти сохраняется нижняя диагональ матрицы A (параметр UPLO в соответствующей подпрограмме полагается равным "L"), то вектор E содержит элементы нижней диагонали.
Если предполагается, что в памяти сохраняется верхняя диагональ матрицы A (параметр UPLO полагается равным "U"), то вектор E содержит элементы нижней диагонали. Оба вектора D и E должны иметь одинаковую длину, равную длине вектора D, т.е. быть выровнены. При этом элементы верхней или нижней диагонали сдвигаются к началу вектора E, т.е. последний элемент кодиагонали становится предпоследним элементом вектора E.
Сказанное проиллюстрировано на двух рисунках ниже (первый - для UPLO = "L", второй - для UPLO = "U"). На них также показано распределение векторов, разбитых на блоки длиной NB_A = 3, в локальную память каждого из трех процессов.
Процессы
(0,0) | (0,1) | (0,2) | |
D E |
a11 a22 a33 a21 a32 a43 |
a44 a55 a66 a54 a65 a76 |
a77 |
Процессы
(0,0) | (0,1) | (0,2) | |
D E |
a11 a22 a33 a12 a23 a34 |
a44 a55 a66 a45 a56 a67 |
a77 |
Правила распределения по решетке процессов вектора (или матрицы) правых частей B, соответствующего ленточной или трехдиагональной матрице коэффициентов системы A, можно найти в конце п.5.4.
Приведем здесь фортранные операторы реализующие 2 - ой способ распределения матрицы A вида:
2 | -1 | 0 | 0 | 0 | 0 | 0 | |
-1 | 2 | -1 | 0 | 0 | 0 | 0 | |
0 | -1 | 2 | -1 | 0 | 0 | 0 | |
0 | 0 | -1 | 2 | -1 | 0 | 0 | |
0 | 0 | 0 | -1 | 2 | -1 | 0 | |
0 | 0 | 0 | 0 | -1 | 2 | -1 | |
0 | 0 | 0 | 0 | 0 | -1 | 1 |
с помощью служебной подпрограммы PDELSET.
T = 2.0D0 MO = -1.0D0 Z = 0.0D0 DO 10 J = 1, N-1 CALL PDELSET( D, 1, J, DESCD, T ) 10 CONTINUE DO 30 J = 2, N CALL PDELSET( DL, 1, J, DESCD, MO ) 30 CONTINUE DO 20 J = 1, N-1 CALL PDELSET( DU, 1, J, DESCD, MO ) 20 CONTINUE CALL PDELSET( D, 1, N, DESCD, 1.D0 )