Lecture_DVM_3 (Электронные лекции)
Описание файла
Файл "Lecture_DVM_3" внутри архива находится в папке "Электронные лекции". Документ из архива "Электронные лекции", который расположен в категории "". Всё это находится в предмете "модели параллельных вычислений и dvm технология разработки параллельных программ" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Онлайн просмотр документа "Lecture_DVM_3"
Текст из документа "Lecture_DVM_3"
- 9 -
Модели параллельных вычислений и DVM–технология разработки параллельных программ
Лекция 3. Методика и средства отладки DVM-программ (2 часа)
1. Что такое DVM-программа?
Параллельная программа представляет собой обычную последовательную программу, в которую вставлены DVM-директивы, определяющие ее параллельное выполнение.
DVM-директивы записываются как параметры макроса
DVM(<directive>)
который в последовательной программе “расширяется” в пустую строку.
DVM-программа – это один или несколько файлов с исходными текстами на языке C-DVM, имеющих расширение .cdv .
2. Настройка DVM-системы
В рабочую директорию, в которой находится DVM-программа, необходимо переписать файл запуска dvm-команд ( dvm или dvm.bat) и файл usr.par из директории dvm_sys/user DVM-системы.
В файле запуска dvm-команд определены переменные окружения, которые могут быть изменены пользователем. Наиболее часто корректируется переменная dvmoutfile, определяющая имя файла, в который направляется вывод задачи пользователя. По умолчанию вывод идет на экран.
В файле usr.par перечислены наиболее часто корректируемые параметры из базового набора параметров DVM-системы. При помощи параметра StatBufLength можно изменять размер буфера статистики. Например, если параметр IsTimeVariation задать равным единице, то буфер статистики будет использоваться также и для накопления информации о временах запуска и завершения всех коллективных операций, и поэтому его размер следует увеличить.
DVM-система имеет параметры, управляющие системой поддержки, работой динамического отладчика, сбором статистики. В документах [1,2] можно найти описание всех параметров DVM-системы и указания по составлению своих наборов параметров и файлов запуска dvm-команд, содержащих различные значения переменных окружения.
3. Методика отладки DVM-программ
Под отладкой DVM-программ подразумеваются два различных вида деятельности:
-
функциональная отладка, целью которой является достижение правильности функционального выполнения программы;
-
отладка эффективности, целью которой является достижение требуемого уровня эффективности параллельного выполнения программы.
3.1. Функциональная отладка программы
Функциональную отладку программ рекомендуется проводить на тестовых данных в следующей последовательности шагов.
3.1.1. Последовательное выполнение и отладка средствами стандартного компилятора с языка Си
DVM-директивы прозрачны для стандартных компиляторов, поэтому DVM-программа обрабатывается ими как обычная последовательная программа Это позволяет отлаживать ее как обычную последовательную программу (в режиме игнорирования DVM-директив) с использованием привычных средств отладки.
3.1.2. Компиляция. Получение готовой программы.
Получение готовой программы (выполняемого файла) осуществляется в три этапа:
-
конвертация C-DVM программы в C- программу с получением одноименного файла (файлов) с расширением .c;
-
компиляция полученного на предыдущем этапе файла (файлов) стандартным компилятором с языка С;
-
связывание полученного объектного модуля (модулей) с библиотеками программ, используемых пользователем (если есть), и с библиотекой Lib-DVM – системой поддержки выполнения параллельных DVM-программ.
Команда конвертации и компиляции С-DVM-программы имеет вид:
dvm c <имя_DVM-программы>
где:
dvm | | префикс (имя файла запуска DVM-команд); |
<имя_DVM-программы> | | имя файла с исходным текстом программы без расширения. Поиск файла производится только в текущей директории. Предполагается, что он является правильным с точки зрения синтаксиса C и транслируется стандартным C-компилятором (конвертор не делает стандартной проверки синтаксиса и семантики C); |
Результат работы: файлы <имя_DVM-программы>.с и готовая программа (выполняемый файл <имя_DVM-программы>) в текущей директории. Если конвертор обнаружил ошибки, то файл <имя_DVM-программы>.с и соответственно готовая программа не создаются. Сообщения об ошибках записываются в файл cdvm_msg.
3.1.3. Динамический контроль DVM-указаний
Динамический контроль DVM-указаний позволяет проверить корректность распараллеливания программы посредством DVM-указаний, и основан на моделировании параллельного выполнения DVM-программы во время ее последовательного выполнения на одном процессоре.
Динамический контроль позволяет выявлять ошибки следующих типов:
-
Необъявленная зависимость по данным в параллельном цикле.
-
Использование в параллельном цикле или после выхода из него приватных переменных без их предварительной инициализации.
-
Запись в переменные, доступные только на чтение.
-
Использование редукционных переменных после запуска асинхронной редукции, но до ее завершения.
-
Необъявленный доступ к нелокальным элементам распределенного массива.
-
Запись в теневые грани массива.
-
Чтение теневых элементов массива до завершения операции их обновления.
-
Модификация нелокального элемента распределенного массива в последовательной части программы.
-
Выход за пределы распределенного массива.
-
Запись в буфер удаленного доступа.
Для динамического контроля программы ее следует сначала скомпилировать в режиме получения отладочного варианта параллельной программы.
Команда получения отладочного параллельного варианта имеет вид:
dvm cpdeb <имя_DVM-программы>
Результат работы: готовая программа (выполняемый файл <имя_DVM‑программы>_p).
Команда запуска отладочного параллельного варианта DVM-программ, осуществляющего динамический контроль DVM-указаний имеет вид:
dvm err <имя_DVM-программы>
Результат работы: ошибки, обнаруженные в DVM-указаниях (при их наличии).
В случае обнаружения неверных DVM-указаний в текущей директории появляется файл еrror.dbg, в котором перечислены все найденные ошибки. Краткое сообщение о наличии ошибок появляется после выдачи результатов выполнения задачи.
Отсутствие ошибок при динамическом контроле не гарантирует правильной работы параллельной программы. Поэтому отладку программы следует продолжить, воспользовавшись командами накопления и сравнения трассировок.
3.1.4. Сравнение результатов выполнения
Отсутствие ошибок при динамическом контроле не гарантирует правильной работы параллельной программы по следующим причинам:
-
динамический контроль не проверяет правильность описания редукционных операций;
-
источником ошибок могут быть процедуры, вызываемые из DVM-программ, но написанные на других языках и не подлежащие динамическому контролю;
-
отлаженная последовательная программа может содержать ошибки, которые не проявились при ее последовательном выполнении, но могут проявиться при параллельном выполнении.
Для поиска таких ошибок используется метод накопления и сравнения трассировок последовательного и параллельного выполнения программы, который позволяет определить место в программе и момент, когда появляются расхождения в результатах вычислений.
При трассировке выполняется сбор информации обо всех чтениях и модификациях переменных, о начале выполнения каждого витка цикла, о начале и конце выполнения параллельного цикла, о начале выполнения каждой параллельной задачи, о начале и конце выполнения группы задач.
Для выполнения сравнения необходимо выполнить последовательность команд:
Команда получения отладочного параллельного варианта:
dvm cpdeb <имя_DVM-программы>
Результат работы: готовая программа (выполняемый файл <имя_DVM‑программы>_p).
Команда получения отладочного последовательного варианта:
dvm csdeb <имя_DVM-программы>
Результат работы: готовая программа (выполняемый файл <имя_DVM‑программы>_s).
Команда запуска отладочного последовательного варианта DVM-программ, осуществляющая накопление эталонной трассировки на одном процессоре :
dvm trc <имя_DVM-программы>
Результат работы: файл с накопленной трассировкой 0.trd. При наличии ошибок сбора трассировки – сообщение об ошибках после выдачи результатов выполнения задачи и появление файла error.trd в текущей директории.
Команда запуска отладочного параллельного варианта DVM-программ, осуществляющая сравнение результатов вычислений, полученных при запуске программы на одном процессоре в специальном режиме проверки редукционных операций, с накопленной ранее эталонной трассировкой.
dvm red <имя_DVM-программы>
Результат работы: При наличии ошибок – сообщение об ошибках после выдачи результатов выполнения задачи и появление файла error.trd в текущей директории.
Команда запуска отладочного параллельного варианта DVM-программы, осуществляющая сравнение результатов вычислений, полученных при запуске программы на нескольких процессорах, с накопленной ранее эталонной трассировкой.
dvm dif N1 [N2 [N3]] <имя_DVM-программы>
где N1, N2, N3 размеры матрицы процессоров (по умолчанию – 1 1 1).
Результат работы: При наличии ошибок – сообщение об ошибках после выдачи результатов выполнения задачи и появление файла error.trd в текущей директории.
Если различий в трассировке не обнаружено, можно переходить к параллельному выполнению программы с реальными данными.
Если обнаружены различия, но ошибку в программе не удается определить по эталонной трассировке и диагностике сравнения трассировок, пользователь может накопить трассировку на каждом процессоре при запуске отладочного параллельного варианта программы на требуемой матрице процессоров.
Для этого используется следующая команда.
dvm ptrc N1 [N2 [N3]] <имя DVM-программы>,
где N1, N2, N3 размеры матрицы процессоров(по умолчанию – 1 1 1).
Результат работы: Для каждого процессора накапливается трассировка в отдельном файле с именами: 0.trd, 1.trd, 2.trd и т.д. При наличии ошибок выдается соответствующее сообщение после выдачи результатов выполнения задачи.
Чтобы найти строку в файле трассировки, где согласно диагностике сравнения трассировок обнаружена ошибка, используется команда.
dvm dbgerr <имя файла трассы> <имя файла ошибок>
Результат работы: Выдается номер строки в указанном файле трассировки (например, 0.trd), где начинается выполнение витка цикла, на котором обнаружена первая ошибка, указанная в файле ошибок (например, error.trd).
Если различий на предыдущих шагах не обнаружено, то можно переходить к псевдопараллельному выполнению на одном процессоре (рабочей станции) и к запуску в параллельном режиме на многопроцессорной ЭВМ.
Для этого необходимо выполнить команду компиляции:
dvm c <имя DVM-программы>
и команду запуска программы:
dvm run [N1 [N2 [N3]]] <имя DVM-программы>
где N1, N2, N3 размеры матрицы процессоров (по умолчанию – 1 1 1).
3.2. Отладка эффективности DVM-программы
Для отладки эффективности DVM-программ используется анализатор производительности, который позволяет получить информацию об основных характеристиках эффективности выполнения его программы (или ее частей) на параллельной системе.
Эффективность выполнения параллельных программ на многопроцессорных ЭВМ с распределенной памятью определяется следующими основными факторами:
-
степенью распараллеливания программы - долей параллельных вычислений в общем объеме вычислений;
-
равномерностью загрузки процессоров во время выполнения параллельных вычислений;
-
временем, необходимым для выполнения межпроцессорных обменов;
-
степенью совмещения межпроцессорных обменов с вычислениями.
3.2.1. Основные характеристики производительности
Основные характеристики и их компоненты
-
Коэффициент эффективности (Parallelization efficiency) равен отношению полезного времени к общему времени использования процессоров.
-
Время выполнения (Execution time) - максимальное значение среди времен выполнения программы на всех используемых ею процессорах
-
Число используемых процессоров (Processors).
-
Общее время использования процессоров (Total time) - произведение времени выполнения (Execution time) на число используемых процессоров (Processors).
-
Полезное время (Productive time) - сумма трех составляющих – полезного процессорного времени (CPU), времени ввода-вывода (I/O) и полезного системного времени (Sys).
-
Потерянное время (Lost_time) - разница между общим временем использования процессоров и полезным временем. Недостаточный параллелизм, коммуникации и простои - составляющие потерянного времени
-
Недостаточный параллелизм (Insufficient_par) и его компоненты
-
Коммуникации (Communication) и все их компоненты.
-
Простои (Idle time) процессора из-за его недостаточной загрузки.
-
Потенциальные потери из-за разбалансировки (Load_Imbalance).
-
Потенциальные потери из-за синхронизации (Synchronization) при выполнении коллективных операций и все их компоненты.
-
Потенциальные потери из-за разброса времен (Time_variation) выполнения коллективных операций и все их компоненты.
-
Время перекрытия (Overlap) и его компоненты. Эта характеристика отражает потенциальное сокращение коммуникационных расходов за счет совмещения межпроцессорных обменов с вычислениями.
Характеристики выполнения программы на каждом процессоре
-
Потерянное время (Lost time) - сумма его составляющих – потерь из-за недостаточного параллелизма (User insufficient_par), системных потерь из-за недостаточного параллелизма (Sys insufficient_par), коммуникаций (Communication) и простоев (Idle time).
-
Потери из-за недостаточного параллелизма (User insufficient_par).
-
Системные потери из-за недостаточного параллелизма (Sys insufficient_par).
-
Простои на данном процессоре (Idle time) - разность между максимальным временем выполнения интервала (на каком-то процессоре) и временем его выполнения на данном процессоре.
-
Общее время коммуникаций (Communication).
-
Реальные потери из-за рассинхронизации (Real synchronization).
-
Потенциальные потери из-за рассинхронизации (Synchronization).
-
Потенциальные потери из-за разброса времен (Variation).
-
Время перекрытия асинхронных операций (Overlap).
-
Разбалансировка (Load_imbalance) вычисляется как разность между максимальным процессорным временем (CPU+Sys) и соответствующим временем на данном процессоре.
-
Время выполнения интервала (Execution_time).
-
Полезное процессорное время (User CPU_time).
-
Полезное системное время (Sys CPU_time).
-
Время ввода-вывода (I/O_time).
-
Число используемых процессоров для данного интервала (Processors).
-
Времена коммуникаций для всех типов коллективных операций (Reduction, Shadow, Remote_access, Redistribution и I/O).
-
Реальные потери из-за рассинхронизации для всех типов коллективных операций.
-
Потенциальные потери из-за рассинхронизации для всех типов коллективных операций.
-
Потенциальные потери из-за разброса времен для всех типов коллективных операций.
-
Время перекрытия для всех типов коллективных операций.
Замечание. Последние три характеристики выдаются только в том случае, если в параметрах запуска задан параметр IsTimeVariation=1;
Для получения величины реальных потери из-за рассинхронизации необходимо задать параметр IsSynchrTime=1.
3.2.2. Представление программы в виде иерархии интервалов. Выполнение со сбором статистики сбором статистики.
Выполнение всей программы целиком рассматривается как интервал самого высокого (нулевого) уровня. Этот интервал может включать в себя несколько интервалов следующего (первого) уровня. Такими интервалами могут быть параллельные циклы, последовательные циклы, а также любые отмеченные программистом последовательности операторов, выполнение которых всегда начинается с выполнения первого оператора, а заканчивается выполнением последнего. Интервалы первого уровня могут в свою очередь включать в себя интервалы второго уровня, и т.д.