LIBDVM~1 (1158353), страница 2
Текст из файла (страница 2)
Каждый процессор имеет также внешний номер. ProcNumberext (номер процессора в аппаратурно-программной среде, в которой функционирует система поддержки). Внешний номер опрашивается системой поддержки при ее инициализации с помощью средозависимых средств.
При межпроцессорных обменах в качестве адреса процессора используется его идентификатор ProcIdent. Соответствие
ProcNumberint ≥ ProcIdent
возвращается системе поддержки системой передачи сообщений (Message Passing System) при ее инициализации. Среди процессоров выделенного задаче решающего поля функционально выделены три: главный процессор, процессор ввода/вывода и центральный процессор.
Главный процессор - это первый процессор, на котором была инициализирована параллельная программа (выполняющаяся на нем подзадача рассматривается как исходный инициализатор всех остальных подзадач). Главный процессор имеет нулевой внутренний номер.
Процессор ввода/вывода предназначен для непосредственного общения с файловой системой и стандартно имеет нулевой внутренний номер.
Центральный процессор осуществляет вычисление редукционных функций и стандартно определяется индексным вектором ([PSSize1/2], ... , [PSSizen/2]).
Возможно задание внутренних номеров центрального процессора и процессора ввода/вывода как параметров запуска (нестандартные внутренние номера).
int rtl_GetCurrentProc(void);
Функция возвращает внутренний номер текущего процессора.
int rtl_GetMasterProc(void);
Функция возвращает внутренний номер главного процессора.
int rtl_GetIOProc(void);
Функция возвращает внутренний номер процессора ввода/вывода.
int rtl_GetCentralProc(void);
Функция возвращает внутренний номер центрального процессора.
5.СРЕДСТВА ПЕРЕДАЧИ СООБЩЕНИЙ, НЕЗАВИСИМЫЕ ОТ БАЗОВОЙ СИСТЕМЫ ПЕРЕДАЧИ СООБЩЕНИЙ
Совокупность представленных ниже функций является интерфейсным "срезом" между собственно системой поддержки и используемой ею системой передачи сообщений (MPI, PVM и т.д.) и выходит за рамки средств, предоставляемых системой поддержки программе пользователя. Тем не менее, минимальный средонезависимый набор функций передачи сообщений может оказаться полезным для тестовых и экспериментирующих со средой программ, сопровождающих систему поддержки.
В качестве адреса процессора в рассматриваемых ниже функциях используется внутренний номер процессора, который при непосредственном обращении к функциям системы передачи сообщений заменяется на идентификатор процессора (см.п.4). Логика основных схем передачи сообщений (синхронная, асинхронная и схема "NO WAIT") предполагается известной.
5.1.Синхронный обмен сообщениями
-
Синхронная передача
int rtl_Send(void *MesPtr, int Count, int Size, int ProcNum);
| MesPtr | - указатель на передаваемое сообщение. |
| Count | - число элементов, содержащихся в передаваемом сообщении. |
| Size | - длина в байтах одного элемента передаваемого сообщения. |
| ProcNum | - внутренний номер процессора, которому посылается сообщение. |
Возвращается неотрицательное значение при успешном выполнении функции и отрицательное - в противном случае.
-
Синхронный прием
int rtl_Recv(void *MesPtr, int Count, int Size, int ProcNum);
| MesPtr | - указатель области памяти, в которую необходимо принять сообщение. |
| Count | - число элементов, содержащихся в принимаемом сообщении. |
| Size | - длина в байтах одного элемента принимаемого сообщения. |
| ProcNum | - внутренний номер процессора, сообщение от которого требуется принять. |
Возвращается неотрицательное значение при успешном выполнении функции и отрицательное - в противном случае.
5.2.Асинхронный обмен сообщениями
-
Асинхронная передача
int rtl_SendA(void *MesPtr, int Count, int Size, int ProcNum, int Tag);
| MesPtr | - указатель на передаваемое сообщение. |
| Count | - число элементов, содержащихся в передаваемом сообщении. |
| Size | - длина в байтах одного элемента передаваемого сообщения. |
| ProcNum | - внутренний номер процессора, которому посылается сообщение. |
| Tag | - номер класса передаваемого сообщения (классификация сообщений в компетенции пользователя системы передачи сообщений). |
Возвращается неотрицательное значение при успешном выполнении функции и отрицательное - в противном случае.
-
Асинхронный прием
int rtl_RecvA(void *MesPtr, int Count, int Size, int ProcNum, int Tag);
| MesPtr | - указатель области памяти, в которую необходимо принять сообщение. |
| Count | - число элементов, содержащихся в принимаемом сообщении. |
| Size | - длина в байтах одного элемента принимаемого сообщения. |
| ProcNum | - внутренний номер процессора, сообщение от которого требуется принять. |
| Tag | - номер класса передаваемого сообщения. |
Возвращается неотрицательное значение при успешном выполнении функции и отрицательное - в противном случае.
5.3.Обмен сообщениями в режиме "NO WAIT"
-
Передача в режиме "NO WAIT"
| int rtl_Sendnowait( | void* MesPtr, int Count, int Size, int ProcNum, |
| MesPtr | - указатель на передаваемое сообщение. |
| Count | - число элементов, содержащихся в передаваемом сообщении. |
| Size | - длина в байтах одного элемента передаваемого сообщения. |
| ProcNum | - внутренний номер процессора, которому посылается сообщение. |
| Tag | - номер класса передаваемого сообщения (классификация сообщений в компетенции пользователя системы передачи сообщений). |
| *ReqPtr | - структура-признак, который устанавливается в состояние "заявка выполнена", когда сообщение будет доставлено адресату. |
Возвращается неотрицательное значение при успешном выполнении функции и отрицательное - в противном случае.
-
Прием в режиме "NO WAIT"
| int rtl_Recvnowait( | void* MesPtr, int Count, int Size, int ProcNum, |
| MesPtr | - указатель области памяти, в которую необходимо принять сообщение. |
| Count | - число элементов, содержащихся в принимаемом сообщении. |
| Size | - длина в байтах одного элемента принимаемого сообщения. |
| ProcNum | - внутренний номер процессора, сообщение от которого требуется принять. |
| Tag | - номер класса передаваемого сообщения. |
| *ReqPtr | - структура-признак, который устанавливается в состояние "заявка выполнена", когда сообщение поступит по адресу MesPtr. |
Возвращается неотрицательное значение при успешном выполнении функции и отрицательное - в противном случае.
-
Ожидание завершения передачи или приема
void rtl_Waitrequest(RTL_Request *ReqPtr);
| ProcNum | - внутренний номер процессора, которому было послано сообщение или от которого ожидается сообщение. |
| *ReqPtr | - структура-признак, от которого ожидается состояние "заявка выполнена". |
-
Опрос завершения передачи или приема
int rtl_Testrequest(RTL_Request *ReqPtr);
| ProcNum | - внутренний номер процессора, которому было послано сообщение или от которого ожидается сообщение. |
| *ReqPtr | - структура-признак, от которого ожидается состояние "заявка выполнена". |
Возвращается значение:
| 0 | - пересылка сообщения не завершена (*ReqPtr не установлен в состояние "заявка выполнена"); |
| 1 | - пересылка сообщения завершена (*ReqPtr установлен в состояние "заявка выполнена"). |
5.4.Передача сообщения от заданного процессора всем остальным (широковещательная передача)
void rtl_BroadCast(void *MesPtr, int Count, int Size, int SenderProcNum);
| MesPtr | - указатель на передаваемое сообщение или указатель области памяти, в которую необходимо принять сообщение. |
| Count | - число элементов, содержащихся в сообщении. |
| Size | - длина в байтах одного элемента сообщения. |
| SenderProcNum | - внутренний номер посылающего процессора. |
Функция осуществляет передачу, если внутренний номер текущего процессора равен SenderProcNum, и прием - в противном случае.
6.СИНХРОНИЗАЦИЯ ПРОГРАММ, ВЫПОЛНЯЮЩИХСЯ НА РАЗНЫХ ПРОЦЕССОРАХ
long bsynch_(void);
Выполнение функции заключается в том, что центральный процессор (см.п.4) принимает синхросообщения от всех остальных процессоров, а затем рассылает им синхросообщения-ответы. Любой другой процессор передает синхросообщение центральному процессору, после чего принимает от него синхросообщение-ответ. Синхросообщение - это байт, содержимое которого несущественно.
Функция возвращает нулевое значение.
long tsynch_(void);
Функция tsynch_, как и функция bsynch_, выполняет барьерную синхронизацию процессоров текущей процессорной системы, но дополнительно производит выравнивание времен процессоров. Под выравниванием времен понимаются такие действия системы поддержки, в результате которых функция dvm_time (см.п.3) в один и тот же момент астрономического времени будет возвращать на всех процессорах одно и то же время - время, возвращаемое функцией dvm_time на центральном процессоре задачи до выполнения функции tsynch_ .
Выравнивание времен осуществляется следующим образом. Пусть центральный процессор в момент времени t1 (по своему датчику времени) посылает сообщение процессору P, находящемуся в состоянии приема этого сообщения. Процессор P, получив сообщение от центрального, посылает ему время приема этого сообщения T (по своему датчику времени). Центральный процессор, отослав сообщение процессору P, переходит к приему от него сообщения со временем T и принимает его в момент времени t2 по своему датчику времени. После этого центральный процессор отсылает процессору P время (t1+t2)/2 - T , которое при выполнении им функции dvm_time всегда будет добавляться к показанию его датчика времени.
Такая операция осуществляется центральным процессором со всеми остальными процессорами. Чтобы избежать случайных помех, операция выравнивания времен повторяется несколько раз, и для каждого процессора в качестве результата принимается та величина (t1+t2)/2 - T, для которой время передачи сообщения, равное (t1-t2)/2, минимально.















