Семантика непротиворечивости определяет последствия множественного доступа к одному файлу. Все доступы к файлам в MPI выполняются относительно определенного дескриптора файла, созданного при коллективном открытии. MPI предоставляет три уровня непротиворечивости: последовательная непротиворечивость среди всех попыток доступа с использованием одного дескриптора файла; последовательная непротиворечивость среди всех попыток доступа с использованием дескрипторов файла, созданных при едином коллективном открытии с разрешенной атомарной моделью; и непротиворечивость, вводимая пользователем среди попыток доступа иных, чем указанные выше.
Совокупность операций доступа к данным последовательно непротиворечива, если она ведет себя так, как будто операции были выполнены последовательно в порядке, соответствующем порядку программы - каждая попытка доступа выглядит атомарной, несмотря на то, что точный порядок попыток доступа неопределен. Непротиворечивость, вводимая пользователем, может быть получена с использованием программного порядка и вызовов MPI_FILE_SYNC.
Пусть FH1 будет множеством дескрипторов файлов, созданных в результате одного коллективного открытия файла foo, а FH2 будет множеством дескрипторов файлов, созданных в результате другого коллективного открытия файла foo. Отметьте, что для FH1 и FH2 не указано никаких ограничений: размеры FH1 и FH2 могут быть различны; группы процессов, используемых для каждого открытия, могут пересекаться; дескрипторы файлов в FH1 могут быть уничтожены, прежде чем будут созданы дескрипторы файлов в FH2, и т.д. Мы рассмотрим три следующих случая: один дескриптор файла (например, fh1 FH1); два дескриптора файлов, созданные из единого коллективного открытия (например, fh1a FH1 и fh1b FH1); и два дескриптора файлов, созданные при различных коллективных открытиях (например, fh1 FH1 и fh2 FH2).
Для целей семантики непротиворечивости совпадающая пара (раздел 7.4.5) раздельных коллективных операций доступа к данным (MPI_FILE_READ_ALL_BEGIN и MPI_FILE_READ_ALL_END, например) создают одну операцию доступа к данным. Подобным образом, неблокирующая процедура доступа к данным например, MPI_FILE_IREAD и процедура, которая завершает запрос (например, MPI_WAIT) также создают одну операцию доступа к данным. Для всех случаев, описанных ниже, эти операции доступа к данным являются объектом тех же ограничений, что и блокирующие операции доступа к данным.
Совет пользователям: Для пары MPI_FILE_IREAD и MPI_WAIT операция начинается, когда вызывается MPI_FILE_IREAD и заканчивается при завершении MPI_WAIT.[]
Пусть и - операции доступа к данным. Пусть - множество абсолютных байтовых перестановок для каждого байта, доступного в . Две попытки доступа к данным перекрываются, если . Две попытки доступа к данным конфликтуют, если они перекрываются и как минимум одна является попыткой записи.
Пусть SEQfh является последовательностью операций с файлом для одного дескриптора файла, ограниченной MPI_FILE_SYNC для этого дескриптора. (И открытие, и закрытие файла неявно выполняют MPI_FILE_SYNC). SEQfh является ``записывающей последовательностью'', если любая операция доступа к данным в последовательности записывает в файл, или любая из операций манипуляции с файлом в последовательности изменяет состояние файла (например, MPI_FILE_SET_SIZE и MPI_FILE_PREALLOCATE). Две последовательности SEQ1 и SEQ2 или две операции и являются параллельными, если одна из них может начаться до завершения другой.
Требования для гарантированной последовательной непротиворечивости среди всех операций доступа к определенному файлу делятся на три группы, описанные ниже. Если любое из этих требований не выполняется, то значение всех данных в этом файле зависит от реализации.
Случай 1: fh1 FH1: Все операции над fh1 последовательно непротиворечивы, если установлен атомарный режим. Если атомарный режим не установлен, то все операции над fh1 последовательно непротиворечивы, если они либо параллельны, либо не конфликтуют, либо и то, и другое.
Случай 2: fh1a FH1 и fh1b FH1: Пусть - операция доступа к данным, использующая fh1a, а - операция доступа к данным, использующая fh1b. Если не конфликтует с , MPI гарантирует, что эти операции последовательно непротиворечивы.
Однако, в противоположность семантике POSIX, семантика MPI для конфликтующих попыток доступа по умолчанию не гарантирует последовательной непротиворечивости. Если и конфликтуют, последовательная непротиворечивость гарантируется либо установкой атомарного режима через процедуру MPI_FILE_SET_ATOMICITY, либо удовлетворением условий, описанных в случае 3.
Случай 3: fh1 FH1 и fh2 FH2: Записывающая последовательность SEQ1 над fh1 и другая последовательность SEQ2 над fh2 гарантированно будут последовательно непротиворечивы, если они не параллельны, или если fh1 и fh2 ссылаются на различные файлы. Другими словами, MPI_FILE_SYNC должна использоваться вместе с механизмом, гарантирующим непараллельность последовательностей.
См. примеры в разделе 7.6.10 для дальнейших пояснений этой семантики непротиворечивости.
INOUT | fh | Дескриптор файла (дескриптор) | |
IN | flag | true для установки атомарного режима, false для отмены атомарного режима (логическая) |
intMPI_File_set_atomicity(MPI_File fh, int flag)
MPI_FILE_SET_ATOMICITY(FH, FLAG, IERROR)
INTEGER FH, IERROR
LOGICAL FLAG
void MPI::File::Set_atomicity(bool flag)
Пусть FH будет множеством дескрипторов файлов, созданных одной операцией коллективного открытия. Семантика непротиворечивости операций доступа к данным, использующих FH, будет набором коллективно вызванных MPI_FILE_SET_ATOMICITY над FH. MPI_FILE_SET_ATOMICITY коллективна; все процессы в группе должны передавать идентичные занчения для fh и flag. Если flag имеет значение true, устанавливается атомарный режим; если flag имеет значение false, атомарный режим отменяется.
Изменение семантики непротиворечивости для открытого файла отражается только на новых попытках доступа к данным. Все завершенные попытки доступа к данным гарантированно придерживаются семантики непротиворечивости, действовавшей во время их выполнения. Неблокирующие попытки доступа к данным и разделенные коллективные операции, которые еще не завершились (например, из-за MPI_WAIT) гарантируют только соблюдение семантики непротиворечивости неатомарного режима.
Совет разработчикам: Поскольку семантика, гарантируемая атомарным режимом жестче, чем семантика, гарантируемая неатомарным режимом, реализация свободна придерживаться для невыполненных запросов более строгой семантики атомарного режима. []
IN | fh | Дескриптор файла (дескриптор) | |
INOUT | flag | true при атомарном режиме, false при неатомарном режиме (логическая) |
int MPI_File_get_atomicity(MPI_File fh, int *flag)
MPI_FILE_SET_ATOMICITY(FH, FLAG, IERROR)
INTEGER FH, IERROR
LOGICAL FLAG
bool MPI::File::Get_atomicity() const
MPI_FILE_GET_ATOMICITY(fh, flag) возвращает текущее значение семантики непротиворечивости для операций доступа к данным над множнеством дескрипторов файлов, полученным в результате единого коллективного открытия. Если flag имеет значение true, установлен атомарный режим; если flag имеет значение false, атомарный режим отменен.
INOUT | fh | Дескриптор файла (дескриптор) |
int MPI_File_sync(MPI_File fh)
MPI_FILE_SYNC(FH, IERROR)
INTEGER FH, IERROR
void MPI::File::Sync()
Вызов MPI_FILE_SYNC для fh вызывает передачу всех предыдущих попыток записи для fh, инициированных процессом, на запоминающее устройство. Если другие процессы обновляли информацию на запоминающем устройстве, то все обновления станут видимыми при последовательном чтении вызывающим процессом fh. MPI_FILE_SYNC должен обязательно обеспечивать последовательную непротиворечивость в определенных случаях (см. выше).
MPI_FILE_SYNC является коллективной операцией.
Пользователь отвечает за обеспечивание того, чтобы все неблокирующие и раздельные коллективные операции над fh завершились перед вызовом MPI_FILE_SYNC - в противном случае вызов MPI_FILE_SYNC приведет к ошибке.