Самому по себе серверу доступны две процедуры. Во-первых, он может вызвать MPI_OPEN_PORT для установки порта, по которому к нему можно получить доступ. Во-вторых, он должен вызывать MPI_COMM_ACCEPT для приема соединения с клиентом.
IN | info | Информация, специфичная для реализации об установке адреса (дескриптор) | |
OUT | port_name | Новый установленный порт (строка) |
int MPI_Open_port(MPI_Info info, char *port_name)
MPI_OPEN_PORT (INFO, PORT_NAME, IERROR)
CHARACTER* ( * ) PORT_NAME
INTEGER INFO, IERROR
void MPI::Open_port(const MPI::Info& info, char* port_name)
Эта функция устанавливает сетевой адрес, кодируя его в строку port_name, по которому сервер в состоянии принимать соединения от клиентов. port_name поддерживается системой, возможно используя информацию аргумента info.
MPI копирует имя порта, поддерживаемое системой, в port_name. Аргумент port_name определяет вновь открываемый порт и может использоваться клиентом для контакта с сервером. С помощью MPI_MAX_PORT_NAME (MPI::MAX_PORT_NAME в С++) определяется максимальный размер строки, которая может поддерживаться системой.
Совет пользователям: Система копирует имя порта в port_name. Приложение должно иметь буфер соответствующего размера для хранения этого значения.[]
Имя порта - это сетевой адрес. Он является уникальным для коммуникационного пространства, к которому он относится (определяется реализацией) и может использоваться любым клиентом коммуникационного пространства. В частности, если это Internet-адрес (host:port), он должен быть уникальным в Internet. Если это низкоуровневый адрес коммутатора в IBM SP, он будет уникальным для этого SP.
Совет разработчикам: Эти примеры не предназначены для ограничения
реализации.
port_name, в частности, может содержать имя
пользователя или имя пакетной задачи, пока оно является уникальным в
некотором четко определенном пространстве коммуникации. Чем больше
пространство коммуникации, тем более полезной будет функциональность
клиент/сервер в MPI.[]
Точная форма адреса определяется реализацией. В частности, Internet-адрес может быть именем машины, или IP-адресом, или любым значением, которое реализация может декодировать в IP-адрес. Имя порта может использоваться повторно после его освобождения через MPI_CLOSE_PORT и освобождения системой.
Совет разработчикам: Поскольку пользователь может набрать port_name ``вручную'', полезно выбирать форму, которая легко читается и не имеет вложенных пробелов.[]
Можно использовать info, чтобы сообщить реализации, как устанавливать адрес. Это может быть и обычно бывает MPI_INFO_NULL, чтобы получить значение по умолчанию для реализации. Зарезервированных ключей не существует.
IN | port_name | Порт (строка) |
int MPI_Close_port (char *port_name)
MPI_CLOSE_PORT(PORT_NAME, IERROR)
CHARACTER*(*) PORT_NAME
INTEGER IERROR
void MPI::Close_port(const char* port_name)
Эта функция освобождает сетевой адрес, представленный port_name.
IN | port_name | Имя порта (строка, используется только root) | |
IN | info | Информация, зависящая от реализации (дескриптор, используется только root) | |
IN | root | Ранг в comm для узла root (целое) | |
IN | comm | Интракоммуникатор, внутри которого выполняется коллективный вызов (дескриптор) | |
OUT | newcomm | Интеркоммуникатор с клиентом в качестве удаленной группы (дескриптор) |
int MPI_Comm_accept(char *port_name, MPI_Info info, int root,
MPI_Comm comm, MPI_Comm *newcomm)
MPI_COMM_ACCEPT (PORT_NAME, INFO, ROOT, COMM, NEWCOMM, IERROR)
CHARACTER*(*) PORT_NAME
INTEGER INFO, ROOT, COMM, NEWCOMM, IERROR
MPI::Intercomm MPI::Intracomm::Accept(const char* port_name,
const MPI::Info& info, int root) const
MPI_COMM_ACCEPT устанавливает соединение с клиентом. Это коллективная
операция посредством вызывающего коммуникатора. Она возвращает
интеркоммуникатор, позволяющий установить
связь с клиентом.
port_name должно быть установлено через вызов MPI_OPEN_PORT.
Аргумент info является строкой, определяемой реализацией, позволяющей точный контроль над вызовом MPI_COMM_ACCEPT.
Отметьте, что MPI_COMM_ACCEPT является блокирующим вызовом. Пользователь может реализовать неблокирующий доступ, помещая MPI_COMM_ACCEPT в отдельный поток.