| |
Есть две ситуации, которые не могут быть разрешены по требованиям представлений.
Таблица 7.2 Типы данных, определенные для external32
| Тип | Длина | ||
MPI_PACKED |
1 | ||
MPI_BYTE |
1 | ||
MPI_CHAR |
1 | ||
MPI_UNSIGNED_CHAR |
1 | ||
MPI_SIGNED_CHAR |
1 | ||
MPI_WCHAR |
2 | ||
MPI_SHORT |
2 | ||
MPI_UNSIGNED_SHORT |
2 | ||
MPI_INT |
4 | ||
MPI_UNSIGNED |
4 | ||
MPI_LONG |
4 | ||
MPI_UNSIGNED_LONG |
4 | ||
MPI_FLOAT |
4 | ||
MPI_DOUBLE |
8 | ||
MPI_LONG_DOUBLE |
16 | ||
MPI_CHARACTER |
1 | ||
MPI_LOGICAL |
4 | ||
MPI_INTEGER |
4 | ||
MPI_REAL |
4 | ||
MPI_DOUBLE_PRECISION |
8 | ||
MPI_COMPLEX |
2*4 | ||
MPI_DOUBLE_COMPLEX |
2*8 |
| Опциональный тип | Длина | ||
MPI_INTEGER1 |
1 | ||
MPI_INTEGER2 |
2 | ||
MPI_INTEGER4 |
4 | ||
MPI_INTEGER8 |
8 | ||
MPI_LONG_LONG |
8 | ||
MPI_UNSIGNED_LONG_LONG |
8 | ||
MPI_REAL4 |
4 | ||
MPI_REAL8 |
8 | ||
MPI_REAL16 |
16 |
MPI_REGISTER_DATAREP(datarep, read_conversion_fn, write_conversion_fn, dtype_file_extent_fn, extra_state)
IN |
datarep |
Идентификатор представления данных (строка) | |
IN |
read_conversion_fn |
Функция, вызываемая для преобразования из текущего представления файла в исходное (функция) | |
IN |
write_conversion_fn |
Функция, вызываемая для преобразования из текущего представления файла в исходное (функция) | |
IN |
write_conversion_fn |
Функция, вызываемая для преобразования из исходного представления файла в текущее (функция) | |
IN |
dtype_file_extent_fn |
Функция, вызываемая для определения экстента типа данных согласно представленному в файле (функция) | |
IN |
extra_state |
Дополнительное состояние |
int MPI_Register_datarep(char *datarep,
MPI_Datarep_conversion_function *read_conversion_fn,
MPI_Datarep_conversion_function *write_conversion_fn,
MPI_Datarep_extent_function *dtype_file_extent_fn,
void *extra_state)
MPI_REGISTER_DATAREP(DATAREP, READ_CONVERSION_FN, WRITE_CONVERSION_FN,
DTYPE_FILE_EXTENT_FN, EXTRA_STATE, IERROR)
CHARACTER*(*) DATAREP
EXTERNAL READ_CONVERSION_FN, WRITE_CONVERSION_FN,
DTYPE_FILE_EXTENT_FN
INTEGER(KIND=MPI_ADDRESS_KIND) EXTRA_STATE
INTEGER IERROR
void MPI::Register_datarep(const char* datarep,
MPI::Datarep_conversion_function* read_conversion_fn,
MPI::Datarep_conversion_function* write_conversion_fn,
MPI::Datarep_extent_function* dtype_file_extent_fn,
void* extra_state)
Вызов связывает read_conversion_fn, write_conversion_fn и
dtype_file_extent_fn с идентификатором представления данных datarep.
После этого datarep может использоваться как аргумент
MPI_FILE_SET_VIEW, заставляя последующие операции доступа к данным
вызывать функции для преобразования всех элементов данных, к которым
происходит обращение, из текущего представления в исходное, либо
наоборот. MPI_REGISTER_DATAREP - локальная операция и она только
регистрирует представление данных для вызывающего процесса MPI. Если
datarep уже определен, сигнализируется ошибка из класса ошибок
MPI_ERR_DUP_DATAREP, используя заданный по умолчанию обработчик
ошибок файла (см. раздел 7.7). Длина строки представления данных
ограничена значением MPI_MAX_DATAREP_STRING (MPI::MAX_DATAREP_STRING
для С++). MPI_MAX_DATAREP_STRING должно быть достаточно большим -
чтобы представить 64 символа (см. раздел 2.2.8). Не предоставляется
никаких подпрограмм для удаления представления данных и освобождения
привлеченных ресурсов; не ожидается, что прикладная программа будет
генерировать представление данных, привлекая значительные ресурсы.
Экстентные возвратные функции. Ниже приводятся функции, определяющие интерфейс, который должен предоставляться для обеспечения возможности работы с экстентами типов данных согласно представлению файла.
typedef int MPI_Datarep_extent_function(MPI_Datatype datatype,
MPI_Aint *file_extent, void *extra_state);
SUBROUTINE DATAREP_EXTENT_FUNCTION(DATATYPE, EXTENT,
EXTRA_STATE, IERROR)
INTEGER DATATYPE, IERROR
INTEGER(KIND=MPI_ADDRESS_KIND) EXTENT, EXTRA_STATE
typedef MPI::Datarep_extent_function(const MPI::Datatype& datatype,
MPI::Aint& file_extent, void* extra_state);
Функция dtype_file_extent_fn должна вернуть в file_extent,
число байтов, требующихся для того, чтобы сохранить тип данных в
представлении файла. Функция принимает, в extra_state аргумент,
который передается вызову MPI_REGISTER_DATAREP. MPI вызовет эту
подпрограмму только для предопределенных типов данных, используемых
пользователем.
Функции преобразования datarep.
typedef int MPI_Datarep_conversion_function(void *userbuf,
MPI_Datatype datatype, int count, void *filebuf,
MPI_Offset position, void *extra_state);
SUBROUTINE DATAREP .CONVERSION_FUNCTION (USERBUF, DATATYPE, COUNT,
FILEBUF, POSITION, EXTRA-STATE, IERROR)
<TYPE> USERBUF(*), FILEBUF(*)
INTEGER COUNT, DATATYPE, IERROR
INTEGER(KIND=MPI_OFFSET_KIND) POSITION
INTEGER(KIND=MPI_ADDRESS_KIND) EXTRA_STATE
typedef MPI::Datarep_conversion_function(void* userbuf,
MPI::Datatype& datatype, int count, void* filebuf,
MPI::Offset position, void* extra_state);
Функция read_conversion_fn должна преобразовывать представление
данных файла в исходное представление. Перед вызовом этой
подпрограммы MPI распределяет и заполняет filebuf (и count)
последовательностью элементов данных. Тип каждого элемента данных
совпадает с типом элемента соответствующего предопределенного типа
данных, указанного сигнатурой datatype. Функция принимает в
extra_state аргумент, который был передан вызову
MPI_REGISTER_DATAREP. Функция должна копировать все count элементов
данных из filebuf в userbuf согласно распределению, описанному в
datatype, преобразовывая каждый элемент данных файла в исходное
представление. datatype будет эквивалентен типу данных, который
пользователь передал в функцию чтения или записи. Если длина datatype
меньше, чем длина count для элементов данных, функция преобразования
должна обработать datatype как последовательно располагающийся вне
userbuf. Функция преобразования должна начать сохранять
преобразованные данные в userbuf с ``места'', указанного с помощью
position в последовательном datatype.
Совет пользователям: Хотя функции преобразования подобны
MPI_PACK и MPI_UNPACK, нужно обратить внимание на различия в
использовании аргументов count и position. В функциях преобразования:
count - счетчик элементов данных (то есть, счетчик элементов
typemap datatype), а position - индекс этого
typemap. В MPI_PACK, incount ссылается на номер
неделимого datatypes, а position - номер
байта.[]
Совет разработчикам: Операция преобразования при чтении может быть реализована следующим образом:
filebuf достаточного размера для
``удержания'' всех count элементов данных.
filebuf.
read_conversion_fn, чтобы преобразовать данные и
поместить их в userbuf.
filebuf.
Если MPI не в состоянии распределить буфер достаточного размера для
``удержания'' всех данных при преобразовании во время операции
чтения, то он может вызвать функцию, преобразования, многократно
использующую одинаковые datatype и userbuf, и последовательно
читающую ``куски'' данных, подверженных преобразованиям, в filebuf. При
первом вызове (и для случая, когда все данные, которые должны быть
преобразованы, помещаются в filebuf), MPI вызовет функцию с position,
установленной в ноль. Данные, преобразованные в течение этого вызова,
будут сохранены в userbuf соответственно с первым count элементов
данных datatype. Затем, при последующих вызовах функции
преобразования, MPI будет инкрементировать значение position до
значения count элементов, преобразование которых началось предыдущим
вызовом.
Объяснение: Передача функции преобразования позиции и одного
типа данных для передачи позволяют этой функции расшифровать тип
данных только один раз и кэшировать внутреннее представление этого
типа данных. При последующих вызовах функция преобразования может
использовать position для того, чтобы быстро найти нужную позицию в
типе данных и продолжить сохранение преобразуемых данных с того
места, на котором она остановилась по завершении предыдущего вызова. []
Совет пользователям: Хотя функция преобразования может удачно кэшировать внутреннее представление типа данных, она не должна кэшировать никакой информации о состоянии, специфичной для продолжающейся операции, так как возможно конкурентное использование одного и того же типа данных одновременно несколькими операциями преобразования.[]
Функция write_conversion_fn должна преобразовывать представление
данных файла из исходного. Перед вызовом этой подпрограммы MPI
распределяет filebuf, достаточного размера для ``удержания'' всех
count последовательных элементов данных. Тип каждого элемента
данных совпадает с типом элемента соответствующего предопределенного
типа данных, указанного сигнатурой datatype. Функция должна
копировать count элементов данных из userbuf согласно распределению,
описанному в datatype, и последовательно размещать их в filebuf,
преобразовывая каждый элемент данных из исходного представления в
файловое. Если длина datatype меньше, чем длина count для элементов
данных, функция преобразования должна обработать datatype как
последовательно располагающийся вне userbuf.
Функция преобразования должна начать копирование с ``места'' в
userbuf, указанного с помощью position в последовательном datatype.
datatype будет эквивалентен типу данных, который пользователь передал
в функцию чтения или записи. Функция принимает в extra_state
аргумент, который был передан вызову MPI_REGISTER_DATAREP.
Предопределенная константа MPI_CONVERSION_FN_NULL (MPI::MPI
CONVERSION_FN_NULL для С++) может использоваться как
write_conversion_fn или read_conversion_fn. В таком случае, MPI не
будет пытаться вызвать write_conversion_fn или read_conversion_fn,
соответственно, но осуществит требуемый доступ к данным, используя
исходное их представление.
Реализация MPI должна гарантировать, что все доступные данные
преобразованы, любо используя filebuf, достаточного размера для
``удержания'' всех элементов данных, либо иначе, делая повторяющиеся вызовы
функции преобразования с одинаковым аргументом datatype
соответствующими значениями position.
Реализация вызовет только возвратные подпрограммы, описанные в
этой секции
(read_conversion_fn, write_conversion_fn и
dtype_file_extent_fn), когда одна из подпрограмм чтения или записи из
раздела 7.4 или MPI_FILE_GET_TYPE_EXTENT вызывается
пользователем.
dtype_file_extent_fn будет принимать только предопределенные типы
данных, используемые пользователем. Функции преобразования будут
принимать только те типы данных, что эквивалентны переданным
пользователем в одну из подпрограмм, упомянутых выше.
Функции преобразования должны быть повторно входимыми.
Определяемые пользователем представления данных ограничиваются
условием выравнивания по байтам для всех типов. Кроме того, ошибочно
в функциях преобразования вызвать любые коллективные подпрограммы или
освобождать datatype.
Функции преобразования должны возвратить код ошибки. Если
возвращенный код ошибки имеет значение отличное от MPI_SUCCESS,
реализация сигнализирует ошибку в классе MPI_ERR_CONVERSION.
|
Закладки на сайте Проследить за страницей |
Created 1996-2025 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |