Как уже упоминалось в разделе документации "Введение в комплекс программ решения линейных систем на распределенной памяти", для каждого глобального массива (матрицы или вектора), который необходимо разбить на блоки (с последующим размещением каждого из них в локальной памяти параллельных процессов, участвующих в решении задачи), вводится специальный объект, называемый дескриптором массива. Дескриптор представляет собой одномерный массив, состоящий из 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.