Дескрипторы глобальных массивов.

Как уже упоминалось в разделе документации "Введение в комплекс программ решения линейных систем на распределенной памяти", для каждого глобального массива (матрицы или вектора), который необходимо разбить на блоки (с последующим размещением каждого из них в локальной памяти параллельных процессов, участвующих в решении задачи), вводится специальный объект, называемый дескриптором массива. Дескриптор представляет собой одномерный массив, состоящий из 9 или 7 элементов целого типа (в смысле ФОРТРАНа). Он предназначен для хранения информации, конкретизирующей способ разбиения глобального массива на блоки и их распределение по всем параллельным процессам.

Дескрипторы являются обязательными параметрами подпрограмм комплекса.

Дескрипторы принято обозначать идентификатором DESC с добавлением в конце имени массива (матрицы или вектора). Например, DESCA означает дескриптор матрицы A,   DESCB - матрицы (вектора) B.

Дескрипторы бывают трех типов, которые обозначаются целыми числами: 1, 501, 502.

Для плотных глобальных матриц A, которые распределяются по двумерной решетке процессов, используется дескриптор первого типа (имеющий тип 1), и состоящий из 9 элементов, за каждым из которых закреплено свое символическое имя (см. таблицу). В таблице указываются номер (индекс) каждого элемента в массиве, его символическое имя (которое оканчивается символом подчеркивания "_" ), а также его смысл. Идентификатор, стоящий в символическом имени элемента после символа подчеркивания "_", является идентификатором глобального массива, описываемого данным дескриптором. Например, N_A обозначает элемент дескриптора, который содержит число столбцов глобальной матрицы A.

N Имя Смысл
1. DTYPE_A - тип дескриптора для плотной матрицы A
DTYPE_A = 1
2. CTXT_A - обозначение контекста BLACS'а, сооветствующее выбранной решетке процессов, по которой распределяется глобальная матрица A. Целое значение, устанавливаемое подпрограммой из пакета BLACS. См. раздел "Решетки процессов, контекст и подпрограммы пакета BLACS"
3. M_A - число строк в глобальной матрице A
4. N_A - число столбцов в глобальной матрице A
5. MB_A - число строк в блоках, на которые разбивается глобальная матрица A
6. NB_A - число столбцов в блоках, на которые разбивается глобальная матрица A
7. RSRC_A - номер строки процесса в решетке, куда была распределена первая строка глобальной матрицы A
8. CSRC_A - номер столбца процесса в решетке, куда был распределен первый столбец глобальной матрицы A
9. LLD_A - ведущая размерность локального массива
( LLD_A ≥ MAX(1, LOCr(M_A)), см. пояснения ниже )

Для ленточных и трехдиагональных глобальных матриц A, которые распределяются по решетке процессов вида 1 * P , используются дескрипторы, имеющие тип, который обозначается целым числом 501. Решетка процессов вида 1 * P означает частный случай двумерной решетки, которая состоит из одной строки и из   P столбцов. По существу это - одномерная решетка процессов, однако каждый процесс в ней все равно идентифицируется парой чисел, в которой первое число равно 0. Например, процесс (0, K) означает процесс, находящийся в   K - ом столбце решетки процессов ( K - ый процесс). При этом матрица A разбивается на блоки по столбцам, т.е. подвергается блочно - столбцовому распределению по решетке процессов. Каждый столбец целиком попадает в локальную память одного из процессов. Дескриптор типа 501 состоит из 7 элементов, за каждым из которых также закреплено символическое имя, аналогичное именам элементов дескриптора типа 1. Ниже приведена таблица для элементов дескриптора типа 501.

N Имя Смысл
1. DTYPE_A - тип дескриптора для ленточной или трехдиагональной матрицы A, распределенной по решетке процессов блочно - столбцовым образом, DTYPE_A = 501
2. CTXT_A - обозначение контекста BLACS'а, сооветствующее выбранной решетке процессов, по которой распределяется глобальная матрица A. Целое значение, устанавливаемое подпрограммой из пакета BLACS. См. раздел "Решетки процессов, контекст и подпрограммы пакета BLACS"
3. N_A - число столбцов глобальной матрицы A
4. NB_A - число столбцов в блоках, на которые разбивается глобальная матрица A
5. CSRC_A - номер столбца процесса в решетке, куда был распределен первый столбец глобальной матрицы A
6. LLD_A - ведущая размерность локального массива
( LLD_A ≥ MAX(1, LOCr(M_A)), см. пояснения ниже). Для трехдиагональных матриц игнорируется (положить равной 0)
7. - в текущей версии комплекса не используется (положить равным 0)

Подробнее о правилах распределения глобальных матриц по процессам см. в разделе документации "Схема размещения в локальной памяти и блочно - циклическое отображение плотных матриц".

Некоторых пояснений требует элемент дескрипторов, называемый ведущей размерностью локального массива и имеющий символическое имя LLD_ (для глобальной матрицы A обозначаемый LLD_A). Он является девятым элементом в дескрипторах типа 1 и шестым элементом в дескрипторах типа 501.

