next up previous contents
Next: Проблемы реализации Up: Термины и соглашения в Previous: Процессы   Contents

Обработка ошибок

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

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

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

Несколько факторов ограничивают возможности для вызовов MPI возвращать важные коды ошибок, когда ошибка имеет место. Например, MPI может быть не в состоянии определить некоторые ошибки; выявление других ошибок в нормальном режиме слишком дорого; наконец, некоторые ошибки могут быть ``катастрофическими'' и будут препятствовать MPI возвратить управление в исходное состояние.

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

Этот документ не описывает состояние вычислений после того, как имел место вызов с ошибкой. Желательно, чтобы был возвращен код ошибки и эффект ошибки был локализован на участке наименьшего размера. Например, крайне желательно, чтобы ошибочный вызов приема не приводил к модификации любой части памяти принимающего процесса за пределами области, указанной для приема сообщения.

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



Alex Otwagin 2002-12-10