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

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

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

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

В языке Си и ФОРТРАН почти все вызовы MPI возвращают код, который указывает на успешное завершение операции. Всякий раз, когда возможно, вызовы MPI возвращают код ошибки, если ошибка произошла в течение вызова. По умолчанию, ошибка, обнаруженная во время выполнения библиотеки MPI, заставляет параллельные вычисления прерываться, за исключением операции с файлом. Однако, MPI обеспечивает механизмы для пользователей, чтобы изменить это значение по умолчанию и обрабатывать восстанавливаемые ошибки. Пользователь сам может определить, что никакая ошибка не фатальна, и соответствующие коды ошибки возвращены вызовами MPI. Также, пользователь может обеспечить свои собственные подпрограммы обработки ошибок, которые будут вызваны всякий раз, когда вызов MPI завершен неправильно. Средства обработки ошибок MPI описаны в Главе 7 документа MPI-1 и в Разделе 4.13 данного документа. Возвращаемые значения функций С++ не являются кодами ошибки. Если заданный по умолчанию обработчик ошибки был установлен в MPI::ERRORS_THROW_EXCEPTIONS, используется механизм исключения С++, чтобы сообщить об ошибке возбуждения объекта MPI::Exception.

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

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

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

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

MPI-2 определяет способы для пользователей, чтобы создать новые коды ошибки, как определено в Разделе 8.5.



Alex Otwagin 2002-12-10