Решетки процессов, контекст и подпрограммы пакета BLACS.

Подпрограммы комплекса предназначены прежде всего для выполнения операций над двумерными массивами (матрицами). В целях эффективного распараллеливания таких операций было введено фундаментальное понятие решетки параллельных процессов или просто решетки процессов. Это такая двумерная организация (структура) процессов, которая характеризуется числом строк в решетке (обозначенным NPROW) и числом столбцов (обозначенным NPCOL). Общее число процессов, используемых для решения задачи, составляет  NP = NPROW * NPCOL. При этом каждый процесс идентифицируется парой координат (целых чисел) в этой решетке процессов. В подпрограммах их принято обозначать идентификаторами:  MYROW - номер строки в решетке и  MYCOL - номер столбца в решетке.

До того как обратиться к одной из подпрограмм, предназначенной для решения системы линейных алгебраических уравнений, пользователю необходимо:

- задать конкретную решетку процессов (т.е. задать значения NPROW и NPCOL),
- разделить матрицу системы A на блоки (размера  MB * NB ) и
   распределить эти блоки по всем процессам решетки,
- аналогичную процедуру необходимо проделать и с вектором (матрицей)
   правых частей системы B, разделив его (ее) на блоки (размера NB * NBRHS)
   и также распределив по процессам выбранной решетки.

После этого пользователь может вызвать одну из подпрограмм комплекса, передав ей через параметры всю информацию об исходных матрицах системы уравнений, а также о том, как распределены их элементы в локальную память каждого из процессов решетки.

После выполнения необходимых вычислений пользователю рекомендуется освободить использованную решетку процессов и осуществить выход из головной программы, обратившись к специальной подпрограмме пакета BLACS.

Ниже более подробно описывается указанная последовательность действий.

1. Инициализация решетки процессов.

Как уже говорилось в разделе документации "Общее описание назначения, организации и структуры комплекса", все действия, связанные с параллельными процессами, выполняются посредством обращения к подпрограммам пакета BLACS.