Локальная часть (для некоторого процесса) плотной глобальной матрицы A, в общем случае, представляет из себя двумерный массив, составленный из нескольких циклически распределенных блоков, на которые была разбита исходная матрица A. Эти блоки в исходной матрице A располагались на расстоянии друг от друга (т.е. не примыкали один к другому). В локальной части матрицы A все циклически распределенные на данный процессор блоки плотно примыкают друг к другу, образуя единый сплошной двумерный массив. Элементы этого массива, как и положено в языке ФОРТРАН, располагаются в локальной памяти процесса по столбцам. Значение ведущей локальной размерности LLD_ задает число элементов в таком столбце, т.е., по - другому, число строк в локальном массиве (локальной части матрицы A). Число строк локального массива обозначается LOCr (M_A).

Рассмотрим, как можно вычислить число строк или столбцов в локальной части матрицы A для некоторого процесса.

Пусть K будет числом строк (или столбцов) глобальной матрицы, и предположим, что ее решетка процессов имеет размерность NPROW * NPCOL.

LOCr (K) означает число строк из общего числа  K, которое получит процесс, если  K было распределено по NPROW процессам из столбца этой pешетки процессов (составляющим столбец этой pешетки).

Подобным образом, LOCc (K) означает число столбцов из общего числа  K, которое получит процесс, если K было распределено по NPCOL процессам, составляющим строку этой pешетки.

Значения LOCr ( ) и LOCc ( ) для некоторого процесса с координатами в pешетке процессов ( MYROW, MYCOL) можно определить посредством вызова служебной функции ( tool function )  NUMROC из библиотеки ScaLAPACK_TOOLS :

       LOCr ( M ) = NUMROC ( M, MB_A, MYROW, RSRC_A, NPROW),

       LOCc ( N ) = NUMROC ( N, NB_A, MYCOL, CSRC_A, NPCOL).

Верхнюю границу для этих величин можно вычислить следующим образом:

       LOCr ( M ) ≤ ceil ( ceil ( M / MB_A) / NPROW) * MB_A

       LOCc ( N ) ≤ ceil ( ceil ( N / NB_A) / NPCOL) * NB_A

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

Для случая ленточных и трехдиагональных глобальных матриц A блочно - столбцовое распределение которых по процессам описывается с помощью дескрипторов типа 501, распределение глобального вектора (матрицы) правых частей B должно быть описано с помощью дескриптора типа 502. Он, также как и дескриптор типа 501, состоит их 7 элементов, имеющих аналогичные закрепленные символические имена. Ниже приведена таблица для элементов дескриптора типа 502.

N Имя Смысл
1. DTYPE_B - тип дескриптора для матрицы правых частей B (сооветствующей ленточной или трехдиагональной матрице A), распределенной по решетке процессов блочно-строчным образом, DTYPE_B = 502
2. CTXT_B - обозначение контекста BLACS'а, сооветствующее выбранной решетке процессов, по которой распределяется глобальная матрица B. Целое значение, устанавливаемое подпрограммой из пакета BLACS. См. раздел "Решетки процессов, контекст и подпрограммы пакета BLACS"
3. M_B - число строк глобальной матрицы B
4. MB_B - число строк в блоках, на которые разбивается глобальная матрица B
5. CSRC_B - номер столбца процесса в решетке процессов, куда была распределена первая строка глобальной матрицы B
6. LLD_B - ведущая размерность локального массива.
LLD_B ≥ MAX(1, LOCr(M_B)).
7. - в текущей версии комплекса не используется (положить равным 0)

В отличие от глобальной ленточной матрицы A, которая подвергается блочно - столбцовому распределению (описываемому дескриптором типа 501), глобальный вектор (матрица) B подвергается так называемому блочно - строчному распределению. Это означает, что вектор (матрица) B разбивается на блоки по строкам (каждая строка целиком попадает в локальную память одного из процессов). В том случае, если B - вектор, строка вырождается в один элемент, т.е. блокируются несколько соседних элементов вектора B. Подробнее см. в разделе документации "Схема размещения в локальной памяти и блочно - столбцовое разбиение ленточных матриц". Конкретный пример распределения вектора B по процессам можно найти в разделе "Пример использования" описания одной из подпрограмм для решения систем с ленточной матрицей A.

Инициализацию дескрипторов глобальных матриц A и B необходимо сделать до обращения к подпрограммам комплекса. Для плотных матриц, распределение которых описывается дескрипторами типа 1, инициализацию проще всего выполнить с помощью специальной подпрограммы комплекса из библиотеки ScaLAPACK_TOOLS с именем DESCINIT, которой в качестве параметров необходимо передать значения всех элементов дескриптора. В разделе документации "Решетки процессов, контекст и подпрограммы пакета BLACS" приводится пример обращения к этой подпрограмме при инициализации дескриптора DESCA для плотной матрицы коэффициентов системы A и дескриптора DESCB для матрицы (вектора) правых частей B. Примеры инициализации дескрипторов DESCA и DESCB, имеющих типы 501 и 502, можно найти в разделе "Пример использования" описания одной из подпрограмм для решения систем с ленточной матрицей A.