debugDDr (1158410)
Текст из файла
Институт прикладной математики им. М.В.Келдыша
Российская Академия наук
DVM отладчик
Детальный дизайн
Февраль, 2000
Оглавление
1.1 Метод динамического контроля DVM-указаний 4
1.2 Типы выявляемых ошибок 4
1.3 Метод сравнения результатов выполнения 4
4.1 Таблица 9
4.2 Хеш-таблица 11
4.3 Таблица переменных 15
4.4 Модуль выдачи диагностики 20
4.4.1 Обработка контекста диагностики 20
4.4.2 Функции выдачи диагностики 24
5.1 Контроль инициализации переменных и элементов массивов 28
5.2 Контроль доступа к элементам распределенного массива 29
5.3 Контроль приватных и неизменяемых переменных 30
5.4 Контроль редукционных переменных 30
5.5 Контроль использования буфера удаленных элементов 30
5.6 Реализация системы динамического контроля DVM-указаний 31
5.6.1 Режим работы динамического контроля с таблицей переменных 31
5.6.2 Основные функции модуля динамического контроля 32
5.6.3 Параметры системы динамического контроля 39
6.1 Накопление трассировки 41
6.2 Сравнение результатов 42
6.3 Контроль редукционных операций 42
6.4 Форматы входных и выходных файлов 43
6.4.1 Конфигурационный файл трассировки 43
6.4.2 Файл трассировки 45
6.5 Реализация системы сравнения результатов выполнения 47
6.5.1 Основные структуры системы сравнения результатов выполнения 47
6.5.2 Модуль записи трассировки 59
6.5.3 Модуль накопления трассировки 61
6.5.4 Модуль чтения трассировки 64
6.5.5 Модуль сравнения трассировки 65
6.5.6 Модуль обработки редукции 69
6.5.7 Параметры системы сравнения результатов выполнения 71
1Функции DVM отладчика
DVM отладчик предназначен для отладки DVM-программ (написанных на языках Fortran-DVM и C-DVM). Для отладки DVM-программ используется следующий подход. Сначала программа отлаживается на рабочей станции как последовательная программа с использованием обычных средств отладки. Затем программа выполняется на той же рабочей станции в специальном режиме проверки DVM-директив. На третьем этапе программа выполняется на параллельном компьютере в специальном режиме сравнения промежуточных результатов выполнения с эталонными результатами (например, с результатами последовательного выполнения).
DVM-программа может содержать ошибки разного рода. DVM-отладчик предназначен для поиска тех ошибок, которые не проявляются при последовательном выполнении DVM-программы.
В общем случае можно выделить следующие четыре класса ошибок:
-
Синтаксические ошибки в DVM-указаниях (неправильная запись оператора, отсутствие скобки и т.д.), а также нарушение статической семантики.
-
Неправильная последовательность выполнения DVM-указаний или неправильные параметры DVM-указаний.
-
Неправильное выполнение вычислений из-за некорректности DVM-указаний и ошибок, не проявляющихся при последовательном выполнении программы.
-
Аварийное завершение параллельного выполнения программы (авосты, зацикливания, зависания) из-за ошибок, не проявляющихся при последовательном выполнении программы.
Ошибки первого класса выявляются при компиляции.
С ошибками второго класса справиться посредством статического анализа программ невозможно (за исключением простейших случаев, например, задание неверного типа параметра). Чтобы обнаруживать ошибки этого класса каждая функция библиотеки Lib-DVM проверяет корректность порядка выполнения DVM-указаний и передаваемых параметров. Данные проверки осуществляется динамически во время параллельного выполнения программы. Некоторые из таких проверок могут вызывать заметные накладные расходы и поэтому производятся только по специальному указанию.
Обнаружение ошибок третьего класса невозможно при параллельном выполнении без специального режима компиляции и значительных накладных расходов. Примером такой ошибки может служить указание о параллельном выполнении цикла, между витками которого имеется зависимость по данным, которую программист не специфицировал. Для ее обнаружения необходимо фиксировать все операции модификации и использования данных, осуществляемые на разных процессорах, и выявлять случаи использования на одном процессоре переменных, модифицируемых другим процессором. Такого рода контроль может быть выполнен эффективнее в случае выполнения программы на одном процессоре в режиме имитации параллельного выполнения.
DVM отладчик предназначен для обнаружения ошибок третьего класса и базируется на следующих двух методах.
Первый метод, метод динамического контроля DVM-указаний, позволяет проверить корректность распараллеливания программы с помощью DVM-указаний. Он основан на анализе последовательности вызовов функций Lib-DVM и обращений к переменным во время моделирования на одном процессоре параллельного выполнения программы.
Второй метод основан на сравнении результатов выполнения программы в последовательном и параллельном режиме. Он позволяет определить место в программе и момент, когда появятся расхождения в результатах вычислений, которые могут быть вызваны либо неверной спецификацией параллелизма с помощью DVM-указаний, либо ошибкой последовательного алгоритма, проявляющейся только при его параллельном выполнении. При этом, в отличие от первого метода, только часть программы может быть скомпилирована в специальном режиме.
Входящие в состав отладчика средства накопления результатов параллельного выполнения программы могут оказаться полезными и для обнаружения ошибок четвертого класса. Кроме того, для обнаружения таких ошибок предназначен механизм накопления системной трассировки (трассировки вызовов функций системы поддержки выполнения DVM-программ).
1.1Метод динамического контроля DVM-указаний
Динамический контроль основан на моделировании параллельного выполнения DVM-программы на одном процессоре. Использование данного метода может существенно замедлить выполнение программы и требует больших объемов дополнительной памяти. Поэтому, он может применяться только для программы со специально подобранными тестовыми данными ограниченного объема.
1.2Типы выявляемых ошибок
Средства динамического контроля позволяют выявлять следующие типы ошибок:
-
Необъявленная зависимость по данным в параллельном цикле или между параллельными задачами.
-
Чтение неинициализированных переменных.
-
Модификация в параллельной конструкции нераспределенных переменных, которые не являются редукционными или приватными.
-
Использование редукционных переменных после запуска асинхронной редукции, но до ее завершения.
-
Выход за пределы распределенного массива.
-
Необъявленный доступ к нелокальным элементам распределенного массива.
-
Запись в теневые грани распределенного массива.
-
Чтение теневых элементов массива до завершения операции их обновления.
1.3Метод сравнения результатов выполнения
Динамический контроль предназначен, прежде всего, для проверки корректности DVM-указаний. Область контроля ограничена только DVM-программами, скомпилированными в специальном отладочном режиме. Однако, в программе возможны обращения к процедурам, написанным на обычных последовательных языках (включая ассемблер). Работа таких процедур, которая не контролируется, может быть причиной некорректного параллельного выполнения программы. И, наконец, в программе могут быть ошибки (не связанные с ее распараллеливанием), которые не проявлялись при ее последовательном выполнении, но приводят к неверному параллельному выполнению.
Для поиска таких ошибок предназначен другой метод контроля. Этот метод основывается на накоплении результатов вычислений при разных условиях выполнения и сравнении полученных результатов. При использовании этого метода программа может выполняться в двух режимах. В одном режиме результаты вычислений (значения переменных) накапливаются и записываются в файл как эталонные. В другом режиме результаты вычислений сравниваются с эталонными. При этом учитывается, что значения некоторых переменных (например, редукционных внутри параллельных конструкций) могут различаться.
2Состав DVM отладчика
Отладчик можно разбить на две, четко выраженные, системы: динамический контроль и сравнение результатов выполнения.
Обе эти системы используют следующие базовые подсистемы: таблицы, позволяющие хранить однотипную информацию большого объема, хэш-таблицы для организации быстрого поиска данных по ключу и модуль выдачи диагностики.
На базе этих двух подсистем строятся остальные системы, более высокого уровня.
Динамический контроль включает в себя следующие компоненты:
-
Таблица переменных. Предоставляет методы для накопления информации об использовании разнотипных переменных в системе, а также быстрой выборки этой информации по адресу переменной.
-
Модуль динамического контроля. Осуществляет непосредственную проверку DVM-указаний. Обращение к этому модулю идет из некоторых функций библиотеки Lib-DVM, а так же при каждом обращении к переменной или массиву. Таблица переменных используется как вспомогательный модуль, в котором накапливается или извлекается информация о переменных в ходе динамического контроля.
Система сравнения результатов вычислений включает в себя следующие компоненты:
-
Блок накопления трассировки в памяти. Производит накопление и структуризацию трассировочных событий в ходе выполнения программы.
-
Блок записи трассировки в файл. Используется из блока накопления трассировки при задании режима записи трассировки в ходе выполнения программы.
-
Блок чтения трассировки из файлов. Использует как вспомогательный блок накопления трассировки.
-
Блок сравнения трассировок. Сравнивает события трассируемой программы с эталонной трассировкой, сформированной предварительно в памяти блоком накопления трассировки.
-
Блок контроля редукционных переменных. Осуществляет эмуляцию выполнения каждого витка цикла и каждой параллельной задачи на своем процессоре для ручного просчета операции редукции. Работает только при задании соответствующего режима.
3Прототипы отладочных функций
Система поддержки Lib-DVM содержит дополнительные системные вызовы, относящиеся к динамическому отладчику и отвечающие за динамический контроль и сравнение трассировки. Обращения к данным вызовам подставляются компиляторам C-DVM и Fortran-DVM при компиляции программы в специальном отладочном режиме.
Прототипы отладочных функций следующие:
| long dprstv_(long *TypePtr, AddrType *addr, long *Handle, char *Operand, long OperLength) | ||
| TypePtr | – | тип переменной (константы rt_INT, rt_LONG, rt_FLOAT или rt_DOUBLE). Если тип не соответствует ни одному из стандартных типов, то данное обращение будет проигнорировано для трассировки; |
| addr | – | адрес переменной или элемента массива; |
| Handle | – | дескриптор DVM-массива, если обращение идет к элементу массива. Иначе аргумент должен быть равным NULL; |
| Operand | – | строка с именем операнда. Данная строка будет выводиться в сообщениях об ошибках и трассировке; |
| OperLength | – | длина строки, переданной в Operand. Данный аргумент служит для совместимости с Fortran. При вызове из Си должен быть равен –1. |
Функция отмечает начало модификации переменной или элемента массива. Вызов должен вставляться до присвоения переменной значения и до вычисления присваиваемого выражения. Данный системный вызов должен быть парным с dstv_().
| long dstv_(void) |
Функция отмечает завершение вычисления выражения и присвоение переменной нового значения. Функция должна вызываться после присвоения переменной нового значения и должна быть парной с вызовом dprstv_().
| long dldv_(long *TypePtr, AddrType *addr, long *Handle, char *Operand, long OperLength) | ||
| TypePtr | – | тип переменной (константы rt_INT, rt_LONG, rt_FLOAT или rt_DOUBLE). Если тип не соответствует ни одному из стандартных типов, то данное обращение будет проигнорировано для трассировки; |
| addr | – | адрес переменной или элемента массива; |
| Handle | – | дескриптор DVM-массива, если обращение идет к элементу массива. Иначе аргумент должен быть равным NULL; |
| Operand | – | строка с именем операнда. Данная строка будет выводиться в сообщениях об ошибках и трассировке; |
| OperLength | – | длина строки, переданной в Operand. Данный аргумент служит для совместимости с Fortran. При вызове из Си должен быть равен –1. |
Функция отмечает обращение к переменной или элементу массива на чтение.
| long dbegpl_(long *Rank, long *No, long *Init, long *Last, long *Step) | ||
| Rank | – | ранг параллельного цикла; |
| No | – | номер конструкции. Должен быть уникален для всех циклов и областей задач в пределах одной программы; |
| Init | – | массив размерности Rank начальных значений итерационных переменных цикла; |
| Last | – | массив размерности Rank конечных значений итерационных переменных цикла; |
| Step | – | массив размерности Rank значений шага итерационных переменных. |
Функция отмечает начало параллельного цикла. Обращение к данному вызову должно идти до отображения параллельного цикла ( функция mappl).
| long dbegsl_(long *No) | ||
| No | – | номер конструкции. Должен быть уникален для всех циклов и областей задач в пределах одной программы. |
Функция отмечает начало последовательного цикла. Ранг последовательного цикла всегда принимается равным 1.
| long dbegtr_(long *No) | ||
| No | – | номер конструкции. Должен быть уникален для всех циклов и областей задач в пределах одной программы. |
Функция отмечает начало области задач. Ранг области задач всегда принимается равным 1.
| long dendl_(long *No, unsigned long *Line) | ||
| No | – | номер завершающейся конструкции; |
| Line | – | строка, в которой произошел выход из конструкции. Служит для контроля корректности завершения параллельных циклов. |
Функция отмечает завершение последовательного или параллельного цикла или области задач. Должна вызываться после завершения последней итерации цикла или последней задачи из области задач.
| long diter_(AddrType *index) | ||
| index | – | массив адресов итерационных переменных. Размерность массива должна совпадать с рангом исполняющейся конструкции. |
Функция отмечает начало новой итерации последовательного или параллельного цикла или начало новой параллельной задачи. При использовании в многомерных параллельных циклах, обращение к функции должно идти после модификации всех итерационных переменных цикла. Для области задач в качестве аргумента функции должна передаваться переменная, содержащая номер текущей исполняющейся параллельной задачи.
| long drmbuf_(long* ArrSrc, AddrType* RmtBuff, long* Rank, long* Index) | ||
| ArrSrc | – | дескриптор исходного DVM-массива, для которого создается буфер удаленного доступа; |
| RmtBuff | – | адрес скалярной переменной, если буфер создается для единичного элемента массива, или дескриптор DVM-массива, выполняющего роль буфера, если буфер создается для вырезки массива; |
| Rank | – | ранг буфера удаленного доступа. Должен быть равен 0, если буфер создается в скалярной переменной; |
| Index | – | массив, содержащий индексы вырезаемых измерений. Если элемент массива не равен -1, то из DVM-массива берется вырезка, соответствующая данному элементу массива, иначе берется все измерение массива. |
Функция регистрирует в системе динамического контроля создание буфера удаленного доступа. Данная функция необходима для корректного контроля обращений к элементам DVM-массива через буфер удаленного доступа. Вызов должен стоять после создания буфера и инициализации его элементов.
| long dskpbl_(void) |
Функция отмечает завершения блока собственных вычислений в последовательной ветви программы. Обращение к функции должно стоять после выполнения соответствующей группы операторов.
4Реализация базовых модулей
4.1Таблица
Таблица предназначена для хранения данных большого объема. Особенностью ее реализации является то, что память под данные выделяется не под каждый элемент, а сразу для нескольких элементов. Число элементов, под которое выделяется память, определяется параметрически, при инициализации таблицы. Таблица расширяется автоматически, при заполнении текущего выделенного объема памяти.
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.















