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-процесса на хост-компьютере, размерность выделенного задаче подкуба (общее число процессоров).
Здесь:
OUT node_ID | - | номер процессора в заказанном подкубе, нумерация с 0; |
OUT proc | - | целая переменная, в которую упакован номер процессора и номер процесса; |
OUT host | - | номер процесса на хост-компьютере, используется как адрес для обмена с хост-компьютером; |
OUT dims | - | размерность выделенного программе подкуба. |
Функция nwrite посылает сообщение с идентификатором type длиной nbyte из массива buffer процессору dest.
IN | buffer | - | адрес первого байта сообщения; |
IN | nbytes | - | число передаваемых байт; |
IN | dest | - | относительный номер процессора-получателя (адрес 0xffff означает посылку сообщения всем процессорам - broadcast; |
IN | type | - | идентификатор сообщения; |
flag | - | не используется. |
Функция nread принимает из системного буфера сообщение c идентификатором type от отправителя source длиной nbyte и помещает его в адресное пространство процесса, начиная с адреса buffer. Если используется широковещательный запрос, то на выходе функции параметр source содержит адрес отправителя, а параметр type - идентификатор принятого сообщения.
OUT | buffer | - | адрес, куда будет помещаться сообщение; |
IN | nbytes | - | число принимаемых байт; |
INOUT | source | - | относительный номер процессора, от которого ожидается сообщение (адрес -1 означает прием от любого процессора, на выходе source содержит адрес источника, чье сообщение было принято); |
INOUT | type | - | идентификатор ожидаемого сообщения (если -1, то любое сообщение, находящееся в системном буфере, на выходе переменная type будет содержать идентификатор принятого сообщения); |
flag | - | параметр не используется. |
Подпрограмма nrange позволяет ограничить диапазон ожидаемых сообщений в
случае использования расширенного запроса в операциях чтения (type = -1),
IN low | - нижняя граница диапазона (по умолчанию 0); |
IN high | - верхняя граница диапазона (по умолчанию 32,767). |
Функция ntest проверяет наличие в буфере ожидаемого сообщения и возвращает длину сообщения в байтах, если оно получено. В противном случае возвращается отрицательное число.
INOUT | source | - | номер процессора, от которого ожидается сообщение (-1 от любого процессора, в этом случае source на выходе содержит адрес отправителя); |
INOUT | type | - | идентификатор ожидаемого сообщения (-1 любое сообщение, в этом случае type на выходе содержит идентификатор принятого сообщения). |
Кроме этих базовых функций, PSE поддерживает буферизованный режим обменов:
nwritep | - передача сообщения по указателю на буфер; |
nreadp | - прием сообщения из буфера; |
ngetp | - резервирует память под буфер и возвращает указатель на него. |
IN nbytes - размер буфера в байтах.
Для организации режима MPMD - исполнения разных программ в подкубе с возможностью обмена данными между ними - используются функции:
nodeset | - выделение процессоров для новой программы; |
rexec | - загрузка новой программы в процессоры. |
Помимо базового набора представленных выше функций, в программное обеспечение nCUBE2 входит библиотека элементарных параллельных подпрограмм libnpara.a (при компиляции подключается с помощью опции компилятора -lnpara). Поскольку в подпрограммах библиотек nCUBE2 не специфицируется тип пересылаемых данных, то для каждого типа представлена отдельная функция.
Префикс в имени функции соответствует:
i - целый тип 4 байта;
l - целый тип 8 байт;
r - вещественный тип 4 байта;
d - вещественный тип двойной точности 8 байт.
При использовании библиотеки npara к тексту программ должны подключаться include-файлы:
Назначение | Подпрограммы |
Широковещательная рассылка сообщения | 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.
INOUT | buf | - | указатель на буфер, содержащий сообщение; |
IN | length | - | целое, указывающее длину buf в байтах; |
IN | bnode | - | относительный номер узла, который выполняет рассылку; |
IN | type | - | идентификатор сообщения; |
IN | mask | - | битовая маска каналов, которая указывает, какие узлы текущего подкуба получат сообщение. Если mask равно -1, сообщение получат все узлы. |
Функция вычисления глобальной суммы dsum
Функция возвращает сумму локальных значений переменной mypart из процессоров, выборка которых осуществляется согласно маске mask. Результирующее значение суммы получит процессор target.
IN | mypart | - | переменная, содержащая суммируемое значение; |
IN | target | - | номер узла, который получит результирующую сумму (если target = -1, результат получат все узлы); |
IN | type | - | идентификатор сообщения; |
IN | mask | - | битовая маска каналов - указывает, какие узлы текущего подкуба будут участвовать в суммировании. Младший бит маски соответствует каналу 0, следующий бит - каналу 1 и т.д. Биты маски, которые не соответствуют используемым в подкубе каналам, игнорируются. Если mask = -1, участвуют все узлы. |