После присвоения конкретных значений параметрам решетки  NPROW и  NPCOL инициализация решетки проще всего производится посредством обращения к подпрограмме SL_INIT из библиотеки ScaLAPACK_TOOLS (библиотеки служебных подпрограмм ScaLAPACK'а). Однако подпрограмма SL_INIT сама состоит из обращений к подпрограммам пакета BLACS (для получения ее текста надавите ссылку SL_INIT.f ).

Эта подпрограмма инициализирует решетку процессов, упорядочивая процессы по строкам и присваивает служебному параметру ICTXT некоторое целое значение. Этот параметр, называемый системным контекстом или контекстом BLACS'а или просто контекстом, однозначно специфицирует выбранную решетку процессов. Работая с выбранной решеткой процессов, пользователь не имеет права менять значение параметра ICTXT. Он должен только передавать ICTXT в качестве входного параметра при обращении к любой другой подпрограмме пакета BLACS, а также указывать в качестве элемента дескрипторов глобальных матриц (см. в разделе документации "Дескрипторы глобальных массивов").

После спецификации контекста пользователю чаще всего может потребоваться определить координаты процесса, на котором выполняется данный экземпляр программы ( MYROW, MYCOL ). Это выполняется посредством обращения к подпрограмме BLACS_GRIDINFO. Типичный фрагмент программы, выполняющий эти задачи выглядит следующим образом:

      CALL SL_INIT ( ICTXT, NPROW, NPCOL )

      CALL BLACS_GRIDINFO ( ICTXT, NPROW, NPCOL, MYROW, MYCOL ) ,

где  в   SL_INIT :

ICTXT    - специфицирует контекст BLACS'а, идентифицирующий созданную
                  решетку процессов (глобальный выходной параметр, тип целый)

NPROW - специфицирует число строк в создаваемой решетке процессов
                  (глобальный входной параметр, тип целый)

NPCOL - специфицирует число столбцов в создаваемой решетке процессов
                 (глобальный входной параметр, тип целый)
2. Распределение матриц по решетке процессов.

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

При этом каждой глобальной матрице, распределенной по решетке процессов, должен быть приписан дескриптор, содержащий информацию о том, как именно было произведено это распределение. Дескриптор представляет из себя одномерный массив из 9 или 7 элементов целого типа. Подробное описание дескрипторов можно найти в разделе документации "Дескрипторы глобальных массивов". Здесь мы покажем лишь как инициализировать дескриптор матрицы  A ( DESCA ) и дескриптор матрицы (вектора) правых частей  B ( DESCB ).

Если матрица  A - плотная, то проще всего можно инициализировать эти дескрипторы посредством обращения к подпрограмме из библиотеки ScaLAPACK_TOOLS, называемой DESCINIT. Текст этой подпрограммы можно получить, надавив на ссылку DESCINIT.f.

Ниже приводятся обращения к этой подпрограмме при инициализации дескрипторов  DESCA и  DESCB. Подобные обращения можно найти в текстах тестовых примеров к подпрограммам решения системы уравнений с плотными матрицами ( TDGESV1.zip, TPDPOSV.zip ).

      CALL DESCINIT ( DESCA, M, N, MB, NB, RSRC, CSRC,
                                      ICTXT, MXLLDA, INFO)

      CALL DESCINIT ( DESCB, N, NRHS, NB, NBRHS, RSRC, CSRC,
                                      ICTXT, MXLLDB, INFO)

Эти два вызова подпрограммы DESCINIT эквивалентны следующим операторам присваивания:

      DESCA(1) = 1
      DESCA(2) = ICTXT
      DESCA(3) = M
      DESCA(4) = N
      DESCA(5) = MB
      DESCA(6) = NB
      DESCA(7) = RSRC
      DESCA(8) = CSRC
      DESCA(9) = MXLLDA

      DESCB(1) = 1
      DESCB(2) = ICTXT
      DESCB(3) = N
      DESCB(4) = NRHS
      DESCB(5) = NB
      DESCB(6) = NBRHS
      DESCB(7) = RSRC
      DESCA(8) = CSRC
      DESCA(9) = MXLLDB

Здесь первый элемент обозначает тип дескриптора, второй - обсуждавшийся выше служебный параметр подпрограмм BLACS'а (контекст).

M, N - число строк и столбцов матрицы  A ( M * N );
N, NRHS - число строк и столбцов матрицы  B ( N * NRHS ); если B - вектор, NRHS = 1;
MB, NB - число строк и столбцов блоков, на которые разбивается матрица  A;
NB, -
NBRHS   
число строк и столбцов блоков, на которые разбивается матрица  B;
RSRC, -
CSRC   
координаты процесса, куда размещается пользователем первый элемент глобальной матрицы;
MXLLDA, - MXLLDB    ведущие локальные размерности матриц A и B (см. разделы документации "Дескрипторы глобальных массивов" и "Схема размещения в локальной памяти и блочно - циклическое отображение плотных матриц" ).

Самые простые способы отображения глобальной матрицы на решетку процессов можно найти в тестовых примерах к подпрограммам решения систем как с плотными, так и с ленточными матрицами (см., например,  TDGESV1.zip,  TPDDBSV.zip ). В них эти действия выполняются в подпрограмме с именем MATINIT, которая является частью тестового примера, но в каждом тесте, естественно, имеет свое содержание.

3. Освобождение решетки процессов.

После того как необходимые вычисления на решетке процессов были завершены, рекомендуется освободить решетку процессов посредством вызова подпрограммы BLACS_GRIDEXIT. Когда завершены все вычисления, выход из программы должен быть осуществлен посредством обращения к подпрограмме BLACS_EXIT.

Типичный пример фрагмента программы, включающий эти действия:

      CALL BLACS_GRIDEXIT ( ICTXT )

      CALL BLACS_EXIT (0)