Устройство анализатора
Итак, анализатор состоит из трех основных компонент. Первая – сбор информации по трассе. Вторая – анализ собранных данных. Третья – визуализация. Сбор трассы При каждом запуске параллельной программы в режиме трассировки, создается группа файлов с информацией обо всех ключевых событиях в трассе. Тут есть времена и параметры всех событий, которые имели место при выполнении программы. К этим данным есть возможность доступа через специальные функции интерфейса. Также можно получить информацию для разного рода вспомогательных таблиц (имена используемых функций, исходных файлов и т.п.). Далее полученные данные поступают на вход модулям анализа и сбора характеристик. Анализ В соответствии с описанной в пункте 4.2 методикой, вся программа будет разбита на систему интервалов, точнее дерево интервалов. Корнем дерева будет вся программа, она считается интервалом нулевого уровня. Далее в соответствии с вложенностью интервалы первого уровня и т.д. Как указать границы интервалов? Для этого используются пара функций MPI_Send() и MPI_Recv() для указания начала интервала, и такая же пара для указания его окончания. При этом посылка и прием сообщения происходят самому себе и от самого себя (имеется ввиду, что в качестве номера отправителя/получателя используется номер самого процесса). Кроме того, тэг сообщения имеет следующий вид:
TAG = 0x(aa)(id)(aa/bb).
Тэг является четырехбайтным целым числом. Первый байт у «нашего» тэга – это 0xaa. Это позволяет отличить его от обычных посылок/приемов сообщений. Последний байт может быть 0xaa – символизирует начало интервала, 0xbb – конец интервала. Внутри специальный идентификатор интервала (2 байта), его можно использовать, например, для того, чтобы отдельно выделить итерации цикла. Такой способ выделения был выбран потому, что: · он всегда попадает в трассировку (некоторые специальные функции вроде MPI_Pcontrol() в текущей версии трассировщика не попадают). · занимает относительно немного времени (порядка 100 тиков процессора). · прост в использовании и не требует дополнительных средств, помимо стандартных MPI-функций. Таким образом, программист может добавить в свой код границы интересующих его областей программы (в нашей терминологии интервалы). Далее по этим тэгам среди всех событий будут найдены те, которые являются границами интервалов и будут определены их идентификаторы. Для этого вводится специальный класс: class Margin { public: Margin(bool ,unsigned long ,int ,unsigned int ,int); friend bool operator <( const Margin& s1, const Margin& s2) bool enter_leave; unsigned long time; int identity; unsigned int proc; unsigned int scl; }; И функция: vector < Margin >* createMargins ( void ); которая и вычисляет=> определяет необходимые границы вместе со всеми параметрами. После определения границ, создается структура дерево, в которой хранятся все данные обо всех интервалах. Кратко об используемых структурах данных. Создан специальный класс tree: class tree { public: static int Intervallevel; // current interval level static int IntervalID; // current interval ID long index; int level; // Interval level int EXE_count; int source_line; string source_file; int ID; //Characteristics for every interval unsigned long Exec_time; unsigned long Productive_time; double Efficiency; unsigned long CPU_time; unsigned long MPI_time; unsigned long Lost_time; unsigned long Comm_time; unsigned long SendRecv_time; unsigned long CollectiveAll_time; unsigned long Idle_time; unsigned long AllToAll_time; unsigned long Time_variation; unsigned long Potent_sync; unsigned long T_start; vector < pair<unsigned long,unsigned int> >* cmp_pairs; //for intelval's tree tree* parent_interval; int count; vector<tree *> nested_intervals; vector<Processors> Procs; }; Этот класс содержит информацию обо всех характеристиках данного интервала, описанных в 5.2. Кроме того, в нем есть информация о родительском узле дерева, а также обо всех «листьях-потомках». В этом классе в качестве вспомогательного используется класс Processors. class Processors { public: unsigned long enter_time; unsigned long leave_time; unsigned int number; unsigned long MPI_time; unsigned long SendRecv_time; unsigned long CollectiveAll_time; unsigned long Idle_time; unsigned long AllToAll_time; unsigned long CPU_time; unsigned long Comm_time; unsigned long Time_variation; unsigned long Potent_sync; unsigned long T_start; }; В этом классе содержатся элементарные составляющие всех компонентов, собранные на каждом интервале каждого процессора. Далее, после определения границ интервалов, происходит создание дерева интервалов. В этом дереве и будет храниться информация обо всех интервалах. Класс tree включает методы, которые и собирают информацию из структур, собранных на трассе. Первая группа характеристик собирается в функции Leave(int line, char* file, long index,unsigned int proc,unsigned long time). · MPI_time Используем – getMPITimebyProc ( ); · SendRecv_time - getSendRecvCommunicationTimebyProc(); · CollectiveAll_time – getCollectiveAllByProc ( ); · AllToAll_time - getAllToAllByProc(); · Potent_sync - getPotentSyncByProc(); · Time_variation - getTimeVariationByProc(); · T_start - getNonBlockedTimebyProc(); Вычисление характеристик. getMPITimebyProc () – Происходит суммирование интервалов времени, занятых под MPI-функции (интервалы получаются как разность между временем выхода и входа в MPI-функцию). getSendRecvCommunicationTimebyProc ( )- Происходит суммирование интервалов времени, вычисляемых как разность времени выхода из функции приема сообщения и времени входа в функцию посылки сообщения. getPotentSyncByProc () – Вычисляется по-разному для операций одиночных посылок/приемов сообщений и коллективных операций. Сюда входят все случаи, когда Recv был выдан раньше Send’а. Эти «задержки» как раз и суммируются. Для коллективных же операций суммируется время «задержки» старта операции на некоторых процессорах. getTimeVariationByProc () – Вычисляется время, рассинхронизации окончания коллективной операции. getNonBlockedTimebyProc () – Вычисляется аналогично getMPITimebyProc (), только суммируются времена работы только не блокирующих операций. Все эти характеристики собираются на каждом процессоре для данного интервала. Прототип всех функций одинаков: getFunction(unsigned long enter_time, unsigned long leave_time, unsigned int proc). Собранные «элементарные» характеристики, затем собираются в более общие по всему интервалу. Первая используемая для этого функция – это функция Integrate(). В этой функции собираются следующие характеристики: · CPU_time · MPI_time · SendRecv_time · CollectiveAll_time · AllToAll_time · Comm_time(Общее время коммуникаций) · Idle_time(время бездействия) · Potent_sync · Time_variation · T_start Все они уже являются характеристиками всего интервала. Далее происходит вычисление уже не общих, а сравнительных характеристик. Зная все эти компоненты на каждом процессоре для интервала, мы находим процессоры с максимальным, минимальным значением по времени, а также среднее значения всех характеристик. После функции Integrate() вычисляется полезное время calculateProductive(), потом время запуска - calculateExecution(), эффективность распараллеливания - efficiency(), и, наконец, потерянное время – calculateLost(). На этом сбор и анализ информации оканчиваются. Следующий этап, это генерация соответствующих текстовых выдач. Эти выдачи представляют собой текстовый файл и имеют следующий вид (Пример). Пример. Текстовый файл с итоговыми характеристиками. Interval (LineNumber = 153 SourceFile = exch.c) Level=0 EXE_Count=1 ---Main Characteristics--- Parallelization Efficiency 0.978833 Execution Time 2.079975 Processors 4 Total Time 8.319900 Productive Time 8.143794 (CPU MPI) MPI время на одном процессоре считается полезным, а на остальных - потерянным Lost Time 0.176106 ---MPI Time 0.173490 ---Idle Time 0.002616
Популярное: Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной... Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе... Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (163)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |