next up previous contents
Next: Классы ошибок, коды ошибок Up: Внешние интерфейсы Previous: Ассоциирование информации со статусом   Contents

Именование объектов

Есть много случаев, в которых было бы полезно позволить пользователю ставить в соответствие ``читаемый'' идентификатор MPI-коммуникатора, окна, или типа данных, например, при информировании об ошибках, отладке или профилировании. Такие имена не должны дублироваться, когда объект дублируется или копируется MPI подпрограммами. Для коммуникаторов эти функциональные возможности обеспечиваются следующими двумя функцииями.

MPI_COMM_SET_NAME(comm, comm_name)

INOUT comm Коммуникатор, чей идентификатор устанавливается (указатель)  
IN comm_name Строка символов, которая запоминается как имя (строка)  

int MPI_Comm_set_name(MPI_Comm comm, char *comm_name)

MPI_COMM_SET_NАМЕ (COMM, COMM_NAME, IERROR) INTEGER COMM, IERROR CHARACTER*(*) COMM_NAME

void MPI::Comm::Set_name (const char* comm_name)

MPI_COMM_SET_NAME позволяет пользователю поставить в соответствие строку с именем коммуникатору. Символьная строка, которая передается в MPI_COMM_SET_NAME будет сохранена в библиотеке MPI (так что она может быть освобождена тем, кто сделал вызов, сразу после вызова или распределена в стеке). Пробелы в начале имени являются значимыми, но в конце - нет.

MPI_COMM_SET_NAME - локальная (неколлективная) операция, которая затрагивает только имя коммуникатора, как указано в процессе, который сделал вызов MPI_COMM_SET_MAME. Нет требования, чтобы тот же самое (или любое другое) имя было ассоциировано с коммуникатором в каждом процессе, где он существует.

Совет пользователям: С той поры, как MPI_COMM_SET_NAME применен для облегчения отладки кода, важно дать то же самое имя коммуникатору во всех процессах, где он существует для избежания ``беспорядка''.

Число символов, которые могут быть сохранены, - по крайней мере 64 и ограничено значением MPI_MAX_OBJECT_NAME для ФОРТРАНa и MPI_MAX_OBJECT_NAME-1 для Си и С++ (где константа известна как MPI::MAX_OBJECT_NAME) для учета нулевого признака конца (см. секцию 2.2.8). Попытка задания имени длиннее, чем оговорено, приведет к усечению имени.

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

Совет разработчикам: Реализации, в которых предварительно распределяется пространство фиксированного размера для имени, должны использовать длину при таком распределении, как значение MPI_MAX_OBJECT_NAME. Реализации, в которых для имен распределяется пространство в куче, должны как и прежде определять MPI_MAX_OBJECT_NAME как относительно маленькое значение; после этого пользователь должен распределять пространство для строки с длиной менее этой величины когда вызывает MPI_COMM_GET_NAME.

MPI_COMM_GET_NAME(comm, comm_name, resultlen)

IN comm Коммуникатор, чье имя возвратится (указатель)  
OUT comm_name Имя, предварительно данное коммуникатору, или пустая строка, если такового имени не существует (строка)  
OUT resultlen Длина возвращаемого имени (целое)  

int MPI_Conm_get_name(MPI_Comm comm, char *comm_name, int *resultlen)

MPI_COMM_GET_NAME(COMM, СОММ_NАМЕ, RESULTLEN, IERROR) INTEGER COMM, RESULTLEN, IERROR CHARACTER*(*) COMM_NAME

void MPI::Comm::Get_name(char* comm_name, int& resultlen) const

MPI_COMM_GET_NAME возвращает последнее имя, которое перед этим было связано с данным коммуникатором. Имя может устанавливаться по правилам любого языка. Одно и то же имя будет возвращено независимо от используемого языка, имя должно быть распределено так, чтобы оно могло включать строку длиной из MPI_MAX_OBJECT_NAME символов. MPI_COMM_GET_NAME возвращает копию установленного имени в name.

