Простои на данном процессоре (Idle time) - разность между максимальным временем выполнения интервала (на каком-то процессоре) и временем его выполнения на данном процессоре.
Общее время коммуникаций (Communication).
Реальные потери из-за рассинхронизации (Real synchronization).
Потенциальные потери из-за разброса времен (Variation).
Разбалансировка (Load_imbalance) вычисляется как разность между максимальным процессорным временем (CPU+MPI) и соответствующим временем на данном процессоре.
Время выполнения интервала (Execution_time).
Полезное процессорное время (User CPU_time).
Полезное системное время (MPI time).
Число используемых процессоров для данного интервала (Processors).
Времена коммуникаций для всех типов коллективных операций
Реальные потери из-за рассинхронизации для всех типов коллективных операций.
Потенциальные потери из-за рассинхронизации для всех типов коллективных операций.
Потенциальные потери из-за разброса времен для всех типов коллективных операций.
Этап 2
Подготовка текстового представления вычисленных характеристик. Такое представление упрощает первоначальный анализ характеристик при запуске параллельной программы на удаленной ЭВМ.
Этап 3
Визуализация результатов анализа эффективности.
Подсистема визуализации должна обеспечить графическое представление вычисленных характеристик эффективности и помочь пользователю их исследовать - позволить с разной степенью подробности просматривать историю выполнения программы и объяснять, как были вычислены те или иные характеристики.
5.3 Устройство анализатора
Итак, анализатор состоит из трех основных компонент.
Первая - сбор информации по трассе. Вторая - анализ собранных данных. Третья - визуализация.
При каждом запуске параллельной программы в режиме трассировки, создается группа файлов с информацией обо всех ключевых событиях в трассе. Тут есть времена и параметры всех событий, которые имели место при выполнении программы. К этим данным есть возможность доступа через специальные функции интерфейса. Также можно получить информацию для разного рода вспомогательных таблиц (имена используемых функций, исходных файлов и т.п.).
Далее полученные данные поступают на вход модулям анализа и сбора характеристик.
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
14
Модуль main - вызов процедур сбора информации, анализа и генерации результата. Compute - вычисление все необходимых характеристик трассы. Для этого используется модуль tree, который отвечает за формирование дерева с данными об искомых характеристиках. Модуль determine позволяет находить и выделять интервалы в исходном коде и в трассе программы. Модуль visual занимается графическим отображением полученных данных и состоит и timeline - события в трассе, и characteristics - дерево интервалов с отображаемыми характеристиками.
Страницы: 1, 2, 3, 4, 5, 6