Есть много случаев, в которых было бы полезно позволить пользователю ставить в соответствие ``читаемый'' идентификатор 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