Next:4.6. Библиотека подпрограмм хост-компьютера для взаимодействия с параллельными программами nCUBE2
Up:4. МНОГОПРОЦЕССОРНАЯ ВЫЧИСЛИТЕЛЬНАЯ СИСТЕМА nCUBE2
Prev:4.4. Получение информации о системе и управление процессами

4.5. Средства параллельного программирования на nCUBE2

На многопроцессорной системе nCUBE2 механизм передачи сообщений реализован в виде расширения Run-time библиотеки (подключаемой по умолчанию), в которую включен ряд дополнительных функций, вызываемых из программ, написанных на языках C и FORTRAN. Список этих функций весьма невелик, но, тем не менее, предоставляет программисту достаточно широкие возможности для создания программ сложной структуры. Возможно программирование как в режиме SPMD (Single Program Multiple Data), так и в режиме MPMD (Multiple Program Multiple Data).

Рассмотрим наиболее важные из этих функций. При обсуждении параметров процедур символами IN будем указывать входные параметры процедур, символами OUT выходные, а INOUT - входные параметры, модифицируемые процедурой.

Подпрограмма идентификации процессором самого себя whoami
Все параметры этой подпрограммы являются выходными. Возвращаются: идентификатор (логический номер) процессора nCUBE2, номер процесса на nCUBE2, номер xnc-процесса на хост-компьютере, размерность выделенного задаче подкуба (общее число процессоров).

C:
void whoami (int *node_ID, int *proc, int *host, int *dims)
FORTRAN:
subroutine whoami (node_ID, proc, host, dims)
integer node_ID, proc, host, dims

Здесь:
OUT node_ID - номер процессора в заказанном подкубе, нумерация с 0;
OUT proc - целая переменная, в которую упакован номер процессора и номер процесса;
OUT host - номер процесса на хост-компьютере, используется как адрес для обмена с хост-компьютером;
OUT dims - размерность выделенного программе подкуба.

Функция nwrite посылает сообщение с идентификатором type длиной nbyte из массива buffer процессору dest.