Если пользователь не связал имя с коммуникатором или произошла ошибка, MPI_COMM_GET_NAME вернет пустую строку (все пробелы - в ФОРТРАНe, " " - в Си и С++). Предопределенные коммуникаторы будут иметь предопределенные имена, связанные с ними. Так, имена для MPI_COMM_WORLD, MPI_COMM_SELF и коммуникатора, возвращенного MPI_COMM_GET_PARENT будут по умолчанию
MPI_COMM_WORLD, MPI_COMM_SELF, и MPI_COMM_PARENT, соответственно. Фактически, система, имея возможность дать имя по умолчанию коммуникатору, не препятствует пользователю установить имя для того же самого коммуникатора; выполнение такого действия удаляет старое имя и назначает новое.

Объяснение: MPI предоставляет отдельные функции для задания и получения имени коммуникатора, а не просто обеспечение предопределенным ключевым атрибутом по следующим причинам:

Совет пользователям: Вышеупомянутое определение означает, что можно уверенно просто выводить строку, возвращенную MPI_COMM_GET_NAME, поскольку это - всегда достоверная строка, даже если она не содержит имени.

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

Следующие функции используются для задания и получения имен типов данных.

MPI_TYPE_SET_NAME(type, type_name)

INOUT comm Тип данных, чей идентификатор задается (указатель)  
IN type_name Символьная строка, которая запоминается как имя (строка)  

int MPI_Type_set_name(MPI_Datatype type, char *type_name)

MPI_TYPE_SET_NАМЕ (TYPE, TYPE_NАМЕ, IERROR) INTEGER TYPE, IERROR CHARACTER*(*) TYPE_NAME

void MPI::Datatype::Set_name(const char* type_name)

MPI_TYPE_GET_NAME(type, type_name, resultlen)

IN type Тип данных, чье имя возвратится (указатель)  
OUT type_name Имя, предварительно данное типу данных, или пустая строка, если такового имени не существует (строка)  
OUT resultlen Длина возвращаемого имени (целое)  

int MPI_Type_get_name(MPI_Data_type type, char *type_name, int *resultlen)

MPI_TYPE_GET_NАМЕ (TYPE, TYPE_NАМЕ, RESULTLEN, IERROR) INTEGER TYPE, RESULTLEN, IERROR CHARACTER*(*) TYPE_NАМЕ

void MPI::Datatype::Get_name(char* type_name, int& resultlen) const

Предопределенные типы данных имеют заданные по умолчанию имена. Например, MPI_WCHAR имеет заданное по умолчанию имя MPI_WCHAR.

Следующие функции используются для задания и получения имен окон.

MPI_WIN_SET_NAME(win, win_name)

INOUT win Окно, чей идентификатор устанавливается (указатель)  
IN win_name Символьная строка, которая запоминается как (строка)  

int MPI_Win_set_name(MPI_Win win, char *win_name)

MPI_WIN_SET_NAME(WIN, WIN_NАМЕ, IERROR) INTEGER WIN, IERROR CHARACTER*(*) WIN_NAME

void MPI::Win::Set_name(const char* win_name)

MPI_WIN_GET_NAME(win, win_name, resultlen)

IN win Окно, чье имя возвращается (указатель)  
OUT win_name Имя, предварительно данное окну, или пустая строка, если такового имени не существует (строка)  
OUT resultlen Длина возвращаемого имени (строка)  

int MPI_Win_get_name(MPI_Win win, char *win_name, int *resultlen)

MPI_WIN_GET_NAME(WIN, WIN_NAME, RESULTLEN, IERROR) INTEGER WIN, RESULTLEN, IERROR CHARACTER*(*) WIN_NAME

void MPI::Win::Get_name(char* win_name, int& resultlen) const


next up previous contents
Next: Классы ошибок, коды ошибок Up: Внешние интерфейсы Previous: Ассоциирование информации со статусом   Contents
Alex Otwagin 2002-12-10