Отладка DVM–программ |
DVM-система (на русском) |
Документация |
- дата последнего обновления 21.06.11 -
Оглавление
4 Динамический контроль DVM-указаний
5 Сравнение результатов выполнения
6 Средства накопления и анализ системной трассировки
8.1 Опции конверторов, управляющие режимами работы программ
8.2 Опции конверторов для DVM-отладчика
8.3 Опции конверторов для анализа производительности
10.1 Протокол с сообщениями об ошибках
10.1.1 Протокол динамического контроля корректности
10.1.2 Протоколы сравнительной отладки
10.2.2 Результирующий протокол со скачками
10.3 Kонфигурационный файл трассировки
11 Cообщения DVM-отладчика на стандартный вывод
11.1 Динамический контроль корректности
12 Диагностические сообщения DVM-отладчика в протоколах
12.1 Сообщения при динамическом контроле корректности
12.2 Сообщения при сравнительной отладке
12.2.1 Ошибки при выполнении программы
12.2.3 Ошибки при сравнении трасс
13 Методика отладки DVM-программ
13.1 Оценка объема трассировки
13.2 Управление объемом файла трассировки
13.2.3 Сокращение файла трассировки при помощи параметра
13.3 Последовательность команд для отладки DVM- программ
13.4 Команда комплексного прогона одной программы последовательно через все шаги отладки
13.5 Запуск программ с нестандартным набором параметров
14.1 Параметры динамического контроля
14.2 Параметры накопления и сравнения трассировки вычислений
14.4 Параметры управления системной трассировкой
14.4.1 Включение и выключение трассировки
14.4.2 Задание открытых (включенных) потоков трассировки
14.4.3 Задание режимов трассировки
14.4.4 Управление формой накапливаемой информации
15 Сообщения об ошибках системы поддержки
15.1 Ошибки запуска и завершения
15.2 Ошибки вида "... is not a DVM object"
15.3 Ошибки вида "[the object] is not a/the …"
15.4 Ошибки вида "… is not a subsystem of the current/parental PS"
15.8 Ошибки индексации и значений
15.9 Другие семантические ошибки
15.10 Ошибки запроса памяти и количества объектов
15.11 Ошибки нижнего уровня передачи сообщений
16 Структура файла системной трассировки
Языки C-DVM и Fortran-DVM (в дальнейшем F-DVM) предназначены для разработки мобильных и эффективных параллельных программ для ЭВМ различной архитектуры. Они являются расширениями стандартных языков C и Fortran 90. Параллельная программа представляет собой обычную последовательную программу, в которую вставлены DVM-указания, определяющие ее параллельное выполнение. DVM-указания прозрачны для стандартных компиляторов, поэтому DVM-программа обрабатывается ими как обычная последовательная программа.
Для отладки DVM-программ предлагается следующий подход.
Сначала программа отлаживается на рабочей станции как обычная последовательная программа (в режиме игнорирования DVM-указаний) с использованием привычных средств отладки. Затем на рабочей станции программа запускается в специальном режиме динамического контроля DVM-указаний, что позволяет выявить их правильность и полноту. На следующем этапе программа может быть запущена на параллельной машине или кластере рабочих станций (или на рабочей станции с имитацией параллельного выполнения) в режиме сравнения ее промежуточных результатов с эталонными, полученными, например, при ее последовательном выполнении. Кроме того, для локализации ошибок при параллельном выполнении программы служат средства накопления трассировочной информации.
DVM-программа – это один или несколько файлов с исходными текстами на языках C-DVM или F-DVM, имеющими соответственно расширения .cdv и .fdv.
Получение готовой программы (выполняемого файла) осуществляется в три этапа:
конвертация C-DVM или F-DVM программы в C- или Fortran-программу с получением одноименного файла (файлов) с расширениями соответственно .c или .f;
компиляция полученного на предыдущем этапе файла (файлов) стандартными компиляторами с языков С или Fortran;
связывание полученного объектного модуля (модулей) с библиотеками программ, используемых пользователем (если есть), и с библиотекой Lib-DVM – системой поддержки выполнения параллельных DVM-программ.
DVM-программа может содержать ошибки разного рода. Эти ошибки можно разбить на несколько классов по степени их влияния на работоспособность программы, по легкости выявления и т.д.
В общем случае можно выделить следующие пять классов ошибок:
Ошибки в последовательной программе.
Синтаксические ошибки в DVM-указаниях (неправильная запись оператора, отсутствие скобки и т.д.), а также нарушение статической семантики.
Неправильная последовательность выполнения DVM-указаний или неправильные параметры DVM-указаний.
Неправильное выполнение вычислений из-за некорректности DVM-указаний и ошибок, не проявляющихся при последовательном выполнении программы.
Аварийное завершение параллельного выполнения программы (авосты, зацикливания, зависания) из-за некорректности DVM-указаний и ошибок, не проявляющихся при последовательном выполнении программы.
Ошибки первого класса диагностируются:
стандартными компиляторами с языков С или Fortran при компиляции в режиме игнорирования DVM-указаний (см. п.9);
средствами отладки, принятыми для обычных последовательных программ.
Ошибки второго класса диагностируются при конвертации C-DVM или F-DVM программ (см.п.8 и п.9). Список диагностических сообщений приведен в руководствах по использованию компиляторов (конверторов) C-DVM и Fortran-DVM.
Ошибки третьего класса диагностируются системой поддержки при параллельном выполнении программы: функции библиотеки проверяют корректность порядка выполнения DVM-указаний и передаваемых параметров (об ошибках, диагностируемых функциями Lib-DVM, см. в п.15.1).
Ошибки четвертого класса выявляются DVM-отладчиком при:
запуске DVM-программы на одном процессоре в режиме динамического контроля (см.п.4);
запуске DVM-программы на одном или нескольких процессорах в режиме сравнения результатов ее параллельного выполнения с эталонными результатами, полученными при ее последовательном выполнении (см.п.5).
Ошибки пятого класса могут быть выявлены при:
анализе трассировки вычислений при параллельном выполнении программы (см.п.5);
анализе накопленной системной трассировки - трассировки вызовов функций Lib-DVM (см.п.6).
Динамический контроль DVM-указаний позволяет проверить корректность распараллеливания программы посредством DVM-указаний, и основан на моделировании параллельного выполнения DVM-программы во время ее последовательного выполнения на одном процессоре.
Для динамического контроля программы ее следует сначала скомпилировать в режиме получения отладочного варианта параллельной программы (см.п.8 и п.9).
Однако использование данного метода существенно замедляет выполнение программы и требует больших объемов дополнительной памяти. Поэтому, его следует применять только для программы со специально подобранными тестовыми данными.
Динамический контроль позволяет обнаружить следующие ошибки:
Обращение к неинициализированной переменной.
Обращение к неинициализированному элементу распределенного массива.
Обращение к нелокальному элементу массива.
Обращение к редукционной переменной до завершения операции редукции;
Запись в теневой элемент массива.
Зависимость параллельного цикла по данным.
Использование теневого элемента распределенного массива во время выполнения операции обновления теневых граней.
Использование нелокального элемента распределенного массива в последовательной части программы.
Ожидание завершения редукции без ее фактического запуска.
Обращение к элементу массива за пределами его границ.
Отсутствие операции ожидания завершения асинхронной редукции для соответствующей операции старта асинхронной редукции.
Отсутствие операции старта асинхронной редукции при спецификации редукционной переменной.
Отсутствие ошибок при динамическом контроле не гарантирует правильной работы параллельной программы по следующим причинам:
динамический контроль не проверяет правильность описания редукционных операций;
источником ошибок могут быть процедуры, вызываемые из DVM-программ, но написанные на других языках и не подлежащие динамическому контролю;
отлаженная последовательная программа может содержать ошибки, которые не проявились при ее последовательном выполнении, но могут проявиться при параллельном выполнении.
Для поиска таких ошибок используется метод накопления и сравнения трассировок вычислений, который позволяет определить место в программе и момент, когда появляются расхождения в результатах вычислений.
При трассировке вычислений выполняется сбор информации обо всех чтениях и модификациях переменных, о начале выполнения каждого витка цикла, о начале и конце выполнения параллельного цикла, о начале выполнения каждой параллельной задачи, о начале и конце выполнения группы задач.
Трассировка вычислений, как и динамический контроль, требовательна к ресурсам вычислительной системы. Поэтому рекомендуется сначала трассировать программы с тестовыми данными, а затем уже переходить к реальным данным. Однако при выполнении программ с реальными данными не всегда можно собрать трассировку в полном объеме из-за ее больших размеров. В этом случае перед накоплением трассировки следует оценить ее объем как для всей программы в целом, так и для отдельных ее частей.
Степенью подробности (а значит и объемом) трассировки можно управлять:
при конвертации программы опциями C-DVM и F-DVM конверторов (см.п.8);
при выполнении программы с помощью параметров трассировки (см.п.13.2);
Системная трассировка (трассировка вызовов функций системы поддержки) позволяет проследить последовательность вызовов функций, их параметры (см.п.13.2) и времена выполнения. Имеется два основных способа сбора системной трассировки (см.п.14.4):
буферизация в оперативной памяти каждого процессора с последующей записью в файл при нормальном завершении программы (запись в файл производится на процессоре ввода-вывода);
запись в файлы без буферизации на каждом процессоре (с возможностью выталкивания информации о каждом событии из буферов операционной системы).
Степень подробности трассировки управляется параметрами (см.п.14.4). При этом следует помнить, что для трассировки некоторых часто вызываемых функций системы поддержки она должна быть скомпилирована в специальном режиме, задаваемом переменными периода компиляции. Полный список трассируемых событий приведен в файле events.def в директории dvm_sys/rts/src DVM-системы, в котором имени каждого события сопоставлен его номер.
Трассируются также все информационные сообщения системы поддержки и все сообщения об обнаруженных ею ошибках.
Файлы с системной трассировкой имеют текстовый формат (см.п.16) и могут анализироваться с помощью обычных редакторов и визуализаторов.
DVM-система настраивается на окружение пользователя в два этапа:
перед инсталляцией настраивается файл, запускающий инсталляцию DVM-системы (см. Техническое руководство по установке DVM-системы);
после инсталляции, но перед началом работы с задачами пользователя настраивается файл запуска dvm-команд, который пользователь предварительно переписывает в свою рабочую директорию из директории dvm_sys/user DVM-системы.
В файле запуска dvm-команд определены следующие переменные окружения, которые могут быть изменены пользователем:
dvmdir |
- |
полное имя (с путем) директории, в которой расположена DVM-система (настраивается автоматически при инсталляции); |
dvmpar |
- |
директория и расширение файлов базового набора параметров DVM-системы; |
usrpar |
- |
директории и имена (с расширениями) файлов параметров DVM-системы, в которых пользователь может корректировать базовый набор параметров (переменная может содержать несколько значений, разделенных пробелами); |
optcconv |
- |
опции C-DVM конвертора; |
optfconv |
- |
опции F-DVM конвертора; |
optccomp |
- |
вызов и опции стандартного C-компилятора; |
optfcomp |
- |
вызов и опции стандартного Fortran-компилятора; |
optclink |
- |
опции линковщика C программ; |
optflink |
- |
опции линковщика Fortran программ; |
dvmlib |
- |
библиотеки системы поддержки DVM-программ; |
usrlib |
- |
библиотеки, используемые в программе пользователя; |
Pred_sys |
- |
имя конфигурационного файла, описывающего целевую машину (для предиктора); |
Pred_vis |
- |
имя визуализатора html-файлов (результатов работы предиктора); |
Doc_vis |
- |
имя визуализатора документации; |
dvmout |
- |
включение (on) и отключение (off) вывода сообщений: - C-DVM и F-DVM компиляторов, - стандартных C и Fortran компиляторов, - системы поддержки (устанавливает параметр SysInfoPrint = 1 | 0) (см.п.14.3); |
dvmoutfile |
- |
имя файла, в который направляется вывод задачи пользователя (если не задан, то вывод идет на экран); |
dvmlog |
- |
включение (1) и отключение (0) протоколирования сеанса работы пользователя (если не задан dvmoutfile, то вывод идет в файл dvm.log); |
dvmshow |
- |
включение (1) и отключение (0) вывода на экран всех выполняемых dvm-команд; |
dvmsave |
- |
включение (1) и отключение (0) сохранения промежуточных файлов (конвертации, компиляции и т.д.). |
В своей рабочей директории (там, где запускается задача) пользователь может иметь несколько заранее подготовленных вариантов файла запуска dvm-команд c различными именами, содержащих различные значения переменных окружения. Тогда при запуске dvm-команд используется соответствующий префикс (см.п.9).
Опции C-DVM и F-DVM конверторов управляют:
режимами работы DVM-программы (последовательный или параллельный);
именем выходного (.c или .f) файла;
выводом номера версии конвертора и некоторой другой информации;
степенью подробности трассируемых DVM-отладчиком данных (см.п.13);
разбиением программы на интервалы для анализа ее производительности.
Ниже приводится краткое описание основных опций конверторов, (полное описание всех опций содержится в руководствах по использованию компиляторов C-DVM и F-DVM).
-p |
- |
(по умолчанию) получение параллельного варианта программы: обрабатываются все DVM-указания. |
-s |
- |
получение
последовательного варианта программы: |
-o<file> |
- |
имя выходного .с или .f файла. |
-v |
- |
вывод номера версии, имени выходного файла, и т.д. |
-d1 |
- |
обеспечивается трассировка только модификаций распределенных массивов. |
-d2 |
- |
обеспечивается трассировка чтений и модификаций распределенных массивов. |
-d3 |
- |
обеспечивается трассировка модификаций всех данных. |
-d4 |
- |
обеспечивается трассировка чтений и модификаций всех данных. |
-dbif1 |
- |
обеспечивается контроль данных на граничных итерациях цикла. Ширина грани может быть задана при помощи параметров: TraceOptions.LocIterWidth- для параллельных циклов, по умолчанию 1; TraceOptions.RepIterWidth-для последовательных циклов, по умолчанию 1 ( для DVM-программ на F-DVM). |
-e1 |
- |
интервалами становятся все параллельные циклы и объемлющие их последовательные циклы. |
-e2 |
- |
интервалами становятся объявленные пользователем последовательности операторов (INTERVAL). |
-e3 |
= |
e1 + e2. |
-e4 |
= |
e3 + интервалами становятся все последовательные циклы. |
Команды DVM-системы имеют следующий формат:
dvm <имя_DVM-команды> [<параметры_команды>] <имя_DVM-программы>
где:
dvm |
- |
префикс (имя файла запуска DVM-команд); |
<параметры_команды> |
- |
параметры, специфичные для разных команд, такие как опции конверторов или компиляторов, матрица процессоров и т.д.; |
<имя_DVM-программы> |
- |
имя файла с исходным текстом программы без расширения. |
Команды DVM-системы можно разделить на базовые и производные.
Ниже перечисляются базовые команды, с помощью которых можно выполнять различные операции, необходимые для отладки DVM-программ.
Команды конвертации DVM-программы.
dvm cdv [<опции C-DVM конвертора>] <имя_С-DVM-программы>
dvm fdv [<опции F-DVM конвертора>] <имя_F-DVM-программы>
Результат работы: файлы <имя_DVM-программы>.с или <имя_DVM-программы>.f. Опции конверторов сначала берутся из переменных окружения (см.п.7), а затем добавляются опции из командной строки. Если опции конверторов нигде не заданы, команды формируют рабочий параллельный вариант программы.
Команды стандартной компиляции и связывания С-программы и Fortran-программы.
dvm cc [<опции C-компилятора>] <имя_C-DVM-программы>
dvm f77 [<опции F- компилятора>] <имя_F-DVM-программы>
Результат работы: готовая программа (выполняемый файл <имя_DVM-программы>).
Опции компиляторов сначала берутся из переменных окружения (см.п.7), а затем добавляются опции из командной строки.
Команда запуска готовой программы на выполнение.
dvm run [матрица процессоров] [<опции_кластера>] <имя_DVM-программы>
матрица процессоров – задается матрица логических процессоров, например: 2 3 или 5 1 3. опции_кластера
– задаются только при запуске параллельных программ на кластере рабочих станций под управлением UNIX-подобных операционных систем. К опциям относятся:
-mf <список_машин>
-
<список_машин> - это имя файла со списком имен машин в кластере рабочих станций; общее количество процессоров в матрице процессоров не должно превышать количество имен машин в этом списке;
-m
-
в качестве имени файла со списком имен машин используется $dvmdir/user/machinelist;
-cp
-
копирование выполняемого файла в разделяемую (определенную в файле dvmwork и доступную для всех рабочих станций) директорию;
-h
-
помощь.
Если опции -mf и -m не заданы, программа выполняется на локальной рабочей станции.
Результат работы: выполнение подготовленного пользователем варианта программы.
Производные команды – это некоторая последовательность базовых команд, облегчающая выполнение тех или иных действий пользователя, например, в процессе отладки DVM-программ (см.п.13). Существуют следующие производные команды:
Команды конвертации и компиляции DVM-программ.
dvm c [<опции C-DVM конвертора>] <имя_C-DVM-программы>
dvm f [<опции F-DVM конвертора>] <имя_F-DVM-программы>Результат работы: готовая программа (выполняемый файл <имя_DVM-программы>).
Опции конверторов сначала берутся из переменных окружения (см.п.7), а затем добавляются опции из командной строки. Если опции конверторов нигде не заданы, команды формируют рабочий параллельный вариант программы.
Команды получения отладочного последовательного варианта DVM-программ (с подключением DVM-отладчика для сбора эталонной трассировки).
dvm csdeb [<опции C-DVM конвертора>] <имя_C-DVM-программы>
dvm fsdeb [<опции F-DVM конвертора>] <имя_F-DVM-программы>Результат работы: готовая программа (выполняемый файл <имя_DVM-программы>_s).
Опции конверторов сначала берутся из переменных окружения (см.п.7), а затем добавляются опции из командной строки. Если опции конверторов нигде не заданы, команды формируют последовательный вариант программы с опцией –d4 (см.п.8).
Команды получения отладочного параллельного варианта DVM-программ (с учетом всех DVM-указаний и с подключением DVM-отладчика для осуществления динамического контроля DVM-указаний, либо сбора или сравнения трассировки).
dvm cpdeb [<опции C-DVM конвертора>] <имя_C-DVM-программы>
dvm fpdeb [<опции F-DVM конвертора>] <имя_F-DVM-программы>Результат работы: готовая программа (выполняемый файл <имя_DVM-программы>_p).
Опции конверторов сначала берутся из переменных окружения (см.п.7), а затем добавляются опции из командной строки. Если опции конверторов нигде не заданы, команды формируют параллельный вариант программы с опцией –d4 (см.п.8).
Команда запуска отладочного параллельного варианта DVM-программ, осуществляющего динамический контроль DVM-указаний.
dvm err <имя_DVM-программы>
Результат работы: ошибки, обнаруженные в DVM-указаниях (при их наличии).
Команда запуска отладочного последовательного варианта DVM-программ, осуществляющая накопление эталонной трассировки на одном процессоре.
dvm trc <имя_DVM-программы>
Результат работы: файл с накопленной трассировкой или при наличии ошибок сбора трассировки – сообщения об ошибках.
Команда запуска отладочного параллельного варианта DVM-программ, осуществляющая сравнение результатов вычислений, полученных при запуске программы на одном процессоре, с накопленной ранее эталонной трассировкой.
dvm red <имя_DVM-программы>
Результат работы: ошибки, обнаруженные в процессе сравнения трассировок (при их наличии).
Команда запуска отладочного параллельного варианта DVM-программ, осуществляющая сравнение трасс, полученных при запуске программы на нескольких процессорах, с результатами выполнения на одном процессоре или результатами выполнения последовательного варианта программы.
dvm dif [матрица процессоров] <имя_DVM-программы>
Результат работы: ошибки, обнаруженные в процессе сравнения трассировок (при их наличии).
Команда запуска отладочного параллельного варианта DVM-программ, осуществляющая накопление трассировки на нескольких процессорах.
dvm ptrc [матрица процессоров] <имя_DVM-программы>
Результат работы: файлы с накопленной трассировкой или при наличии ошибок сбора трассировки – сообщения об ошибках.
Команда запуска отладочного последовательного варианта DVM-программ, осуществляющая оценку объема накапливаемой трассировки.
dvm size <имя_DVM-программы>
Результат работы: конфигурационный файл трассировки (см.п.10.3).
Команда запуска анализатора производительности, которую следует выполнять после завершения выполнения параллельной программы на рабочей станции или на кластере рабочих станций (на рабочей станции – только на одном процессоре, иначе временные характеристики будут некорректными).
dvm pa <statistics file name> <file name> [-l <level>] [-n <list>] [-c <compression level>]
где:
<statistics file name> |
- |
имя файла со статистической информацией; |
<file name> |
- |
имя файла вывода; |
<level> |
- |
номер уровня вложенности интервалов; |
<list> |
- |
список номеров процессоров, 0 – без характеристик по процессорам |
<compression level> |
- |
уровень упаковки файла вывода (0-9), -1 – без упаковки. |
Параметры могут задаваться в произвольном порядке, только имя файла со статистикой и имя файла вывода должны стоять первыми и в указанном порядке. Ограничить размер файла вывода можно с помощью необязательных параметров, если этот способ не подходит, то уменьшить размер файла можно с помощью увеличения уровня упаковки файла вывода.
Запуск команды
dvm pa –h
выдаст описание параметров команды.
Команда запуска DVM-программы, осуществляющая накопление трассировки для предиктора.
dvm runpred <имя_DVM-программы>
Результат работы: файл <имя_DVM-программы>.ptr с накопленной трассировкой.
Команда запуска предиктора.
dvm pred [матрица процессоров] <имя_DVM-программы>
Выполнение команды управляется переменными окружения:
Pred_sys – имя конфигурационного файла, описывающего целевую машину;
Pred_vis - имя визуализатора html-файлов.Для работы предиктора необходимо наличие файла <имя_DVM-программы>.ptr с трассировкой, полученной командой dvm runpred.
Результат работы: директория <имя_DVM-программы>.prd с html-файлами. Если в файле запуска команд задан визуализатор html-файлов, то он автоматически вызывается.
Команда вызова визуализатора документации.
dvm doc [тип документации]
где тип документации может принимать следующие значения:
ur
- документация пользователя на русском языке;
ue - документация пользователя на английском языке; sr - документация разработчика на русском языке; se - документация разработчика на английском языке.
Выполнение команды управляется переменной окружения:
Doc_vis - имя визуализатора документации.
Команды комплексного прогона одной программы последовательно через все шаги отладки (см.п.13).
Данные команды работают на платформах, которые обеспечивают интерактивный режим выполнения программ.
dvm ctest [матрица процессоров] <имя_DVM-программы>
dvm ftest [матрица процессоров] <имя_DVM-программы>Результат работы: конкатенация результатов работы команд, объединенных в команду комплексного прогона.
Замечание. Если программа использует в своей работе библиотеки последовательных программ, имена этих библиотек должны быть перечислены в переменной окружения usrlib файла запуска dvm-команд (см.п.7).
При динамическом контроле корректности в случае обнаружения ошибок в текущей директории появляется файл еrror.dbg.
При накоплении и сравнении трассы в случае обнаружения ошибок в текущей директории появляются файлы <имя задачи>.err.trd и <имя задачи>.finerr.trd
В этих файлах содержится информация для локализации места ошибки и диагностика ошибки. Тексты диагностик и возможные причины ошибок приведены в п.12 данного документа.
Замечание.
На машинах с системами очередей:
<имя задачи> - это <имя программы>.<число процессоров, используемых при запуске><номер запуска>.
<номер запуска> - это число запусков программы на данном числе процессоров из текущей директории.
Протокол с ошибками динамического контроля корректности содержится в файле еrror.dbg. Он состоит из двух частей. Первая его часть содержит записи об ошибках, происходящих в процессе выполнения программы. При многократном обнаружении одной и той же ошибки в разных витках цикла, ошибка выдается только в первый раз. Вторая часть протокола также содержит записи об ошибках, но для каждой записи выводится строка с информацией о том, сколько ошибок в этом месте программы было обнаружено.
В протоколе содержится строка с информацией о числе обнаруженных ошибок и ограничении на число ошибок. Ограничение на число ошибок является параметром работы DVM-отладчика. Этот параметр определяет максимальное число ошибок, после которого динамический контроль отключается. Строка имеет формат:
*** Processor <N>: total errors: <N1>; Limit per CPU: <N2>
Сообщения об ошибке имеет вид:
*** DYNCONTROL *** :<context>
<error message>
(<count> times)
File: <file>, Line: <line>
где:
<context> |
– |
контекст, в котором произошла ошибка. Контекст может иметь одну из следующих форм: Sequential branch – ошибка произошла в последовательной части программы; Loop( No(N1), Iter(I1,I2,…) ), …, Loop( No(Nm), Iter(I1,I2,…) ) – ошибка произошла при выполнения цикла m-степени вложенности. |
<file> |
– |
имя файла, где произошла ошибка. |
<line> |
– |
номер строки |
<count> |
– |
число повторений данной ошибки в данном контексте. Выводится при итоговой выдаче всех найденных ошибок. |
<error message> |
– |
описание произошедшей ошибки. |
Пример. Протокол error.dbg
*** DYNCONTROL *** : Sequential branch.
Using non-initialized variable b
File: dc1.fdv Line: 2
*** Processor 0: total errors: 1; Limit per CPU: 1000
*** DYNCONTROL *** : Sequential branch.
Using non-initialized variable b
File: dc1.fdv Line: 2
Протоколы с ошибками сравнительной отладки содержится в файлах <имя задачи>.err.trd и <имя задачи>.finerr.trd.
Протокол <имя задачи>.err.trd состоит из двух частей. Первая его часть содержит записи об ошибках, происходящих в процессе выполнения программы в том порядке, в котором они происходили. При этом синхронизации при открытии файла не производится. Из-за этого посередине одной записи может вклиниваться другая, если это не обеспечивается на низком уровне. Вторая часть протокола содержит записи об ошибках по процессорам. Для каждого отдельно взятого процессора записи упорядочены по мере их возникновения (дублирования записей не производится, указывается их число в первой записи об ошибке). Записи, относящиеся к разным процессорам, разделяются строкой с информацией о числе обнаруженных ошибок и ограничении на число ошибок. Смысл ограничений аналогичен подобным ограничениям для DVM-отладчика корректности.
Формат строки:
*** Processor <N>: total errors: <N1>; Limit per CPU: <N2>
Записи файла имеют следующий вид:
<N1>:TrcFile <name file>; TrcRec(<N2>); <context>
<error message>
(<count> times)
Var. name=<name> File: <file>, Line: <line>
val1=<value1>
val2=<value2>
где:
N1 |
– |
номер процессора, на котором произошла ошибка; |
name file |
– |
имя файла с эталонной трассой; |
N2 |
– |
номер строки в файле c эталонной трассой; |
<context> |
– |
контекст, в котором произошла ошибка. Контекст может иметь одну из следующих форм: Sequential branch – ошибка произошла в последовательной части программы; Loop( No(N1), Iter(I1,I2,…) ), …, Loop( No(Nm), Iter(I1,I2,…) ) – ошибка произошла при выполнения цикла m-степени вложенности. |
<file> |
– |
имя файла, где произошла ошибка; |
<line> |
– |
номер строки; |
<count> |
– |
число повторений данной ошибки в данном контексте. Выводится при итоговой выдаче всех найденных ошибок; |
<error message> |
– |
описание произошедшей ошибки; |
<name> |
– |
имя переменной; |
<file> |
– |
имя файла; |
<line> |
– |
номер строки в файле; |
<value1> |
– |
значение переменной в эталонной трассе; |
<value2> |
– |
значение переменной при выполнении программы. |
Поле count выводится, если ошибка повторилась более 1 раза.
В случае, если сообщение об ошибке не содержит значений переменных, параметр count выводится после сообщения об ошибке, в отдельной строке перед именем файла и номером строки.
Значения val1 и val2 выводятся при обнаружении различных значений переменной для текущего события и события эталонной трассировки.
В первой строке протокола <имя задачи>.err.trd содержится информация о числе обнаруженных ошибок и ограничении на число ошибок. Далее выводятся записи об ошибках, собранных со всех процессоров. Записи об ошибках упорядочены по времени их возникновения (одинаковые ошибки с разных процессоров группируются в одну). Если времена процессоров не были синхронизованы, порядок ошибок может не соответствовать реальному порядку их возникновения (на многопроцессорной системе), но порядок первых ошибок с каждого отдельно взятого процессора должен соответствовать порядку их возникновения на этом процессоре.
Формат записей об ошибках не отличается от формата записей в протоколе *.err.trd, однако после поля записи count в скобках указываются номера процессоров, на которых эта ошибка также происходила, помимо номера процессора, который указывается первым в самой первой строке записи в круглых скобках.
Пример. Протокол so2_1.err.trd
: TrcFile(0.trd); TrcRec(294); Sequential branch.
Different INT values (reduction)
Var. name = <reduct.var> File: so2_1.fdv Line: 51
val1= 2107342848
val2=-2147483648
*** Processor 0: total errors: 1; Limit per CPU: 1000
: TrcFile(0.trd); TrcRec(294); Sequential branch.
Different INT values (reduction)
Var. name = <reduct.var> File: so2_1.fdv Line: 51
val1= 2107342848
val2=-2147483648.
Пример. Протокол so2_1.finerr.trd
*** Total errors: 1; Limit per CPU: 1000
: TrcFile(0.trd); TrcRec(294); Sequential branch.
Different INT values (reduction)
Var. name = <reduct.var> File: so2_1.fdv Line: 51
val1= 2107342848
val2=-2147483648
Протокол имеет имя <имя задачи>.< N proc>.prot.trd
Замечание.
На машинах с системами очередей:
<имя задачи> - это <имя программы>.<число процессоров, используемых при запуске><номер запуска>.
<номер запуска> - это число запусков программы на данном числе процессоров из текущей директории.
Протокол можно разделить на разделы:
1. Версия отладчика
DVM debugger version <version info>
2. Параметры сравнительной отладки и номер процессора, на котором составлен протокол
В этом разделе содержатся значения параметров важных для ручного анализа протокола.
3. Информация о сравненных событиях
В этом разделе указывается количество успешно сравненных чтений/записей переменных (matched events), включая подменённые редукционные переменные, если установлен соответствующий флаг и количество различий без учета кратности (differences), то есть несколько различий с одним и тем же контекстом считаются как одно.
4. Сообщение о прекращении работы отладчика
В случае, если отладчик не дошел до конца эталонной трассы ( неполная трасса, авост), то появляется сообщение, начинающееся так:
*** Warning: debugger did not reach the end of trace:……………
5. Записи вида:
Var. name=<name> File: <file>, Line: <line>
Hit count <N>
First dif TrcFile <name file> TrcRec=<N2>
val1=<value1> dif_r=<value3>
val2=<value2> d if_a=<value4>
Max relative diff TrcFile <name file> TrcRec=<N2>
val1=<value1> dif_r=<value3>
val2=<value2> d if_a=<value4>
Max relative leap TrcFile <name file> TrcRec=<N2>
val1=<value1> dif_r=<value5>
val2=<value2> d if_a=<value6>
Max absolute diff TrcFile <name file> TrcRec=<N2>
val1=<value1> dif_r=<value3>
val2=<value2> d if_a=<value4>
Max absolute leap TrcFile <name file> TrcRec=<N2>
val1=<value1> dif_r=<value5>
val2=<value2> d if_a=<value6>
где:
Var. name
–
имя переменной;
<file>
–
имя файла, где произошла ошибка;
<line>
–
номер строки;
N
–
количество выявленных различий для данного ключа - Var. Name, file, line;
First dif
–
первое выявленное различие для данного ключа;
name file
–
имя файла с трассой;
N2
–
номер записи в трассе;
<value1>
–
значение переменной в эталонной трассе;
<value2>
–
значение переменной при выполнении программы;
<value3>
–
максимальное значение относительного различия;
<value4>
–
максимальное значение абсолютного различия;
<value5>
–
максимальное значение относительного скачка;
<value6>
–
максимальное значение абсолютного скачка.
Параметр сравнительной отладки (TraceOptions.ExpIsAbsolute) устанавливает точность - относительная или абсолютная. Записи упорядочиваются по убыванию величины различия, соответствующей установленной точности. Данные по второй (не выбранной) точности заполняются только тогда, когда различие выявляется по выбранной точности.
Поле Max absolute diff / dif_a определяет максимальное значение абсолютной погрешности, значения переменных (val1, val2), значение относительной погрешности (dif_r) и привязку к трассе (TrcRec, TrcFile) в момент достижения максимальной абсолютной погрешности (dif_a).
Поле Max relative diff / dif_r определяет максимальное значение относительной погрешности, значения переменных (val1, val2), значение абсолютной погрешности (dif_a) и привязку к трассе (TrcRec, TrcFile) в момент достижения максимальной относительной погрешности (dif_r).
Поле Max absolute leap / leapa - определяет максимальное значение скачка абсолютной погрешности, значения переменных (val1, val2), значение скачка относительной погрешности (leapr) и привязку к трассе (TrcRec, TrcFile) в момент достижения максимального скачка абсолютной погрешности (leapa).
Поле Max relative leap / leapr - определяет максимальное значение скачка относительной погрешности, значения переменных (val1, val2), значение скачка абсолютной погрешности leapa и привязку к трассе (TrcRec, TrcFile) в момент достижения максимального скачка относительной погрешности (leapr).
Замечание. При первом выявленном различии для данного ключа (Var. name, File, Line) значения погрешностей запоминаются и скачки (leapa, leapr) устанавливаются равными нулю.
Пример. Протокол so2_1.< 0>.prot.trd
DVM debugger version 03.05.2008@00:00
==============================================
TraceOptions.Exp = 0.0001
TraceOptions.ExpIsAbsolute = 1
TraceOptions.SRCLocCompareMode = 3
CPU number = 0
Found 70 matched events and 1 errors (so2_1.err.trd).
----------------------------------------------------------------------------------------
Var. name = <reduct.var>, File = so2_1.fdv, Line = 51.
Hit count 1
First dif TraceFile(0.trd) TrcRec= 294
val1= 2107342848 dif_r= 1.98130798339843750E+000
val2=-2147483648 dif_a= 4.25482649600000000E+009
Max relative diff TraceFile(0.trd) TrcRec= 294
val1= 2107342848 dif_r= 1.98130798339843750E+000
val2=-2147483648 dif_a= 4.25482649600000000E+009
Max relative leap TraceFile(0.trd) TrcRec= 294
val1= 2107342848 leapr= 0.00000000000000000E+000
val2=-2147483648 leapa= 0.00000000000000000E+000
Max absolute diff TraceFile(0.trd) TrcRec= 294
val1= 2107342848 dif_r= 1.98130798339843750E+000
val2=-2147483648 dif_a= 4.25482649600000000E+009
Max absolute leap TraceFile(0.trd) TrcRec= 294
val1= 2107342848 leapr= 0.00000000000000000E+000
val2=-2147483648 leapa= 0.00000000000000000E+000
Протокол имеет имя <имя задачи>.finprot.trd
Разделы 1 и 2 этого протокола аналогичны протоколу со скачками за исключением того, что не выводится поле с номером процессора. Далее, как и в предыдущем протоколе идут записи с ключами – тройками (Var. name, File, Line) Записи обобщают протоколы со скачками по ключам и содержат максимальные значения полей по всем протоколам, содержащим аналогичный ключ. Исключение составляет поле Hit count Sum. Если максимальное значение достигнуто на нескольких процессорах, то привязка к трассе берется с процессора с меньшим номером. При этом в конце строки указывается список номеров процессоров в круглых скобках, на которых было достигнуто соответствующее значение (максимума или суммы). Для подчеркивания того, по какой точности ведется обработка, в поле Max first dif список процессоров указывается рядом со значением той точности, на которую указывает параметр TraceOptions.ExpIsAbsolute. В остальных полях список процессоров указывается рядом с той точностью, по которой ведется сбор информации в этом поле.
Конфигурационный файл трассировки имеет имя loops.trd. Этот файл служит не только для задания степени подробности трассировки для каждой конструкции программы, но и для выдачи программисту объемов трассировки при заданных уровнях ее подробности. Запуская программу в режиме формирования конфигурационного файла (без реального накопления трассировки) и корректируя каждый раз получаемый файл, программист имеет возможность добиться наиболее подходящей степени подробности трассировки.
Существуют следующие уровни подробности трассировки:
отсутствие трассировки (уровень NONE);
трассировка начала и завершения циклов или областей задач и начала витков или задач (уровень MINIMAL);
предыдущий уровень, плюс трассировка модификаций переменных и результатов вычисления редукции (уровень MODIFY);
трассировка всех событий (уровень FULL).
Кроме того, для каждого цикла можно указать диапазон витков, по которым будет накапливаться трассировка, а для области задач – диапазон трассируемых задач.
Уровень подробности трассировки всей программы задается при запуске программы в файле параметров. Уровень подробности трассировки для каждой конструкции программы задается в конфигурационном файле. Если уровень подробности для конструкции не задан, то он наследуется от объемлющей конструкции. Если объемлющей конструкции не существует, то принимается уровень всей программы.
Для всей программы и для конструкции программы отдельно конфигурационный файл содержит следующую информацию: число строк в файле трассировки, размер трассировки в байтах и общее число выполненных витков цикла. Если конструкция выполняется несколько раз, то по ней дается суммарная информация.
Дополнительно, для каждой конструкции приводится ее номер, номера строк начала и конца конструкции в исходном файле, уровень подробности трассировки и множество трассируемых витков или задач. Пользователь может менять только уровень подробности трассировки и множество трассируемых витков или задач.
Структура конфигурационного файла трассировки следующая:
# Trace size = |
<размер всего файла трассировки в байтах> |
# String count = |
<число строк всего файла трассировки> |
SL, PL или TR |
<номер конструкции> (<номер объемлющей конструкции>) [<размерность конструкции>] {<имя файла>, <номер строки>} = <уровень накопления трассировки>, (<измерение> : <первая итерация> , <последняя итерация> , <шаг трассируемых итераций>) |
|
|
# Trace size = <размер трассировки в байтах данной конструкции для указанного уровня накопления трассировки> |
|
|
# String count = <число строк трассировки данной конструкции для указанного уровня накопления трассировки > |
|
|
# Count of traced iterations = <число трассируемых итераций цикла или задач> |
|
EL: <номер конструкции>
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Все параметры исполняющихся конструкций задаются после символа ‘=’. Запись SL соответствует обычному последовательному циклу, запись PL соответствует параллельному циклу а запись TR – области параллельных задач.
Трассируемые итерации и задачи задаются следующим образом:
(<измерение> : [<первая итерация>] , [<последняя итерация>] , [<шаг итераций>])
<измерение> |
- |
измерение цикла (начиная с нуля), по которому задаются ограничения. Обязательный параметр. Для областей задач всегда должен быть 0. |
<первая итерация> |
- |
задает номер итерации цикла или задачи, начиная с которой трассируются итерации или задачи. Если номер не задан, то трассируются итерации или задачи, начиная с первой. |
<последняя итерация> |
- |
задает номер итерации цикла или задачи, по которую будет собираться трассировка. Если номер не задан, то трассируются итерации или задачи по последнюю включительно. |
<шаг итераций> |
- |
задает шаг, с которым итерации или задачи будут записываться в трассировку. |
Если множество трассируемых витков не задано, то будут трассироваться все витки или задачи.
При задании специального режима в файле параметров, информация о пустых витках (для которых никаких других записей в трассировку не пишется) не будет помещаться в файл трассировки.
При трассировке вычислений накапливаемая трассировочная информация состоит из двух частей
заголовка трассировки;
тела трассировки (может отсутствовать).
Заголовок присутствует в трассировке даже тогда, когда накопление трассировки отключено для всей программы. Его структура напоминает структуру конфигурационного файла трассировки, но без вычисляемых значений объемов трассировки для всей программы и для отдельных циклов:
MODE = <уровень накопления трассировки для всей программы>,
SL, PL или TR |
<номер конструкции> (<номер объемлющей конструкции>) [<размерность конструкции>] {<имя файла>, <номер строки>} = <уровень накопления трассировки>, (<измерение> : <первая итерация> , <последняя итерация> , <шаг трассируемых итераций>) |
EL: <номер конструкции>
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
SL, PL или TR |
<номер конструкции> (<номер объемлющей конструкции>) [<размерность конструкции>] {<имя файла>, <номер строки>} = <уровень накопления трассировки>, (<измерение> : <первая итерация> , <последняя итерация> , <шаг трассируемых итераций>) |
EL: <номер конструкции>
Тело трассировки отсутствует, когда накопление трассировки отключено для всей программы. Иначе тело трассировки состоит из множества записей следующих типов:
· Обращение к переменной на чтение.
RD: [<тип переменной>] <имя переменной> = <значение>; {<имя файла>, <номер строки>}
· Обращение к переменной на запись (перед вычислением выражения).
BW: [<тип переменной>] <имя переменной>; {<имя файла>, <номер строки>}
· Результат записи в переменную.
AW: [<тип переменной>] <имя переменной> = <значение>; {<имя файла>, <номер строки>}
· Обращение к редукционной переменной на чтение.
RV_RD: [<тип переменной>] <имя переменной> = <значение>; {<имя файла>, <номер строки>}
· Обращение к редукционной переменной на запись (перед вычислением выражения).
RV_BW: [<тип переменной>] <имя переменной>; {<имя файла>, <номер строки>}
· Результат записи в редукционную переменную.
RV_AW: [<тип переменной>] <имя переменной> = <значение>; {<имя файла>, <номер строки>}
· Результат вычисления редукции.
RV: [<тип переменной>] <значение>; {<имя файла>, <номер строки>}
· Пропуск операторов при обращении к элементу распределенного массива в последовательной части программы.
SKP: {<имя файла>, <номер строки>}
· Начало выполнения параллельного цикла.
PL: <номер конструкции> (<номер объемлющей конструкции>) [<размерность цикла>] (<начальная итерация по измерению 1>, <конечная итерация по измерению 1>, <шаг по измерению 1>) … (<начальная итерация по измерению R>, <конечная итерация по измерению R>, <шаг по измерению R>); {<имя файла>, <номер строки>}
LOCAL: (<начальная итерация локальной части по измерению 1>, <конечная итерация локальной части по измерению 1>, <шаг по измерению 1>) … (<начальная итерация локальной части по измерению R>, <конечная итерация локальной части по измерению R>, <шаг по измерению R>)
·
Информация о подмножествах итераций, на которые было поделено
исходное множество итераций цикла на данном процессоре.
Значение VTR в конце записи означает,
является ли указанное множество итераций внутренним (значение 0) или
граничным (значение 1).
CHUNK: (<начальная итерация подмножества по измерению 1>, <конечная итерация подмножества по измерению 1>, <шаг по измерению 1>) … (<начальная итерация подмножества по измерению R>, <конечная итерация подмножества по измерению R>, <шаг по измерению R>) VTR = <1|0>
· Начало выполнения последовательного цикла.
SL: <номер конструкции> (<номер объемлющей конструкции>) [<ранг цикла (всегда равен единице)>] ; {<имя файла>, <номер строки>}
· Начало выполнения области задач.
TR: <номер конструкции> (<номер объемлющей конструкции>) [<ранг области (всегда равен единице)>] ;
{<имя файла>, <номер строки>}
· Начало витка или параллельной задачи.
IT: <абсолютный индекс витка (вычисляется из значений всех индексных переменных цикла) или номер задачи>, (<значение индексной переменной1>,< значение индексной переменной2>,…).
· Конец выполнения параллельного цикла или области задач.
EL: <номер конструкции>; {<имя файла>, <номер строки>}
DVM-отладчик при наличии ошибок динамического контроля корректности выдает на стандартный вывод сообщение о числе обнаруженных ошибок:
*** Dynamic control found <N> error(s)
При отсутствии ошибок ничего не выдается.
При накоплении трассы на экран выдается сообщение о начале и окончании сбора трассы.
Сообщение имеет вид:
<N процессора> *** DVM debugger:Trace writing started
<N процессора> *** DVM debugger:Trace writing finished
При обнаружении ошибок во время сбора трассы Dvm-отладчик на стандартный вывод сообщение о числе обнаруженных ошибок:
*** Found <N> error(s)
При сравнении трасс DVM-отладчик выдает сообщении об отсутствии ошибок сравнения :
*** DVM debugger: No errors detected
либо сообщение о числе обнаруженных ошибок:
*** Found <N> error(s)
При завершении работы отладчика по ошибке он выдает одно из двух следующих информационных сообщений:
***DVM debugger warning: Fatal error was detected, debugger was disabled
если программа была скомпилирована в отладочном режиме.
*** DVM debugger: Fatal error was detected in -dbif* instrumentation mode, program was terminated,
если программа была скомпилирована в отладочном режиме с опцией –dbif1.
Замечание. При выполнении программ в отладочном режиме возможны появления сообщений с префиксом “***RTS err”,”*** RTS fatal err”, ”*** RTS warning”. Это сообщения об ошибках, возникающих в процессе функционирования системы поддержки. Классификация этих сообщений приведена в п.15.
Сообщение об ошибке |
Описание |
Using non-initialized variable <var> |
Обнаружено обращение к неинициализированной переменной. |
Using non-initialized element <elem> |
Обнаружено обращение к неинициализированному элементу распределенного массива. |
Using variable <var> before asynchronous reduction competed |
Обращение к редукционной переменной до завершения операции редукции. |
Access to non-local element <elem> |
Обращение к нелокальному элементу массива. |
Writing to shadow element <elem> of array |
Запись в теневой элемент массива. |
Data dependence in loop due to access to element <elem> |
Обнаружена зависимость параллельного цикла по данным. |
Using shadow element <elem> before asynchronous shadow renew competed |
Использование теневого элемента <elem> распределенного массива во время выполнения операции обновления теневых граней. |
Reading remote element <elem> in sequential branch |
Использование нелокального элемента <elem> распределенного массива в последовательной части программы. |
Reduction operation was not started |
Ожидание завершения редукции без ее фактического запуска. |
Using an element outside of array limits: <elem> |
Обращение к элементу массива за пределами его границ. |
START for reduction without WAIT |
Отсутствие операции ожидания завершения асинхронной редукции для соответствующей операции старта асинхронной редукции. |
Reduction operation was not started |
Специфицирована редукционная переменная, но соответствующее вычисление редукционной операции никогда не было стартовано. |
Сообщение об ошибке |
Описание |
NAN or INF value is found during the execution |
При вычислении обнаружен NAN или INF |
Terminated by signal <val> at <point ID |
При выполнении программы получен сигнал с номером val |
Сообщение об ошибке |
Описание |
Bad file structure |
Выдается при любом несоответствии трассировки или описания циклов |
Undefined keyword |
Выдается при обнаружении неизвестного ключевого слова в трассировке или в файле описания циклов |
Bad command syntax |
Выдается при неверном параметре после ключевого слова |
No trace (fatal) |
Файл с трассировкой существует, но не содержит данных |
Bad trace structure (missing current program construct) |
Выдается при наступлении события начала витка цикла или события завершения цикла без соответствующего события начала цикла |
Сообщение об ошибке |
Описание |
Different <type> values: <standard value> != <current value> |
Различные значения переменной для текущего события и события эталонной трассировки |
Different INT values (reduction) |
Различные значения результата редукционной операции для текущего события и события эталонной трассировки |
Unexpected task or iteration of loop |
Выдается при наступлении события начала витка цикла, для которого нет соответствующей записи в эталонной трассировке |
Unexpected use of variable |
Выдается при наступлении события доступа к переменной, для которого нет соответствующей записи в эталонной трассировке |
NAN or INF value is found during the execution |
При вычислении обнаружен NAN или INF |
Отладку программ рекомендуется проводить сначала на тестовых, а затем на реальных данных. Если нет ограничений на ресурсы памяти и времени, то можно воспользоваться комплексным прогоном через все шаги отладки или выполнить все шаги отдельно. При наличии ограничений нужно выбрать один из возможных вариантов сокращения трассы.
Для этого необходимо выполнить команды:
dvm fsdeb<опции компилятора F-DVM> <имя DVM-программы>
dvm csdeb<опции компилятора C-DVM> <имя DVM-программы>
dvm size <имя DVM-программы>
По умолчанию запуск управляется параметрами сбора пользовательской трассировки, из базового файла usrdebug (см.п.14.2) скорректированными следующими параметрами из файла deb_size.par:
EnableDynControl = 0; |
- |
отключение динамического контроля; |
EnableTrace = 1; |
- |
подключение накопления трассировки; |
TraceOptions.TraceMode = 0; |
- |
режим генерации конфигурационного файла трассировки. |
Команда создает так называемый конфигурационный файл трассировки, в котором, в частности, приводятся предполагаемые объемы трассировки, исходя из заданных опций DVM-конверторов (см.п.8) и уровней ее сбора (см.п.14.2). Фактически, объемом трассировки управляют только два параметра из базового набора: TraceOptions.TraceLevel и TraceOptions.WriteEmptyIter.
Для использования метода граничных итераций необходимо использовать опцию компилятора –dbif1 при получении отладочного варианта программы. По умолчании задана отладка на “уголках”. Для задания отладки на гранях нужно задать значение параметра TraceOptions.IterTraceMod=2. Ширина уголков и граней задается при помощи параметров TraceOptions.LocIterWidth и TraceOptions.RepIterWidth. Начинать отладку рекомендуется с граничными итерациями типа “уголки” ширины 1.
Задавая различные опции компилятора при получении отладочных вариантов программы можно существенно сократить трассы.
-d1 |
- |
обеспечивается трассировка только модификаций распределенных массивов. |
-d2 |
- |
обеспечивается трассировка чтений и модификаций распределенных массивов. |
-d3 |
- |
обеспечивается трассировка модификаций всех данных. |
-d4 |
- |
обеспечивается трассировка чтений и модификаций всех данных. |
По умолчании для получения отладочных вариантов программы используется опция -d4.
Управлять объемом файла трассировки можно при помощи параметра TraceOptions.TraceLevel, который задает степень подробности трассировки. Параметр используется только в режиме сбора трассировки. Возможны следующие значения:
0 |
– |
отсутствие трассировки (уровень NONE); |
1 |
– |
трассировка начала и завершения циклов или областей задач и начала витков или задач (уровень MINIMAL); |
2 |
– |
предыдущий уровень, плюс трассировка модификаций переменных и результатов вычисления редукции (уровень MODIFY); |
3 |
– |
трассировка всех событий (уровень FULL). |
По умолчанию значение параметра равно 3.
1. Получение отладочных вариантов DVM-программы для последовательного и параллельного выполнения
Получение варианта для последовательного выполнения:
dvm fsdeb [<опции компилятора F-DVM>] <имя DVM_программы>
dvm csdeb [<опции компилятора C-DVM>] <имя DVM_программы>
Получение варианта для параллельного выполнения:
dvm fpdeb [<опции компилятора Fortran-DVM>] <имя DVM программы>
dvm cpdeb [<опции компилятора C-DVM>] <имя DVM_программы>
2. Выполнение программы в режиме динамического контроля DVM-указаний
Для выполнения DVM- программы служит команда:
dvm err <имя DVM-программы>
По умолчанию запуск управляется параметрами динамического контроля из базового файла usrdebug (см. п.7 и п.14.1) скорректированными следующими параметрами из файла deb_err.par (оба файла находятся в поддиректории, \PAR директории DVM-системы, заданной в переменной окружения dvmpar):
EnableDynControl = 1; |
- |
подключение динамического контроля; |
EnableTrace = 0; |
- |
отключение накопления трассировки вычислений. |
В случае обнаружения неверных DVM-указаний в поток stderr выдается диагностика о наличии ошибок динамического контроля. Этот поток может быть направлен либо на экран, либо в файл (см.п.7 и п.14.3).
Сообщения о типе ошибки, строке исходного текста и номерах итераций всех объемлющих циклов так же можно направить либо на экран, либо в файл (см.п.14.1). Структуру и перечень сообщений об ошибках динамического контроля см. в п.12.1.
Отсутствие ошибок при динамическом контроле не гарантирует правильной работы параллельной программы. Поэтому отладку программы следует продолжить, воспользовавшись командами накопления и сравнения трассировок.
3. Накопление эталонного файла трассировки DVM-программы
Для этого служит команда:
dvm trc <имя DVM-программы>
По умолчанию запуск управляется параметрами сбора трассировки вычислений из базового файла usrdebug (см.п.14.2) скорректированными следующими параметрами из файла deb_trc.par:
EnableDynControl = 0; |
- |
отключение динамического контроля; |
EnableTrace = 1; |
- |
подключение накопления трассировки; |
TraceOptions.TraceMode = 1; |
- |
режим накопления трассировки. |
В случае обнаружения ошибок при накоплении трассировки в поток stderr выдается диагностика о наличии таких ошибок. Этот поток может быть направлен либо на экран, либо в файл (см.п.7 и п.14.3).
Сообщения о типе ошибки, строке исходного текста и номерах итераций всех объемлющих циклов также можно направить либо на экран, либо в файл (см.п.14.2). Структуру накапливаемой трассировки см. в п.10.4.
Структуру и перечень сообщений об ошибках сбора трассировок см. п.12.
4. Сравнение эталонной трассировки с результатами выполнения параллельной программы на одном процессоре
При сравнении эталонной трассировки с результатами выполнения параллельной программы на одном процессоре производится контроль корректности описания редукционных операций. Этот контроль осуществляется посредством специального режима выполнения параллельной программы на одном процессоре, при котором вычисление редукционных переменных производится в соответствии с описаниями редукционных операций, заданными программистом. Редукционные переменные вычисляются так, как если бы каждый виток цикла, в котором она подсчитывается, размещался бы на отдельном процессоре. В начале каждого витка редукционной переменной присваивается начальное значение, которое запоминается при входе в цикл. По окончании витка производится обращение к библиотеке Lib-DVM для вычисления конечного результата в соответствии с заданной программистом редукционной функцией. Если редукционная функция задана программистом неправильно, то должно возникнуть расхождение в трассировках при разных режимах вычисления редукции.
Для сравнения трассировок служит команда:
dvm red <имя DVM-программы>
По умолчанию запуск управляется параметрами сравнения трассировки, из базового файла usrdebug (см.п.14.2) скорректированными следующими параметрами, из файла deb_red.par:
EnableDynControl = 0; |
- |
отключение динамического контроля; |
EnableTrace = 1; |
- |
подключение накопления трассировки; |
TraceOptions.TraceMode = 3; |
- |
режим сравнения трассировок; |
ManualReductCalc = 1; |
- |
вычисление редукционных переменных в соответствии с указаниями пользователя. |
В случае обнаружения ошибок сравнения трассировок в поток stderr выдается диагностика о наличии ошибок сравнения. Этот поток может быть направлен либо на экран, либо в файл (см.п.7 и п.14.3).
Сообщения о типе ошибки, строке исходного текста и номерах итераций всех объемлющих циклов так же можно направить либо на экран, либо в файл (см.п.14.2).
Структуру и перечень сообщений об ошибках сравнения трассировок см. п.12.
5. Накопление трассировки параллельной программы
Для этого служит команда:
dvm ptrc N1 [N2 [N3]] [<опции_кластера>] <имя DVM-программы>
где N1, N2, N3 - размеры матрицы процессоров (по умолчанию – 1 1 1).
По умолчанию запуск управляется параметрами сбора пользовательской трассировки, из базового файла usrdebug (см.п.14.2) скорректированными следующими параметрами из файла deb_trc.par:
EnableDynControl = 0; |
- |
отключение динамического контроля; |
EnableTrace = 1; |
- |
подключение накопления трассировки; |
TraceOptions.TraceMode = 1; |
- |
режим накопления трассировки. |
В случае обнаружения ошибок при накоплении трассировки в поток stderr выдается диагностика о наличии таких ошибок. Этот поток может быть направлен либо на экран, либо в файл (см.п.7 и п.14.3).
Сообщения о типе ошибки, строке исходного текста и номерах итераций всех объемлющих циклов так же можно направить либо на экран, либо в файл (см.п.14.2). Трассировка накапливается для каждого процессора в отдельном файле, например с именами: 0.trd, 1.trd, 2.trd и т.д.
Структуру накапливаемых файлов трассировки см. в п.10.4.
6. Сравнение трассировки параллельного выполнения с эталонной
Производится сравнение трасс, полученных при запуске программы на нескольких процессорах, с результатами выполнения на одном процессоре или результатами выполнения последовательного варианта программы .
dvm dif N1 [N2 [N3]] [<опции_кластера>] <имя DVM-программы>
где N1, N2, N3 - размеры матрицы процессоров (по умолчанию – 1 1 1).
По умолчанию запуск управляется параметрами сравнения трассировки из базового файла usrdebug (см.п.14.2), скорректированными следующими параметрами из файла deb_dif.par:
EnableDynControl = 0; |
- |
отключение динамического контроля; |
EnableTrace = 1; |
- |
подключение накопления трассировки; |
TraceOptions.TraceMode = 3; |
- |
режим сравнения трассировок; |
ManualReductCalc = 0; |
- |
вычисление редукционных переменных по стандартному алгоритму. |
Редукционные переменные вычисляются обычным способом. Все вычисления редукционной переменной на одном процессоре реализуются операторами программы в витках, выполняющихся на данном процессоре, а вычисление конечного результата по значениям, полученным на каждом процессоре, производится системой поддержки. При этом если программа работает на одном процессоре, то редукция будет вычисляться только операторами программы.
В случае обнаружения ошибок сравнения трассировок в поток stderr выдается диагностика о наличии ошибок сравнения. Этот поток может быть направлен либо на экран, либо в файл (см.п.7 и п.14.3).
Сообщения о типе ошибки, строке исходного текста и номерах итераций всех объемлющих циклов так же можно направить либо на экран, либо в файл (см.п.14.2).
Структуру и перечень сообщений об ошибках сравнения трассировок см. в п.12.
Если различий в трассировке не обнаружено, можно переходить к параллельному выполнению программы с реальными данными (см.п.13.3).
Если обнаружены различия, но ошибку в программе не удается определить по эталонной трассировке и диагностике сравнения трассировок, пользователь может накопить трассировку на каждом процессоре при запуске параллельного варианта программы на требуемой матрице процессоров (см.п.13.3).
Если при параллельном выполнении программы (или его имитации на отдельной рабочей станции) на некотором процессоре возникнут аварийные ситуации (или будут обнаружены отличия трассировки от эталонной), то возможно зависание программы. Если завершить ее выполнение с помощью CTRL-C, то направляемые в файлы стандартные выводные потоки могут пропасть. В этом случае поток stderr направлять в файл не следует.
Место "зависания" или аварийного завершения программы можно определить, включив перед данным запуском системную трассировку программы (см.п.14.4). Последние записи в системной трассировке позволят найти место в программе, после которого произошла аварийная ситуация.
7. Параллельное выполнение с реальными данными
Если различий на предыдущих шагах не обнаружено, то можно считать программу отлаженной на тестовых данных и переходить к параллельному выполнению программы на кластере рабочих станций с реальными данными.
Для этого служат команды компиляции:
dvm c [опции C-DVM
конвертора] <имя DVM-программы>
dvm f [опции F-DVM конвертора] <имя DVM-программы>
выполнения:
dvm run [N1 [N2 [N3]]] [<опции_кластера>] <имя DVM-программы>
где N1, N2, N3 - размеры матрицы процессоров (по умолчанию – 1 1 1).
По умолчанию запуск управляется параметрами из наборов, заданных в переменных окружения dvmpar и usrpar.
Если при выполнении программы с реальными данными результаты вычислений не удовлетворяют пользователя, то он может снова получить варианты программы для последовательного и параллельного выполнения для того, чтобы трассировать программу уже с реальными данными. Однако следует учитывать, что:
объем трассировки программ может быть очень большим; поэтому перед выводом трассировки следует оценить ее объем как для всей программы в целом, так и для отдельных ее частей(см.п.13.1).
по умолчанию команды csdeb, fsdeb и cpdeb, fpdeb (см.п.13.3) используют опции конверторов –d4, что может значительно увеличить время выполнения программы; поэтому для получения отладочных вариантов программ для запуска с реальными данными (например, для накопления и сравнения трассировок вычислений) следует воспользоваться другими опциями (-d1, -d2 или -d3).
Команды можно использовать для платформ, обеспечивающих интерактивный режим выполнения программ.
dvm ftest [матрица процессоров] <имя_DVM-программы>
dvm сtest [матрица процессоров] <имя_DVM-программы>
Результат работы: конкатенация результатов работы команд, объединенных в команду комплексного прогона.
При запуске программ перечисленными в этой главе производными dvm-командами, но с нестандартным параметрами (с использованием своих собственных корректирующих наборов параметров), пользователь должен учитывать последовательность, которой следует система поддержки при коррекции параметров:
сначала берется один из базовых наборов параметров из файлов с расширениями .rel или .deb (см.п.14);
затем базовый набор корректируется параметрами из файлов, перечисленных в переменной окружения usrpar (см.п.7);
затем скорректированный набор еще раз корректируется параметрами из файла, определенного для конкретной производной dvm-команды.
Приведенная последовательность коррекции параметров отражается в текущей директории пользователя в файле current.par, используемом системой поддержки при выполнении любой dvm-команды.
Базовые наборы параметров, управляющих работой системы поддержки, передается пользователю вместе с DVM-системой и располагается в директории dvm_sys/par. Имена файлов отражают назначение содержащихся в них параметров, а именно:
checksum |
- |
контрольные суммы перечисленных ниже файлов параметров (проверяются только при запуске с файлами параметров с расширением .rel без их коррекции); |
statist |
- |
паpаметpы, задающие режимы сбора данных для работы анализатора производительности DVM-программ; |
sysdebug |
- |
паpаметpы встpоенных сpедств отладки системы поддержки; |
syspar |
- |
паpаметpы, упpавляющие функционированием системы поддеpжки; |
systrace |
- |
паpаметpы, задающие режимы системной тpассиpовки; |
trcevent |
- |
перечень и паpаметpы тpассиpуемых событий; |
usrdebug |
- |
параметры динамического контроля и трассировки программы пользователя |
Расширения имен файлов отражают способ применения данного подмножества параметров, а именно:
rel |
- |
набор параметров, предназначенный для максимально быстрого выполнения программы; |
deb |
- |
набор параметров, предназначенный для отладки программы пользователя и системы поддержки; встроенные в систему поддержки средства внутреннего самоконтроля, сбора системной трассировки и выдачи информационных сообщений в нем включены; |
par |
- |
наборы корректирующих параметров. |
К корректирующим наборам параметров относятся файлы с именами:
deb_err, deb_trc, deb_red, deb_dif, deb_size, deb_ptrc |
- |
параметры, используемые для выполнения dvm-команд в соответствии с методикой отладки программ (см.п.13); |
out |
- |
паpаметpы вывода информационных сообщений системы поддержки, действующие, если переменная окружения dvmout=on (см.п.7 и п.14.3); |
outoff |
- |
паpаметpы вывода информационных сообщений системы поддержки, действующие, если переменная окружения dvmout=off (см.п.7 и п.14.3). |
Пользователь выбирает наиболее подходящий для его целей базовый набор, задав соответствующее расширение в переменной окружения dvmpar. Он может также иметь собственные наборы параметров (в любой из своих рабочих директорий и с любыми именами и расширениями файлов), корректирующие базовый набор. В них пользователь задает только те параметры (содержащиеся в любом из файлов с расширениями .rel или .deb), значения которых он желает скорректировать. Эти директории и имена файлов должны быть перечислены в переменной окружения usrpar файла запуска dvm-команд (см.п.7).
Все параметры базового набора снабжены комментариями. Полные списки параметров динамического контроля и пользовательской трассировки приведены в п.14.1 и п.14.2. Параметры вывода информационных сообщений системы поддержки и основные параметры управления системной трассировкой (как наиболее часто используемые при отладке программ) рассмотрены в п. 14.3 и п.14.4.
Перечисленные ниже параметры содержатся в файлах с именем usrdebug.
Динамическим контролем используются следующие значения:
EnableDynControl – динамический контроль выполняется, если параметр больше 0, и динамический контроль запрещен при значении 0.
DebugOptions.ErrorFile – имя файла с диагностикой об ошибках. В данный файл выводятся сообщения об ошибках, найденных при динамическом контроле, если значение параметра DebugOptions.ErrorToScreen равно 0. Если попытки открытия файла окажутся неуспешными, то диагностика будет выводиться на экран.
DebugOptions.HashIndexSize – размер индекса хеш-таблицы для таблицы переменных.
DebugOptions.HashTableSize – размер массивов хеш-таблиц.
DebugOptions.VarTableSize – размер таблиц переменных.
DebugOptions.ErrorToScreen – если значение не равно 0, то вся диагностика динамического контроля выводится на экран.
DebugOptions.PrintStatistic – если значение параметра не равно 0, то по окончании работы программы печатается статистика работы с таблицей переменных. Статистика выводится в файл DebugOptions.ErrorFile или на экран в зависимости от значения параметра DebugOptions.ErrorToScreen.
DebugOptions.AppendErrorFile – определяет режим записи в файл диагностики при его использовании. Если значение равно 0, то при каждом запуске задачи содержимое этого файла стирается.
DebugOptions.MaxErrors – определяет максимальное число ошибок, после которого динамический контроль будет отключен.
DebugOptions.CheckVarInitialization – если значение не равно 0, то разрешена проверка инициализации скалярных переменных.
DebugOptions.CheckReductionAccess – если значение не равно 0, то разрешена проверка использования редукционных переменных.
DebugOptions.CheckDisArrInitialization – если значение не равно 0, то разрешена проверка инициализации элементов распределенных массивов.
DebugOptions.CheckDisArrLimits – если значение не равно 0, то разрешена проверка обращений к элементам распределенного массива за пределами его границ.
DebugOptions.CheckDisArrEdgeExchange – если значение не равно 0, то разрешена проверка обмена теневых граней распределенных массивов.
DebugOptions.CheckDisArrSequentialAccess – если значение не равно 0, то разрешена проверка использования элементов распределенных массивов в последовательной части программы.
DebugOptions.CheckDisArrLocalElm – если значение не равно 0, то разрешена проверка на принадлежность элемента распределенного массива его локальной части.
DebugOptions.CheckDataDependence – если значение не равно 0, то разрешена проверка на зависимость параллельных циклов по данным.
DebugOptions.CheckRemoteBufferAccess – если значение не равно 0, то разрешена проверка использования буферов удаленного доступа.
HashMethod – определяет алгоритм вычисления хеш-значения. 0 – используется функция StandartHashCalc, 1 – используется функция OffsetHashCalc.
HashOffsetValue – величина смещения для алгоритма OffsetHashCalc. Допускаются значения от 0 до 16.
Системой сравнения результатов выполнения используются тот же механизм задания параметров, что и системой динамического контроля. Существуют следующие параметры:
EnableTrace – обработка трассировки выполняется, если параметр больше 0, и не выполняется при значении 0.
ManualReductCalc – режим вычисления редукции. Используется обычный режим, если параметр равен 0, и используется режим ручного просчета редукции, если параметр больше 0.
TraceOptions.FileLoopInfo – имя конфигурационного файла трассировки без расширения. Берется из каталога, заданного в параметре TraceOptions.TracePath. Используется только в режиме накопления трассировки. По умолчанию "loops".
TraceOptions.TracePath – путь, где формируются и располагаются файлы системы сравнения результатов выполнения. По умолчанию "".
TraceOptions.InputTracePrefix – префикс имени входных файлов с трассой. По умолчанию "".
TraceOptions.OutputTracePrefix – префикс имени выходных файлов с трассой. По умолчанию "".
TraceOptions.Exp – точность сравнения вещественных чисел в режиме сравнения трассировок. По умолчанию 0.0001.
TraceOptions.RelCompareMin – минимальное значение знаменателя при вычислении относительной точности сравнения вещественных чисел. По умолчанию 1.0E-10.
TraceOptions.ExpIsAbsolute – параметр определяет тип используемой точности сравнения – абсолютная (по умолчанию, 1) или относительная (0).
TraceOptions.StrictCompare – параметр задает сравнение данных на полное совпадение. По умолчанию 0.
TraceOptions.TraceMode – режим системы сравнения результатов выполнения. По умолчанию 1. Возможны следующие значения:
0 |
– |
генерация конфигурационного файла трассировки. Файл формирует только процессор с номером TraceOptions.WrtHeaderProc; |
1 |
– |
накопление трассировки и запись в файл <номер процессора>.<TraceOptions.Ext>; |
2 |
– |
объединение двух предыдущих режимов; |
3 |
– |
сравнение трассировки с эталонной, заданной в файле TraceOptions.TraceFile. |
TraceOptions.TraceLevel – степень подробности трассировки по умолчанию. По умолчанию 3. Используется только в режиме сбора трассировки. Возможны следующие значения:
0 |
– |
отсутствие трассировки (уровень NONE); |
1 |
– |
трассировка начала и завершения циклов или областей задач и начала витков или задач (уровень MINIMAL); |
2 |
– |
предыдущий уровень, плюс трассировка модификаций переменных и результатов вычисления редукции (уровень MODIFY); |
3 |
– |
трассировка всех событий (уровень FULL). |
TraceOptions.ErrorToScreen – если значение не равно 0, то вся диагностика выводится на экран. По умолчанию 0.
TraceOptions.TableTraceSize – размер приращения таблицы трассировочных записей. По умолчанию 2048.
TraceOptions.HashIterIndex и TraceOptions.HashIterSize – параметры хеш-таблиц, используемых для поиска итераций. По умолчанию - 65534 и 65535 соответственно.
TraceOptions.ReductHashIndexSize, TraceOptions.ReductHashTableSize и TraceOptions.ReductVarTableSize – параметры таблицы переменных, используемой для хранения редукционных переменных. По умолчанию все равны 32.
TraceOptions.WriteEmptyIter – если значение не равно 0, то из трассировки исключаются записи, соответствующие началу витка и задачи, если внутри витков и задач нет обращений к переменным или вложенных конструкций. По умолчанию 0.
TraceOptions.MaxErrors – максимальное число ошибок (для всех процессоров), после которого будет отключено накопление или сравнение трассировки. По умолчанию 1000.
TraceOptions.SeqLdivParContextOnly – параметр определяет будет ли множество итераций последовательных циклов дробиться на граничные и внутренние блоки только в параллельном контексте (1) или всегда (0). По умолчанию 0.
TraceOptions.SubstRedResults – параметр определяет будет ли осуществляться подмена результатов редукционных операций на эталонные в случае нахождения их в пределах заданной точности. 1 – да, 0 – нет. По умолчанию 0.
TraceOptions.DisableRedArrays – параметр позволяет отключить обработку отладчиком редукционных массивов. 1 – отключить, 0 – нет. По умолчанию 0.
TraceOptions.SRCLocCompareMode – параметр позволяет не учитывать пути файлов (значение 1), пути и номера строк (значение 2), пути, номера строк и имена файлов (значение 3) при сравнении. По умолчанию 0.
TraceOptions.LocIterWidth – параметр определяет ширину границ для каждого параллельного цикла на каждом процессоре. По умолчанию 1.
TraceOptions.RepIterWidth – параметр определяет ширину границ последовательных циклов. По умолчанию 1.
TraceOptions.IterTraceMode – параметр определяет тип границ: 1 – «уголки», 2 – «грани», 0 – отключить разбиение на граничные и внутренние подмножества. По умолчанию 1.
TraceOptions.SetCoreSizeMax – параметр устанавливает максимальный размер core файла для Unix-систем равным максимально допустимому. По умолчанию 1.
TraceOptions.EnableNANChecks – параметр включает проверку на наличие значений NAN и INF в переменных программы. По умолчанию 1.
Следующие параметры являются параметрами системы поддержки выполнения параллельных программ, но их значения влияют на работу отладчика:
MaxTraceFileSize – максимальный размер файла с трассой.
MaxCommTraceFileSize – максимально допустимый суммарный размер файлов с трассой.
DynDebugMemoryLimit – максимально допустимое количество оперативной памяти в процессе отладки.
Перечисленные ниже параметры содержатся в файлах с именами syspar, statist, systrace, trcevent, sysdebug и usrdebug. По умолчанию будем считать, что параметр задается в файлах с именем syspar.
StdOutToFile – признак перевода стандартного выходного потока stdout в файл (файлы).
StdOutFileName – параметр, определяющий режим перенаправления и имя (имена) файла (файлов) для перевода потока stdout. Параметр имеет вид:
[<режим>][<путь>[.<расширение>]]
При ненулевом значении параметра StdOutToFile поток stdout переводится в файл (файлы) с именем (именами)
[<путь>][<номер процессора>].<расширение>
Если опция <расширение> не задана, то расширение файла (файлов) полагается равным 'sto'.
Опция <режим> определяет способ перенаправления потока stdout и может принимать значения "*" и "+". В первом случае перенаправление осуществляется на всех процессорах в отдельный для каждого процессора файл с приведённым выше именем. Во втором случае перенаправление также производится на всех процессорах, но в общий для всех процессоров файл с именем
<путь>.<расширение>
Причём, если опция <путь> (вместе с опцией <расширение>) не задана, то перенаправление осуществляется в файл с именем "stdout" (без расширения).
Если опция <режим> отсутствует, то перенаправление потока stdout производится только на процессоре с нулевым внутренним номером в файл <путь>.<расширение> (или в файл "stdout", если опция <путь> не задана).
StdErrToFile – признак перевода стандартного выходного потока stderr в файл (файлы).
StdErrFileName – параметр, определяющий режим перенаправления и имя (имена) файла (файлов) для перевода потока stderr. Параметр имеет вид:
[<режим>][<путь>[.<расширение>]]
При ненулевом значении параметра StdErrToFile поток stderr переводится в файл (файлы) с именем (именами)
[<путь>][<номер процессора>].<расширение>
Если опция <расширение> не задана, то расширение файла (файлов) полагается равным 'ste'.
Опция <режим> определяет способ перенаправления потока stderr и может принимать значения "*" и "+". В первом случае перенаправление осуществляется на всех процессорах в отдельный для каждого процессора файл с приведённым выше именем. Во втором случае перенаправление также производится на всех процессорах, но в общий для всех процессоров файл с именем
<путь>.<расширение>
Причём, если опция <путь> (вместе с опцией <расширение>) не задана, то перенаправление осуществляется в файл с именем "stderr" (без расширения).
Если опция <режим> отсутствует, то перенаправление потока stderr производится только на процессоре с нулевым внутренним номером в файл <путь>.<расширение> (или в файл "stderr", если опция <путь> не задана).
DelStdStream – признак уничтожения "старых" (оставшихся от предыдущего запуска) файлов с выходными потоками.
SysInfoPrint - общий признак включенного вывода информационных сообщений системы поддержки.
SysInfoStdOut - признак вывода информационных сообщений в поток stdout.
SysInfoStdErr - признак вывода информационных сообщений в поток stderr.
SysInfoFile - признак вывода информационных сообщений в файл.
SysInfoFileName - имя файла для информационных сообщений.
SysInfoSepFile - признак накопления информационных сообщений в отдельном для каждого процессора временном файле (при SysInfoFile=1), имеющем имя <внутренний номер процессора>.out. Перед завершением работы все временные файлы будут объединены в один, имя которого определено параметром SysInfoFileName, а затем уничтожены. При нулевом значении SysInfoSepFile каждый процессор направляет информационные сообщения непосредственно в файл, заданный параметром SysInfoFileName.
FatInfoNoOpen - признак завершения работы при неудачном открытии файла для информационных сообщений. При нулевом значении этого параметра система поддержки выведет предупреждение в поток сообщений об ошибках и продолжит выполнение программы без вывода информационных сообщений в файл.
DelSysInfo – признак уничтожения "старого" (оставшегося от предыдущего запуска) файла с информационными сообщениями.
VersStartPrint – признак вывода номера версии системы поддержки перед началом работы программы.
VersFullStartPrint – признак вывода номера версии системы поддержки и номеров версий всех файлов параметров перед началом работы программы.
VersFinishPrint – признак вывода номера версии системы поддержки после окончания работы программы.
VersFullFinishPrint – признак вывода номера версии системы поддержки и номеров версий всех файлов параметров после окончания работы программы.
SysParPrint – признак вывода параметров инициализации системы поддержки перед началом работы программы.
ProcListPrint – признак вывода таблицы процессоров перед началом работы программы. Для каждого процессора выводится его внутренний и внешний номера и идентификатор.
WeightListPrint – признак вывода весов координат процессоров перед началом работы программы.
ParamRunPrint – признак вывода информации о параметрах и режимах запуска системы поддержки перед началом работы программы (стандартный или нестандартный запуск, тип базовой системы передачи сообщений и т. д.).
EndProgMemoryPrint – признак вывода информации о не освобожденной памяти при завершении работы.
EndProgObjectPrint – признак вывода информации о не уничтоженных DVM-объектах при завершении работы.
EndProgCheckSumPrint – признак вывода информации о состоянии контролируемых областей памяти при завершении работы.
InputParPrint – признак вывода сообщений о начале ввода каждого файла параметров.
EndReadParPrint – признак вывода сообщений о завершении ввода каждого файла параметров.
TimeExpendPrint - режим вывода информации о расходе времени программой. При нулевом значении данного параметра информация о расходе времени не выводится. Единичное значение задает краткий режим вывода информации о расходе времени, большее единицы (2,3,4,5) – подробный. Параметр задается в файлах с именем statist.
CallCountPrint – признак вывода статистики обращений к функциям системы подддержки, доступным программе пользователя (для каждой функции сообщается число обращений к ней). Параметр задается в файлах с именем statist. При единичном значении CallCountPrint выводится информация только о функциях, к которым было хотя бы одно обращение, а при значении, равном 2 – обо всех функциях.
TraceClosePrint – признак вывода сообщений о завершении выгрузки каждого буфера с накопленной системной трассировкой в файл (при трассировке в буфер оперативной памяти). Параметр задается в файлах с именем systrace.
DbgInfoPrint – признак вывода информационных сообщений подсистемы динамического контроля и трассировки вычислений. Параметр задается в файлах с именем usrdebug.
Управление режимами трассировки и составом трассируемых событий осуществляется с помощью параметров, содержащихся в файлах systrace.* и trcevent.*. Рассмотрим основные из них. По умолчанию считается, что параметр содержится в файлах systrace.* .
Is_DVM_TRACE - ненулевое значение этого параметра является общим признаком включенной трассировки.
Is_ALL_TRACE - признак трассировки всех функций системы поддержки (кроме функций обращения к DVM-отладчику и к подсистеме сбора статистики).
Is_DEB_TRACE - признак трассировки функций обращения к DVM-отладчику.
Is_STAT_TRACE - признак трассировки функций обращения к подсистеме сбора информации для анализатора производительности.
TraceProcList - список внутренних номеров процессоров с включенной трассировкой. При общем включении трассировки она функционирует только на тех процессорах, которые заданы в этом списке. Трассировка на главном процессоре накапливается всегда, вне зависимости от наличия его номера (нулевого) в списке TraceProcList.
IsTraceProcList - признак включенного списка TraceProcList. При нулевом значении этого параметра трассировка накапливается на всех процессорах.
IsEvent[<номер события>] - равное 1 или 2 значение этого параметра является признаком включенной трассировки события с номером <номер события>. Значение 2 задает трассировку заданного события в расширенном режиме вне зависимости от наличия общего режима расширенной трассировки. Нулевое значение параметра выключает трассировку заданного события. Параметр содержится в файлах trcevent.* . Стандартно (т. е. в базовых наборах параметров) трассировка всех событий включена, а трассировка событий с номерами 0, 1, 2 и 3 - включена в расширенном режиме.
DisableTraceEvents - список номеров событий (через запятую), трассировка которых выключена. Список DisableTraceEvents отменяет трассировку заданных в нём событий, включённую ранее параметром IsEvent. Признаком конца списка DisableTraceEvents является номер события, равный -1. Отмена трассировки событий с номерами 0, 1, 2 и 3 не допускается.
IsDisableTraceEvents - признак включённого списка DisableTraceEvents. При нулевом значении этого параметра отмена трассировки событий не производится.
BlockTrace - признак отложенного включения трассировки. При общем включении трассировки накопление начинается только по специальному указанию, осуществляемому с помощью функции void tron(void). Включенная трассировка может быть выключена функцией void troff(void) (а затем снова включена и т. д.).
TracePath - имя директории, в которую помещаются файлы с трассировкой (как при трассировке в буфер, так и при трассировке непосредственно в файл). Если задается не пустое имя директории, то оно должно заканчиваться символом "\" или "/".
ScreenTrace - ненулевое значение этого параметра означает вывод трассировки в поток информационных сообщений (признак вывода трассировки на "видеомонитор"). Трассировка, выводимая в поток информационных сообщений, не содержит информационных сообщений и сообщений об ошибках системы поддержки.
BufferTrace - признак накопления трассировки в буфер оперативной памяти.
TraceBufLength - длина буфера трассировки в байтах.
TraceBufferExt - расширение файлов с трассировкой при трассировке в буфер.
FileTrace - признак накопления трассировки непосредственно в файлах.
FatTraceNoOpen - признак завершения работы при неудачном открытии файла для непосредственного накопления трассировки. При нулевом значении этого параметра неудачное открытие файла будет отмечено предупреждением.
TraceFileExt - расширение файлов с трассировкой при трассировке непосредственно в файлы.
DelSysTrace – признак уничтожения "старых" (оставшихся от предыдущего запуска) файлов с трассировкой при инициализации системы поддержки.
FullTrace - общий признак расширенного режима трассировки.
FullTraceEvents - список номеров событий (через запятую), трассируемых в расширенном режиме (вне зависимости от общего признака расширенного режима трассировки, задаваемого параметром FullTrace). Признаком конца списка FullTraceEvents является номер события, равный -1. Список FullTraceEvents изменяет режим трассировки заданных в нём событий, но не включает ранее отменённую их трассировку.
IsFullTraceEvents - признак включённого списка FullTraceEvents. При нулевом значении этого параметра изменение режима трассировки событий, заданных в списке FullTraceEvents, не производится.
MaxTraceLevel - общая максимальная трассируемая глубина обращений к функциям. Нулевое значение этого параметра означает трассировку функций, непосредственно вызываемых программой пользователя.
MaxEventLevel[<номер события>] - максимальная трассируемая глубина обращений к функциям для события с номером <номер события>. Данный параметр имеет приоритет над параметром MaxTraceLevel. Параметр содержится в файлах trcevent.*
FullBufferStop - признак останова трассировки при исчерпании буфера. Нулевое значение этого параметра устанавливает сохранение последней информации при исчерпании буфера путем замещения ею наиболее старой информации.
BufferTraceUnLoad – признак выгрузки в файлы накопленной в буферах трассировки перед завершением выполнения программы. При нулевом значении этого параметра система поддержки не выгружает в файлы накопленную в буферах трассировку, возлагая эту работу на запускаемую при необходимости автономную программу-дамп.
LowDumpLevel – признак выгрузки в файлы накопленной в буферах трассировки с помощью функций ввода/вывода нижнего уровня. Выгрузка буферов с трассировкой функциями ввода/вывода верхнего уровня осуществляется несколько медленнее.
SetTraceBuf - признак трассировки непосредственно в файлы с буферизацией, осуществляемой операционной системой. Режим трассировки с буферизацией устанавливается с помощью функции setbuf сразу после открытия потока трассировки.
TraceFlush - признак выталкивания информации трассировки из буфера операционной системы в файл после каждого события (при трассировке непосредственно в файлы). Режим, задаваемый данным параметром, функционирует только в том случае, если трассировка осуществляется с буферизацией (параметр SetTraceBuf задан ненулевым).
KeyWordName - признак вывода последовательности символов "NAME=" перед именем каждого события.
PreUnderLine - признак подчеркивания заголовка каждого события (заголовок события - это строка трассировки, содержащая имя события, время, имя файла и номер строки).
PreUnderLining - строка подчеркивания заголовка каждого события.
PostUnderLine - признак подчеркивания строки, завершающей выводимую по каждому событию информацию.
PostUnderLining - строка подчеркивания выводимой по каждому событию информации.
BufferTraceShift – коэффициент сдвига вправо выводимой информации при трассировке в буфер. Каждой выводимой строке будет предшествовать пробелы в количестве, равном произведению данного параметра на текущую глубину обращений к трассируемым функциям.
FileTraceShift - коэффициент сдвига вправо выводимой информации при трассировке непосредственно в файлы.
CurrentTimeTrace - признак вывода текущего системного времени вслед за временем, прошедшим с предыдущего события трассировки.
TimePrecision – число знаков после запятой при выводе времени, прошедшего c предыдущего события трассировки, а также при выводе текущего системного времени.
В процессе накопления трассировочной информации система поддержки может контролировать определенные области оперативной памяти, при изменении содержимого которых она завершает выполнение программы с выводом соответствующего сообщения об ошибке. К таким областям относятся:
левые (нижние) и правые (верхние) контрольные части каждого динамически запрошенного блока памяти;
область памяти, явно задаваемая в файлах параметров systrace.* своими начальным и конечным адресами;
область памяти с программным кодом пользовательской программы и системы поддержки (память команд).
Контрольные части динамически запрашиваемых блоков памяти создаются при специальном указании в файлах параметров sysdebug.* и расписываются при выделении блока задаваемым там же кодом. Контроль их содержимого может осуществляться при каждом запросе и освобождении блока памяти, а также в процессе трассировки.
Явно задаваемая область памяти контролируется путем сравнения ее эталонной контрольной суммы с текущей. Эталонная контрольная сумма вычисляется при инициализации системы поддержки.
Начальный и конечный адреса области памяти с программным кодом задаются программой, запускающей на выполнение систему поддержки, посредством записи этих адресов в ее (системы поддержки) исполняемый модуль. Эта же программа вычисляет и записывает в исполняемый модуль системы поддержки эталонную контрольную сумму памяти команд. Система поддержки в процессе своего функционирования (в частности, по событиям трассировки) контролирует память команд, сравнивая ее текущую контрольную сумму с эталонной.
Управление механизмами контроля областей памяти осуществляется с помощью следующих параметров файлов systrace.* .
EveryEventCheckBound - признак контроля всех динамически запрошенных блоков памяти по каждому трассируемому событию.
EveryTraceCheckBound - признак контроля всех динамически запрошенных блоков памяти при каждом обращении к функциям вывода трассировки. Данный контроль включает в себя контроль, задаваемый параметром EveryEventCheckBound, поскольку осуществляется и по не трассируемым (выключенным) событиям.
dvm_StartAddr - начальный адрес, контролируемый при трассировке области памяти.
dvm_FinalAddr - конечный адрес контролируемой при трассировке области памяти.
EveryEventCheckMem - признак контроля области памяти, заданной параметрами dvm_StartAddr и dvm_FinalAddr, при каждом трассируемом событии.
EveryTraceCheckMem - признак контроля заданной параметрами dvm_StartAddr и dvm_FinalAddr области памяти при каждом обращении к функциям вывода трассировки. Данный контроль включает в себя контроль, задаваемый параметром EveryEventCheckMem, т.к. проводится и по выключенным событиям трассировки.
EveryEventCheckCodeMem - признак контроля области памяти с программным кодом по каждому трассируемому событию.
EveryTraceCheckCodeMem - признак контроля области памяти с программным кодом при каждом обращении к функциям вывода трассировки. Данный контроль включает в себя контроль, задаваемый параметром EveryEventCheckCodeMem.
distr_Trace – признак вывода дополнительной информации при трассировке функции distr_ . Выводится карта отображения представления абстрактной машины, диапазоны локальных значений индексов для каждого измерения представления абстрактной машины, признак размножения по всем измерениям процессорной подсистемы (Repl) и признак отображения на каждый процессор какого либо (не обязательно одного и того же) элемента представления абстрактной машины (Every).
align_Trace – признак вывода дополнительной информации при трассировке функции align_ . Выводится карта отображения распределенного массива и диапазоны локальных значений индексов для каждого его измерения.
dacopy_Trace – признак вывода дополнительной информации при трассировке функций arrcpy_ и aarrcp_. Выводятся карты отображения распределённых массивов, диапазоны локальных значений индексов для каждого измерения, информация о ветвях выполнения программы копирования и другая информация.
mappl_Trace – режим вывода дополнительной информации при трассировке функции mappl_:
0 |
- |
не выводить дополнительной информации; |
1 |
- |
выводить выходные начальные и конечные значения индексных переменных параллельного цикла для текущего процессора; |
2 |
- |
дополнительно выводить карту отображения цикла. |
dopl_Trace – признак вывода дополнительной информации при трассировке функции dopl_ . Выводится очередная порция диапазонов локальных значений индексов для каждого измерения параллельного цикла.
RedVarTrace – признак вывода адресов, типов и значений всех переменных редукционной группы при выполнении функций insred_, saverv_, saverd_ и strtrd_, а также в начале и конце выполнения функции waitrd_. При положительном значении RedVarTrace выводится информация о первых min(RedVarTrace, RedVarNumber) элементах редукционной переменной-массива.
OutIndexTrace – признак вывода выходных значений индексов для каждого измерения распределенного массива при выполнении внутренней функции системы поддержки GetIndexArray.
diter_Trace – признак вывода массива индексов при трассировке функции взаимодействия с DVM-отладчиком diter_.
drmbuf_Trace – признак вывода массива индексов при трассировке функции взаимодействия с DVM-отладчиком drmbuf_.
LoadWeightTrace - признак трассировки массивов с координатными весами загрузки процессоров при вызове функции setelw_.
WeightArrayTrace - признак трассировки массива с координатными весами загрузки при выходе из функции gettar_.
AcrossTrace - признак трассировки функционирования схем ACROSS.
Сообщения об ошибках, возникающих в процессе функционирования системы поддержки, делятся (по степени серьезности последних) на предупреждения и сообщения об ошибках, прерывающих выполнение программы. Ошибки, прерывающие выполнение программы, могут быть обычными, ответственность за которые лежит (скорее всего) на пользователе, и фатальными, требующими, возможно, участия разработчика или его представителя.
В соответствии с этим сообщения об ошибках имеют один из следующих видов:
*** RTS warning |
<номер класса ошибки> . <номер ошибки внутри класса> : <текст сообщения об ошибке> |
*** RTS err |
<номер класса ошибки> . <номер ошибки внутри класса> : <текст сообщения об ошибке> |
*** RTS fatal err |
<номер класса ошибки> . <номер ошибки внутри класса> : <текст сообщения об ошибке> |
Класс ошибки определяется функциональной и модульной структурой системы поддержки.
Каждое сообщение об ошибке завершает вывод имени файла и номера строки, в которой произошла ошибка, как пользовательской программы, так и системы поддержки:
USRFILE=<имя файла программы пользователя>; USRLINE=<номер строки>;
SYSFILE=<имя файла системы поддержки>; SYSLINE =<номер строки>;
По характеру возникновения ошибки делятся на две группы. Первую группу составляют ошибки, возникающие только на всех процессорах сразу. Сообщения об этих ошибках выводит процессор ввода/вывода. Вторая группа состоит из ошибок, которые могут происходить не на всех процессорах "одновременно". Сообщения о таких ошибках выводит каждый процессор самостоятельно, сопровождая каждое сообщение своими внутренним и внешним номерами. При работе на одном процессоре все сообщения об ошибках выводятся без его номеров.
В системе поддержки предусмотрены возможности вывода всех сообщений об ошибках первой группы всеми процессорами и вывода всех сообщений об ошибках второй группы только процессором ввода/вывода. Первая возможность достигается установкой значения параметра MultiProcErrReg (файлы параметров с именем syspar) равным 2. Для вывода сообщений об ошибках второй группы только процессором ввода/вывода значение этого параметра должно быть нулевым (эта возможность используется только в экспериментальных целях). Стандартное значение параметра MultiProcErrReg равно единице.
Все сообщения об ошибках с их тематическим разбиением и в порядке возрастания номеров классов и номеров ошибок внутри класса рассмотрены в документе "Система поддержки DVM-программ. Детальный дизайн" (файл rtsDDr.doc).
Ниже перечислены номера сообщений, сгруппированных по возможным причинам их возникновения. Номера сообщений "fatal error" опущены. Не рассматриваются также ошибки, которые не могут возникать в программах, генерируемых компиляторами C-DVM и F-DVM (при правильной работе компиляторов), а возможны только при программировании непосредственно с помощью функций системы поддержки (впрочем, при "затирании" памяти программой пользователя в любой программе возможны любые ошибки).
Эти ошибки диагностируются сообщениями с номерами
01x.xxx и 02x.xxx.
Среди них:
сообщения об ошибке открытия входных и выходных файлов (файлы параметров, файлы вывода информационных сообщений, файлы перенаправления stdout и stderr, файлы трассировки); они могут быть вызваны недоступностью или отсутствием файлов (директорий) или неправильными правами доступа для создания файлов;
сообщения о несоответствии версий системы и файлов параметров;
сообщения о синтаксических ошибках в файлах параметров (в т.ч. неправильные ключевые слова, значения индексов, неверное или не задано значение параметра);
сообщения о нехватке памяти для системных буферов;
сообщения об ошибке записи файла трассировки.
Кроме того, при завершении программы возможны также сообщения с номерами 022.002 и 022.003, свидетельствующие о неверной контрольной сумме памяти команд или данных, т.е. об изменении памяти, которая не должна была изменяться ("затирание памяти").
Во время выполнения программы о "затирании" памяти могут говорить также сообщения со следующими номерами: 230.000, 230.001, 230.002, 230.003, 230.004, 250.000, 250.001.
"Объект, заданный при обращении к функции, не является DVM-объектом".
Возможная причина: объект используется до его создания/инициализации или когда объект уже уничтожен.
Номера сообщений:
030.000, 030.010, 030.020, 032.000, 032.010, 032.015, 032.020, 032.030, 032.050, 032.070, 032.080, 032.085, 036.000, 036.010, 036.060, 036.066, 037.000, 037.010, 037.020, 038.000, 038.010, 038.012, 038.014, 038.032, 038.038, 038.040, 038.050, 044.000, 044.040, 046.011, 046.014, 046.050, 046.054, 046.090, 060.010, 060.065, 060.075, 060.115, 065.000, 065.003, 065.020, 069.020, 070.000, 070.002, 070.010, 070.016, 070.030, 070.040, 070.050, 070.060, 070.070, 070.080, 080.000, 080.020, 080.040, 080.050, 080.060, 080.070, 080.080, 080.150, 080.160, 080.200, 080.250, 120.006, 130.065, 132.010, 132.030, 132.040, 132.050, 144.010, 144.030, 144.040, 144.050, 219.000.
"Объект, заданный при обращении к функции, не является объектом нужного вида".
Соответствие вида объекта и выполняемой операции как правило контролируется C-DVM и F-DVM компиляторами. Возникновение такой ошибки при выполнении программы скорее всего вызвано "затиранием" [дескриптора] объекта.
Номера сообщений:
030.001, 030.011, 030.021, 032.001, 032.011, 032.016, 032.021, 032.031, 032.051, 032.071, 032.081, 032.086, 036.001, 036.011, 036.061, 036.067, 037.001, 037.011, 037.021, 038.001, 038.011, 038.013, 038.015, 038.033, 038.039, 038.041, 038.051, 040.005, 040.008, 040.010, 044.001, 044.002, 044.041, 044.042, 044.060, 046.000, 046.010, 046.012, 046.015, 046.051, 046.052, 046.055, 046.091, 060.011, 060.012, 060.013, 060.050, 060.051, 060.060, 060.061, 060.066, 060.070, 060.071, 060.076, 060.080, 060.081, 060.090, 060.091, 060.100, 060.116, 060.200, 065.001, 065.004, 065.021, 069.021, 070.001, 070.003, 070.008, 070.014, 070.031, 070.041, 070.051, 070.061, 070.071, 070.081, 080.001, 080.002, 080.021, 080.022, 080.041, 080.051, 080.061, 080.071, 080.081, 080.151, 080.161, 080.201, 080.202, 080.251, 080.252, 090.000, 090.001, 090.010, 090.011, 090.020, 090.030, 090.040, 090.050, 090.051, 090.060, 092.000, 092.001, 092.010, 092.011, 092.020, 094.000, 096.000, 110.000, 110.003, 110.009, 110.012, 120.000, 120.001, 120.002, 120.003, 120.005, 130.001, 130.004, 130.005, 130.031, 130.035, 130.061, 130.066, 131.000, 131.001, 131.020, 131.022, 131.040, 131.042, 132.011, 132.014, 132.016, 132.031, 132.041, 132.051, 133.001, 133.004, 133.005, 140.001, 140.020, 140.021, 140.030, 141.001, 141.030, 143.000, 143.001, 143.020, 143.022, 143.040, 143.042, 144.011, 144.014, 144.016, 144.031, 144.041, 144.051, 219.001, 219.010, 219.011, 219.020, 219.021.
"Процессорная система, заданная при обращении к функции, не является текущей/родительской процессорной системой или непосредственной или косвенной её подсистемой".
Сообщения диагностируют нарушение иерархии подсистем. Например, подзадача пытается использовать/изменять объект, принадлежащий более высокому уровню иерархии.
Номера сообщений:
032.012, 032.013, 032.032, 032.052, 032.082, 032.083, 036.012, 036.013, 036.068, 036.069, 038.025, 038.026, 038.042, 038.043, 044.003, 044.044, 044.045, 046.017, 046.058, 046.059, 070.013, 070.027, 080.006, 080.025, 080.047, 080.057, 080.067, 080.157, 080.167, 080.206, 080.255, 090.004, 090.005, 090.014, 090.015, 090.023, 090.024, 092.004, 092.005, 092.014, 092.015, 092.023, 092.024, 094.006, 094.007, 096.006, 096.007, 101.001, 101.011, 110.002, 110.005, 110.011, 110.014, 130.003, 130.033, 130.037, 130.063, 130.067, 131.004, 131.005, 132.032, 132.033, 133.003, 140.003, 140.033, 141.003, 141.033, 143.004, 143.005, 144.032, 144.033, 219.002.
"Заданный при обращении к функции объект создан не в текущей подзадаче" и "Заданная при обращении к функции асинхронная операция запущена не текущей подзадачей".
Сообщения диагностируют нарушение иерархии подсистем. Например, подзадача пытается использовать/изменять объект, принадлежащий другой подзадаче. Или подзадача осуществила попытку ожидания асинхронной операции (т.е. реализуемой парой операторов START-WAIT), запущенной другой подзадачей.
Номера сообщений:
060.067, 060.077, 060.117, 065.006, 069.022, 070.005, 070.006, 070.032, 070.042, 070.052, 070.062, 070.072, 070.082, 080.003, 080.023, 080.056, 080.066, 080.073, 080.082, 080.156, 080.166, 080.203, 080.253, 120.008, 131.023, 131.043, 132.012, 132.017, 132.042, 132.052, 143.023, 143.043, 144.012, 144.017, 144.042, 144.052.
Вероятная причина таких ошибок - нарушение порядка создания/использования массивов и других DVM-объектов. Например, массив A, выровненный на массив B, может быть создан (оператором malloc) только если массив B уже существует (создан). Аналогично, параллельный цикл по массиву может быть выполнен только если массив уже существует. Или наоборот, выполняется повторное создание объекта. Заметим, что повторное создание массива (malloc) в последовательной программе могло пройти незамеченным; а (повторное) создание темплейта или группы границ вообще невидимо для последовательной программы.
Номера сообщений:
032.017, 032.088, 036.002, 036.003, 036.014, 036.051, 038.002, 038.020, 038.021, 038.024, 038.031, 040.000, 040.006, 044.005, 044.006, 044.047, 046.001, 046.019, 046.020, 046.061, 060.014, 060.015, 060.052, 060.062, 060.072, 060.082, 060.101, 060.201, 065.007, 065.009, 065.022, 070.009, 070.015, 080.005, 080.024, 080.205, 080.254, 090.002, 090.003, 090.012, 090.013, 090.021, 090.022, 090.041, 090.031, 090.052, 090.053, 090.061, 092.002, 092.003, 092.012, 092.013, 092.021, 092.022, 094.004, 094.005, 096.004, 096.005, 101.000, 101.010, 110.001, 110.004, 110.010, 110.013, 130.000, 130.002, 130.006, 130.030, 130.032, 130.036, 130.060, 130.062, 133.000, 133.002, 133.006, 140.000, 140.002, 140.022, 140.032, 141.000, 141.002, 141.032, 219.012, 219.022.
Такого рода ошибки являются следствием нарушения последовательности действий с DVM-объектами: группами редукционных операций и теневых граней, буферами удаленного доступа и т.д. Например, повторный запуск операции до завершения запущенной, запуск операции с пустой группой, ожидание завершения незапущенной операции, включение переменных (массивов) в группу во время выполнения операции с этой группой, удаление объекта во время выполнения операции и т.п.
Номера сообщений:
060.120, 060.140, 069.023, 070.004, 070.033, 070.034, 070.044, 070.053, 070.054, 070.063, 070.073, 070.083, 080.007, 080.008, 080.009, 080.010, 080.011, 080.026, 080.027, 080.028, 080.029, 080.030, 080.042, 080.043, 080.044, 080.045, 080.046, 080.052, 080.053, 080.054, 080.062, 080.063, 080.064, 080.072, 080.083, 080.152, 080.153, 080.154, 080.162, 080.163, 080.164, 080.207, 080.208, 080.209, 080.210, 080.211, 080.256, 080.257, 080.258, 080.259, 080.260, 131.003, 131.024, 131.044, 131.045, 132.013, 132.019, 132.034, 132.043, 132.053, 143.003, 143.024, 143.044, 143.045, 144.013, 144.019, 144.034, 144.043, 144.053.
Ошибки данного типа возникают при выходе индекса за граница некоторой размерности DVM-объекта (например, при выравнивании массива или описании параллельного цикла), индексировании по несуществующей размерности, неправильном соотношении между индексами (например, начальный индекс больше конечного), неверной размерности DVM-объекта и т.п. Некорректные значения могут передаваться системе поддержки, например, в векторе GENBLOCK или как размеры теневых граней (или в результате "затирания" памяти). Сообщения системы поддержки могут содержать выражение вида (<равенство или неравенство>) - нарушенное соотношение. Описание величин, включенных в каждое такое сообщение, можно найти в документе "Система поддержки DVM-программ. Детальный дизайн" (файл rtsDDr.doc).
Номера сообщений:
030.022, 030.023, 032.019, 032.022, 032.035, 032.036, 032.037, 032.038, 032.039, 032.055, 032.056, 032.057, 032.090, 032.091, 032.092, 036.020. 036.021, 036.022, 036.023, 036.024, 036.025, 036.026, 037.002, 037.003, 037.012, 037.022, 038.016, 038.017, 038.044, 038.045, 040.001, 040.002, 040.003, 044.019, 044.020, 044.021, 044.022, 044.023, 044.024, 044.025, 044.026, 044.027, 044.028, 046.013, 046.016, 046.030, 046.031, 046.056, 046.057, 060.000, 060.001, 060.019, 060.020, 060.021, 060.022, 060.023, 060.024, 060.025, 060.026, 060.027, 060.028, 060.029, 060.030, 069.000, 069.001, 069.002, 069.003, 069.024, 080.014, 080.015, 080.031, 080.032, 080.033, 080.034, 080.035, 080.214, 080.215, 080.216, 080.220, 080.225, 080.226, 080.227, 080.230, 080.235, 080.236, 080.237, 080.261, 080.264, 080.265, 080.266, 080.270, 080.275, 080.276, 080.277, 080.280, 080.285, 080.286, 080.287, 080.290, 080.291, 094.001, 094.002, 094.003, 096.001, 096.002, 096.003, 110.006, 110.015, 120.004, 120.200, 130.010, 130.011, 130.012, 130.013, 130.014, 130.015, 130.016, 130.017, 130.018, 130.019, 130.040, 130.041, 130.042, 130.043, 130.044, 130.045, 130.046, 130.047, 130.070, 140.010, 140.011, 140.023, 140.031. 140.036, 140.037, 140.038, 140.041, 140.042, 140.043, 140.044, 141.010, 141.011, 141.031, 141.036, 141.037, 141.038, 219.015, 219.016, 219.017, 219.025, 219.026, 219.027.
Перераспределение или переотображение массива или темплейта, которое не было разрешено при его создании или невозможно.
Номера сообщений:
030.002, 036.050, 036.065, 038.030, 038.037, 044.043, 046.053, 065.005, 065.010.
Попытка выполнения параллельного цикла с изменённым порядком витков по схеме ACCROSS (по схеме выполнения циклов с зависимостью по данным между витками).
Номера сообщений: 060.110, 060.111.
Попытка расширения множества локальных витков параллельного цикла с изменённым порядком выполнения витков.
Номера сообщений: 060.210, 060.211.
Включение одной и той же редукционной переменной в две различные группы.
Номер сообщения: 070.007.
Массивы в поддирективе SHADOW_START или SHADOW_WAIT параллельного цикла распределены иначе, чем сам цикл.
Номер сообщения: 060.040.
Неверно распределённые объекты в нерегулярном удалённом доступе (например, число распределённых измерений удалённого массива не равно единице).
Номера сообщений: 140.004, 140.034, 140.035, 140.040, 140.050, 140.051, 141.004, 141.034, 141.035.
Ошибки данного вида возникают при нехватке памяти для задачи или из-за ошибок в размерах создаваемых массивах. Ошибки запроса памяти возможны также при "затирании" памяти программой пользователя или при её "зацикливании".
Номера сообщений:
200.000, 200.001, 200.002, 200.003, 200.004, 200.005, 200.006, 200.007, 200.008.
Следующие сообщения выдаются, когда создано слишком много объектов (распределенных массивов, буферов удаленного доступа). В C-DVM такие ошибки могут быть вызваны несбалансированностью операторов malloc и free для распределенных массивов или использованием локальных в функции (или блоке) "статических" распределенных массивов (т.е. массивов с константными размерностями).
Номера сообщений:
040.004, 040.007, 130.029, 140.060.
Ошибки передачи сообщений являются результатом неверного взаимодействия системы поддержки с системой передачи сообщений.
Причиной могут служить:
ошибки в аппаратуре;
ошибки в системе передачи сообщений или её неверная инсталляция;
неправильная компиляция системы поддержки;
"затирание" внутренних таблиц системы поддержки программой пользователя.
Рекомендуется обратиться к разработчику или его представителю.
Номера сообщений:
210.000, 210.001, 210.002, 210.003, 210.004, 210.005, 212.000, 212.001, 212.002, 212.003, 213.000, 213.001, 213.002, 214.000, 214.001, 219.003.
Файл системной трассировки имеет следующую структуру:
событие обращения к функции имеет имя call_<имя функции>,
событие возврата из функции имеет имя ret_<имя функции> .
Трассировка каждого события может быть включена и выключена по его номеру (см. п.6 и п.14.4).
Состав накапливаемой при трассировке информации определяется режимом трассировки. При кратком режиме выводится:
имя события;
время, прошедшее с предыдущего события;
имя файла пользовательской программы и номер строки в нем, определяющие точку произошедшего события в программе.
При подробном режиме трассировки сохраняемая информация расширяется и зависит от типа события. Если событием является обращение к функции, то выводятся ее входные параметры. При возврате из функции выводятся ее выходные параметры. Для каждого события может быть задан подробный режим трассировки вне зависимости от общего режима.
Накапливаемая при трассировке информация содержит также все информационные сообщения и сообщения об ошибках системы поддержки.
Для наглядности изображения вызовов функций различных уровней вложенности в параметрах, управляющих системной трассировкой, можно задать желаемый отступ от начала строки для получения "лесенки" (см.14.4).