Обработка ошибок и выдача диагностических сообщений.

Ошибочные ситуации, возникающие в процессе выполнения программ, вызывающих подпрограммы Комплекса, можно разделить на 3 уровня.

1. Первый уровень представляют ситуации, диагностируемые самими подпрограммами Комплекса, как целевыми, так и базовыми, в частности, подпрограммами (используемого Комплексом) пакета PBLAS (см.).

Во всех целевых и базовых подпрограммах Комплекса имеется параметр INFO, располагаемый последним в списке параметров. INFO предназначен для выдачи диагностики о результатах работы подпрограммы.

Общее правило состоит в том, что в случае успешного завершения работы подпрограммы параметру INFO присваивается значение  0, в случае обнаружения каких - либо ошибок при проверке входных фактических параметров - отрицательное целое значение, а в случае обнаружения в процессе счета ситуации, приводящей к невозможности получения необходимого результата, - положительное целое значение.

Более подробно, в случае обнаружения ошибки в фактическом параметре, параметру INFO присваивается:

Последний случай используется, в основном, для диагностирования ошибок в элементах дескрипторных массивов (или дескрипторов), см."Дескрипторы глобальных массивов".

При диагностировании ошибки во входном параметре вызывается служебная подпрограмма обработки ошибок PXERBLA( ), которая выдает сообщение, содержащее имя подпрограммы, обнаружевшей ошибку, и номер ошибочного параметра, например:

"On entry to PDGESV parameter number 4 had an illegal value".

Обычная версия подпрограммы PXERBLA ( ), сделав выдачу диагностического сообщения, не останавливает выполнение программы. Это делается  из - за того, что некоторые "ошибки" могут быть исправимыми, и пользователю предоставляется возможность продолжить выполнение программы. В случае, если это не устраивает пользователя, он может использовать свой вариант PXERBLA ( ), добавив туда вызов подпрограммы BLACS_ABORT ( ), которая прекратит выполнение программы пользователя.

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

Если же ошибка обнаружена в подпрограмме низкого уровня, она считается неисправимой, PXERBLA ( ) выдает сообщение и выполнение прерывается посредством вызова BLACS_ABORT ( ).

Все целевые и базовые подпрограммы Комплекса выполняют проверку как локальных, так и глобальных входных параметров. Вспомогательные же подпрограммы, как правило, не выполняют проверку входных параметров.

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

Проверка правильности глобальных параметров, передаваемых в подпрограммы PBLAS'а, выполняется в вызывающих процедурах более высокого уровня.

Отсутствие глобальной проверки в подпрограммах PBLAS'а является следствием высокой стоимости (в смысле ухудшения производительности) таких проверок.

Если параметр INFO при выходе из подпрограммы Комплекса имеет значение больше нуля то, как упоминалось в начале п. 1, это означает, что нежелательная ситуация возникла уже после проверки входных параметров, т.е. в процессе счета.

Это бывает по следующим основным причинам:

Например, если используется подпрограмма (PSGESV2) для решения системы уравнений с вещественной матрицей одинарной точности, которая является близкой к вырожденной, может быть зафиксирована явная вырожденность на  i - ой  итерации  LU - факторизации.

В этом случае либо INFO присваивается значение  i,  либо (что более вероятно) может быть вычислена оценка обратного числа обусловленности, которая окажется меньше, чем относительная машинная точность; в этом случае INFO полагается равным  (n + 1).

Если возникла ситуация, когда выдается INFO > 0, управление всегда возвращается в вызывающую подпрограмму, а подпрограмма PXERBLA ( ) не вызывается, и сообщение об ошибке не выдается.

Поэтому при выходе из подпрограммы Комплекса всегда следует проверять значение параметра INFO.

Ошибка с INFO > 0 может получиться, например, в одном из следующих случаев.

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

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

2. Ко второму уровню ошибочных ситуаций, возникающих при выполнении подпрограмм Комплекса, можно отнести ситуации, которые могут быть обработаны подпрограммами пакета BLACS. Реакция BLACS'а на ошибочные ситуации зависит от того, какой отладочный уровень был установлен во время компиляции программы.

Этот уровень устанавливается посредством использования макроса препроцессора языка Си  BlacsDebugLvl.