C:
int nwrite (char *buffer, int nbytes, int dest, int type, int *flag)
FORTRAN:
integer function nwrite (buffer, nbytes, dest, type, flag)
dimension buffer (*)
integer nbytes, dest, type, flag
IN buffer - адрес первого байта сообщения;
IN nbytes - число передаваемых байт;
IN dest - относительный номер процессора-получателя (адрес 0xffff означает посылку сообщения всем процессорам - broadcast;
IN type - идентификатор сообщения;
  flag - не используется.
Функция возвращает код ошибки или 0 в случае успешного завершения.

Функция nread принимает из системного буфера сообщение c идентификатором type от отправителя source длиной nbyte и помещает его в адресное пространство процесса, начиная с адреса buffer. Если используется широковещательный запрос, то на выходе функции параметр source содержит адрес отправителя, а параметр type - идентификатор принятого сообщения.

C:
int nread (char *buffer, int nbytes, int *source, int *type, int *flag)
FORTRAN:
integer function nread (buffer, nbytes, source, type, flag)
dimension buffer(*)
integer nbytes, source, type, flag
 
OUT buffer - адрес, куда будет помещаться сообщение;
IN nbytes - число принимаемых байт;
INOUT source - относительный номер процессора, от которого ожидается сообщение (адрес -1 означает прием от любого процессора, на выходе source содержит адрес источника, чье сообщение было принято);
INOUT type - идентификатор ожидаемого сообщения (если -1, то любое сообщение, находящееся в системном буфере, на выходе переменная type будет содержать идентификатор принятого сообщения);
flag - параметр не используется.
Функция возвращает число принятых байт.

Подпрограмма nrange позволяет ограничить диапазон ожидаемых сообщений в случае использования расширенного запроса в операциях чтения (type = -1),

C:
void nrange (int low, int high)
FORTRAN:
subroutine nrange (low, high)
integer low, high
IN low - нижняя граница диапазона (по умолчанию 0);
IN high - верхняя граница диапазона (по умолчанию 32,767).

Функция ntest проверяет наличие в буфере ожидаемого сообщения и возвращает длину сообщения в байтах, если оно получено. В противном случае возвращается отрицательное число.

C:
int ntest (int *source, int *type)
FORTRAN:
integer function ntest (source, type)
integer source, type
INOUT source - номер процессора, от которого ожидается сообщение (-1 от любого процессора, в этом случае source на выходе содержит адрес отправителя);
INOUT type - идентификатор ожидаемого сообщения (-1 любое сообщение, в этом случае type на выходе содержит идентификатор принятого сообщения).

Кроме этих базовых функций, PSE поддерживает буферизованный режим обменов:
nwritep - передача сообщения по указателю на буфер;
nreadp - прием сообщения из буфера;
ngetp - резервирует память под буфер и возвращает указатель на него.

C:
void* ngetp (unsigned nbytes)

IN nbytes - размер буфера в байтах.

Для организации режима MPMD - исполнения разных программ в подкубе с возможностью обмена данными между ними - используются функции:
   nodeset - выделение процессоров для новой программы;
   rexec - загрузка новой программы в процессоры.
В данном руководстве этот режим работы рассматриваться не будет, поскольку он слишком специфичен для конкретной платформы.

Помимо базового набора представленных выше функций, в программное обеспечение nCUBE2 входит библиотека элементарных параллельных подпрограмм libnpara.a (при компиляции подключается с помощью опции компилятора -lnpara). Поскольку в подпрограммах библиотек nCUBE2 не специфицируется тип пересылаемых данных, то для каждого типа представлена отдельная функция. Префикс в имени функции соответствует:
   i - целый тип 4 байта;
   l - целый тип 8 байт;
   r - вещественный тип 4 байта;
   d - вещественный тип двойной точности 8 байт.

При использовании библиотеки npara к тексту программ должны подключаться include-файлы:

С:
#include <ncube/npara_prt.h>
FORTRAN:
include 'ncube/npara_prt.hf'
Таблица 4.1. Список подпрограмм параллельной библиотеки nCUBE2
Назначение Подпрограммы
Широковещательная рассылка сообщения nbroadcast
Суммирование скалярных переменных isum, lsum, rsum, dsum
Суммирование векторных переменных nisumn, nlsumn, nrsumn, ndsumn
Скалярный максимум imax, lmax, rmax, dmax
Векторный максимум nimaxn, nlmaxn, nrmaxn, ndmaxn
Скалярный минимум imin, lmin, rmin, dmin
Векторный минимум niminn, nlminn, nrminn, ndminn
Транспонирование двумерных матриц trans2d8p, trans2d16p
Транспонирование трехмерных матриц trans3d8p, trans3d16p
Двумерное быстрое преобразование Фурье cfft2dp, dcfft2dp
Трехмерное быстрое преобразование Фурье cfft3dp, dcfft3dp
Упорядочение работы узлов seqstart, seqend, ntseqstart, ntseqend
Разбиение данных part1d
Отображение узлов на сетку nodetogrid, ngridtonode

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

Функция рассылки сообщения всем процессорам подкуба nbroadcast
Функция позволяет послать всем процессорам данные, расположенные в адресном пространстве узла bnode, начиная с адреса buf. Длина сообщения length байт, идентификатор сообщения type. Принимаемое сообщение размещается в ту же самую переменную buf.

C:
int nbroadcast(buf, length, bnode, type, mask);
void *buf;
int length, bnode, type, mask;
FORTRAN:
integer*4 nbroadcast(buf, length, bnode, type, mask)
integer*4 buf(*)
integer*4 length, bnode, type, mask
INOUT buf - указатель на буфер, содержащий сообщение;
IN length - целое, указывающее длину buf в байтах;
IN bnode - относительный номер узла, который выполняет рассылку;
IN type - идентификатор сообщения;
IN mask - битовая маска каналов, которая указывает, какие узлы текущего подкуба получат сообщение. Если mask равно -1, сообщение получат все узлы.

Функция вычисления глобальной суммы dsum
Функция возвращает сумму локальных значений переменной mypart из процессоров, выборка которых осуществляется согласно маске mask. Результирующее значение суммы получит процессор target.

C:
double dsum (mypart, target, type, mask)
double mypart;
int target, type, mask;
FORTRAN:
real*8 function dsum (mypart, target, type, mask)
real*8 mypart
integer*4 target, type, mask
IN mypart - переменная, содержащая суммируемое значение;
IN target - номер узла, который получит результирующую сумму (если target = -1, результат получат все узлы);
IN type - идентификатор сообщения;
IN mask - битовая маска каналов - указывает, какие узлы текущего подкуба будут участвовать в суммировании. Младший бит маски соответствует каналу 0, следующий бит - каналу 1 и т.д. Биты маски, которые не соответствуют используемым в подкубе каналам, игнорируются. Если mask = -1, участвуют все узлы.



Next:4.6. Библиотека подпрограмм хост-компьютера для взаимодействия с параллельными программами nCUBE2
Up:4. МНОГОПРОЦЕССОРНАЯ ВЫЧИСЛИТЕЛЬНАЯ СИСТЕМА nCUBE2
Prev:4.4. Получение информации о системе и управление процессами