Чтобы узнать, какой уровень отладки используется в BLACS'е в данном случае, можно использовать подпрограмму  BLACS_GET ( ).

Если установлен уровень  0,  выполняется небольшое количество проверок ошибок (т.е. несколько критических ситуаций). Например, подпрограмма  BLACS_GRIDINIT ( ) не позволит пользователю создать решетку процессов с большим количеством процессов, чем имеется в наличии.

Но большинство параметров BLACS не проверяет,  из - за того, что это приведет к ухудшению производительности.

Поэтому пользователям рекомендуется при связывании своей программы с библиотекой BLACS'а устанавливать при компиляции отладочный уровень  1, до тех пор пока идет процесс отладки программы. При этом проверяется большая часть параметров. Кроме того, выдаются и некоторые другие полезные сообщения. Например, пользователь будет предупрежден, если какой - либо процесс посылает сообщение сам себе. Такая ситуация допустима, однако, свидетельствует о плохом программировании и требует достаточно большого буферного пространства, потому что в этом случае может произойти "зависание" при передаче больших сообщений.

Во многих случаях программа с установленным уровнем отладки 0 будет просто зависать, оставляя разработчика в неведении, что же произошло. Это может быть вызвано, например, попыткой получить сообщение от процесса, который находится вне текущего контекста. При отладочном уровне 1  BLACS может обнаружить такую ошибку пользователя и выдать соответствующее сообщение.

Все сообщения BLACS'а можно разделить на три следующих вида.

а). Предупреждения. BLACS обнаружил нехорошую ситуацию, которую, однако, можно либо исправить, либо проигнорировать. Выдается предупреждающее сообщение с помощью внутренней подпрограммы  BlacsWarn и выполнение программы продолжается.

Сообщение выдается в виде:

BLACS WARNING  'текст сообщения'
from {‹p›,‹q›},  pnum = ‹pnum›,  Contxt = ‹ictxt›,  on line ‹#›  of file  '‹fname›', 
здесь 
{‹p›, ‹q›} - координаты процесса, выдавшего сообщение, в решетке процессов;
‹pnum› - номер процесса, выдаваемый как выходное значение первого параметра подпрограммой BLACS_PINFO;
‹ictxt› - целое значение контекста. Обратите внимание на то, что это значение не является одинаковым для всех процессов решетки. Например, процесс {0, 0} может иметь ictxt = 0, а процесс {0, 1} имеет ictxt = 1 для того же самого контекста. Однако, ‹pnum› и ‹ictxt› вместе обеспечивают однозначную идентификацию процесс/контекст;
‹#› - номер строки в файле с именем ‹fname›, который выдает сообщение;
‹fname› - имя файла, в котором содержится подпрограмма, выдавшая сообщение.

б). Ошибки. BLACS обнаружил ошибку. Выдается сообщение об ошибке посредством внутренней подпрограммы  BlacsErr, и выполнение программы останавливается посредством вызова подпрограммы  BLACS_ABORT ( ). Сообщение при этом выдается в таком же виде, как и в случае предупреждения, за исключением того, что слова  BLACS WARNING заменяются на слова  BLACS ERROR.

Не вся указанная информация может иметься в наличии в момент выдачи диагностического сообщения. Например, если ошибка выдается до того, как была создана решетка процессов, координаты процесса в решетке будут недоступны. Для любого значения, которое BLACS не может изобразить, выдается значение - 1, указывающее, что оно неизвестно.

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

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

в). Системная ошибка. BLACS получил сообщение об ошибке от операционной системы. Он передает его пользователю и завершает выполнение программы.

3. К третьему уровню ошибок, относятся системные ошибки.

При работе с подпрогрммами Комплекса иногда могут возникать сообщения об ошибках, передаваемые операционной системой. В предыдущем п.2 описана реакция BLACS'а на эту ситуацию.

Эти сообщения будут зависеть от конкретной операционной системы и используемой на ней версии BLACS'а. Для того, чтобы понять сообщение, пользователю может потребоваться документация от производителей или просмотр страниц руководства на экране (manpages), описывающих системные сообщения об ошибках.

Например, если используется PVM BLACS, будет выдан номер ошибки в стиле PVM. Тогда для понимания сообщения об ошибке, т.е. перевода номера сообщения в соответствующий текст, может потребоваться, например, краткое руководство по PVM.