Анализатор производительности параллельных программ
Детальный дизайн
* 21 июня 2000 *


Оглавление

1 Введение
2 Подсистема сбора

2.1 Модуль statevnt.c
2.2 Модуль interval.c
2.3 Модуль statist.c
2.4 Описание структур, использующихся для представления информации об интервале, общей информации о системе поддержки и времени рассинхронизации

3 Подсистема обработки

3.1 Класс Cinter, модуль inter.cpp

3.1.1 Конструктор
3.1.2 Деструктор
3.1.3 Функции записи характеристик
3.1.4 Функции чтения
3.1.5 Чтение информации, идентифицирующей интервал
3.1.6 Сравнение идентифицирующей информации
3.1.7 Суммирование временных характеристик

3.2 Класс CtreeInter, модуль treeinter.cpp

3.2.1 Конструктор
3.2.2 Деструктор
3.2.3 Получение результата работы конструктора
3.2.4 Сообщение об ошибке
3.2.5 Функции обхода интервалов
3.2.6 Суммирование характеристик по дереву интервалов

3.3 Класс Csynchro, модуль synchro.cpp

3.3.1 Конструктор
3.3.2 Деструктор
3.3.3 Результат работы конструктора
3.3.4 Сообщение об ошибке
3.3.5 Подсчет числа рассинхронизаций и разброса времен интервала
3.3.6 Количество рассинхронизаций в интервале
3.3.7 Чтение значения времени рассинхронизации
3.3.8 Чтение значения времени рассинхронизации, поступившего вслед за текущим

3.4 Класс CstatRead, модуль statread.cpp

3.4.1 Конструктор
3.4.2 Деструктор
3.4.3 Количество процессоров
3.4.4 Номер процессора ввода/вывода
3.4.5 Тип передачи сообщений
3.4.6 Обход деревьев интервалов
3.4.7 Результат работы конструктора
3.4.8 Сообщение об ошибке
3.4.9 Чтение идентифицирующей информации интервала
3.4.10 Чтение временных характеристик по заданным процессорам
3.4.11 Минимальные, максимальные и суммарные значения временных характеристик
3.4.12 Размерность матрицы решения задачи
3.4.13 операций Количество коллективных в интервале

3.5 Модуль statfile.cpp, функция main


1 Введение

Анализатор производительности состоит из двух подсистем – подсистемы сбора и подсистемы обработки.

Первая подсистема обеспечивает на каждом процессоре сбор характеристик выполнения параллельной программы. Обращения к этой подсистеме происходит из Lib-DVM во время выполнения параллельной программы. Кроме того, в языках C-DVM и Fortran DVM есть средства описания интервалов выполнения программы, для которых пользователь желает получить характеристики эффективности. Компиляторы обеспечивают обращения к подсистеме сбора при начале и завершении каждого такого интервала. Собранная на каждом процессоре информация записывается в файл при завершении выполнения программы.

Вторая подсистема обеспечивает на рабочей станции обработку информации, собранной на параллельной машине, и выдачу заданных пользователем характеристик эффективности.

2 Подсистема сбора

Сбор информации для отладки производительности состоит из модулей:

statevnt.c, statist.c, interval.c, strall.h, statist.h, interval.h.

Эти модули предназначены для сбора информации о временах выполнения DVM-функций и DVM-системы по интервалам, а также о временах рассинхронизаций коллективных операций и разброса времен. Собранная информация записывается в файл, имя и длина которого задается в файле с параметрами. В дальнейшем этот файл используется анализатором производительности для выдачи характеристик выполнения.

2.1 Модуль statevnt.c

Этот модуль предназначен для установки признаков DVM-функциям, время начала и окончания которых, записывается в файл, по этим временам анализатор производительности выдает характеристики рассинхронизации и разброса времен для каждого интервала.

2.2 Модуль interval.c

В этом модуле находятся функции, которые вызываются конвертором, для создания и завершения интервалов. Все эти функции обеспечивают запись в файлы трассировки соответствующего события.

void __callstd binter_(long *nfrag, long *val)
void __callstd bsloop_(long *nfrag)
void __callstd bploop_(long *nfrag)

nfrag - номер интервала,
nline - номер строки в исходном файле,
val - значение выражения в пользовательском интервале.

Эти функции служат для создания интервалов трех типов: пользовательского, параллельного и последовательного.

void __callstd einter_(long *nfrag, long *nline)
void __callstd eloop_(long *nfrag, long *nline)

Эти функции служат для закрытия текущего интервала, первая функция закрывает пользовательский интервал, а вторая закрывает и последовательный и параллельный. Прототипы этих функций находятся в файле interval.h.

2.3 Модуль statist.c

Непосредственное создание интервалов, их поиск в буфере, их завершение, а также запись в файл, как интервалов, так и времен синхронизации выполняют функции этого модуля. Внешние объявления функций модуля находятся в файле statist.h.

Система поддержки во время выполнения задачи вызывает следующие функции:

void stat_init(void) - эта функция расписывает буфер нулевыми значениями, инициализирует переменные, записывает в начало буфера информацию о системе поддержки (например, количество процессоров, на которых считалась задача) и создает интервал для всей программы.
void stat_done(void) - эта функция закрывает интервал всей программы, если не хватило места на буфере под интервалы или времена рассинхронизации, то выдает сообщения об ошибках.
void stat_event(int numbevent) - эта функция записывает в конец буфера времена начала и окончания коллективных операций. Параметр numbevent – номер ситуации.

Интервал идентифицируется номером строки и именем файла пользовательской программы, где встретилась соответствующая конструкция и значением выражения, если интервал пользовательский. Номер строки и имя файла находятся во внешних переменных DVM_LINE[0] и DVM_FILE[0], значение выражения передается как параметр. При интервале хранятся ссылки на интервал более высокого уровня, более низкого уровня и на следующий интервал этого же уровня. Интервал становится текущим в следующих случаях: если он создан последним, если он найден в списке интервалов соответствующего уровня и его идентифицирующие значения совпадают, а в случае закрытия интервала, текущим становится интервал более высокого уровня.

Следующие функции вызываются для создания, поиска и завершения интервалов.

void CreateInter(int typef,long val) - размещает в буфере соответствующую запись (значения ее полей будут описаны ниже). Параметры: typef – тип интервала, val – значение выражения, которое может быть задано в интервале, созданном в программе средствами языка. Вновь созданный интервал становится текущим, времена выполнения DVM–функций записываются в текущий интервал. Если места на буфере не хватает, интервал создается в памяти.
int FindInter(long val) - предназначена для поиска интервала. Вызывается перед функцией создания интервала. Возвращает код ответа 1 – интервал найден, 0 – не найден.
void EndInter(long nline) - закрытие текущего интервала, для контроля передается параметр nline – номер строки начала интервала.
void FreeInter(void) - освобождает память. Вызывается в конце работы, когда печатаются сообщения о нехватке места на буфере.

2.4 Описание структур, использующихся для представления информации об интервале, общей информации о системе поддержки и времени рассинхронизации

Эти описания находятся в файле strall.h. Этот файл используется и на втором этапе подсистемой обработки.

#define SZSH sizeof(short)
#define SZL sizeof(long)
#define SZINT sizeof(int)
#define SZD sizeof(double)
#define SZV sizeof(void*)

Структура общей информации, записываемой в начале каждого буфера.

typedef struct tvms_ch { unsigned char reverse[SZSH]
    rank[SZSH],
    maxnlev[SZSH],
    szsh[SZSH],
    szl[SZSH],
    szv[SZSH],
    szd[SZSH],
    smallbuff[SZSH]
    proccount[SZL],
    mpstype[SZL],
    ioproc[SZL],
    qfrag[SZL],
    pbuffer[SZV],
    lbuf[SZL],
    linter[SZL],
    lsynchro[SZL]
} *pvms_ch;    
   
reverse - признак, что информация собрана не на рабочей станции;
rank - ранг матрицы;
maxnlev - максимальный номер уровня вложенности;
szsh - размер переменной типа short;
szl - размер переменной типа long;
szv - размер переменной типа void*;
szd - размер переменной типа double;
smallbuff - признак того, что во время выполнения не хватило места в файле;
proccount - количество процессоров;
mpstype - тип передачи сообщений;
ioproc - номер процессора ввода–вывода;
qfrag - количество интервалов;
pbuffer - начало буфера;
lbuf - размер буфера;
linter - длина в байтах записей всех интервалов;
lsynchro - длина в байтах записей синхронизационных времен.

Структура интервала.

В конце каждого интервала записывается имя исходного файла.

typedef struct tinter_ch {












}*pinter_ch;
unsigned char
type[SZSH],
nlev[SZSH],
nenter[SZD],
nline[SZL],
valvar[SZL],
qproc[SZL],
ninter[SZL],
up[SZV],
next[SZV],
down[SZV],
ptimes[SZV],
times[3*StatGrpCount*StatGrpCount][SZD];
   
type - тип интервала;
nlev - номер уровня вложенности;
enter - число вхождений в интервал;
nline - номер строки пользовательской программы;
alvar - значения выражения;
qproc - количество процессоров, на которых выполнялся интервал;
ninter - номер интервала;
up - ссылка на интервал более высокого уровня;
next - ссылка на соседний интервал этого же уровня;
down - ссылка на интервал более низкого уровня;
ptimes - ссылка на массив времен, накапливаемый системой;
times - массив времен.

Структура времени рассинхронизации.

typedef struct tsyn_ch {



}*psyn_ch;
unsigned char
nitem[SZSH],
ninter[SZL],
pgrp[SZV],
time [SZD]
   
nitem - номер коллективной операции;
ninter - номер текущего интервала;
pgrp - ссылка на группу операций;
time - время, в течение которого эта ситуация произошла.

3 Подсистема обработки

Этот инструмент состоит из следующих модулей: inter.cpp, treeinter.cpp, synchro.cpp, statread.cpp, statfile.cpp. Заголовочные файлы: inter.h, treeinter.h, synchro.h, statread.h, strall.h, bool.h, sysstat.h. Функция main находится в модуле statfile.cpp и у нее может быть 7 параметров, из которых первые два - обязательные. Это имя файла с собранной информацией во время выполнения программы, имя файла куда записать информацию, далее 3 символа: y/n – признаки вывода основных, сравнительных и базовых характеристик, максимальный уровень вложенности интервалов и список номеров процессоров, для которых выводить базовые характеристики.

3.1 Класс Cinter, модуль inter.cpp

Этот класс содержит элементы данных, в которых содержатся все необходимые временные характеристики о работе интервала, функции-члены класса обеспечивают работу с этими данными.

enum typegrp {COM,RCOM,SYN,VAR,OVERLAP,CALL};
enum typecom {IO,RD,SH,RA,RED};
enum typetime {LOST, INSUFUSR, INSUF, IDLE, SUMCOM, SUMRCOM, SUMSYN, SUMVAR, SUMOVERLAP, IMB, EXEC, CPUUSR, CPU, IOTIME, START, PROC, ITER};
   
typedef struct tident {






}ident;
char
unsigned long
unsigned long
short
long
double
typefrag
*pname,
nline,
proc;
nlev,
expr,
nenter,
t
     
pname - имя исходного файла, где задан интервал;
nline - номер строки исходного файла;
proc - количество процессоров, на которых выполнялся интервал;
nlev - номер уровня, вложенности;
expr - значение выражения.
nenter - число вхождений в интервал
t - тип интервала.
   
double mgen[ITER+1] - массив времен, для выдачи характеристик по процессорам,
double mcom[RED+1] - массив времен передачи сообщений в коллективных операциях,
double mrcom[RED+1] - массив времен реальной рассинхронизации,
double msyn[RED+1] - массив времен рассинхронизации,
double mvar[RED+1] - массив разброса времен,
double moverlap[RED+1] - массив времен перекрытия операций,
double mcall[RED+1] - количество вызовов коллективных операций,
ident idint - информация об идентификаторе интервала.

3.1.1 Конструктор

CInter ( S_GRPTIMES
ident
unsigned long
(*pt)[StatGrpCount],
p,
nint);
   
(*pt)StatGrpCount – указатель на массив времен, переписанный из файла,
p – идентификатор интервала
nint – номер интервала.

Конструктор служит для записи значений об идентификаторе интервала и некоторых характеристик, значения которых находятся в файле.

3.1.2 Деструктор

~CInter(void);

Деструктор освобождает память, занятую под имя исходного файла.

3.1.3 Функции записи характеристик

void AddTime(typetime t2,double val);
void WriteTime(typetime t2,double val);
void AddTime(typegrp t1,typecom t2,double val);

Эти функции-члены добавляют к ранее посчитанным или записывают новые значения временных характеристик. Первая функция AddTime и WriteTime предназначены для работы с массивом mgen, первый параметр - это номер индекса, а второй само значение. Вторая функция AddTime предназначена для работы с остальными массивами, параметр t1 служит для выбора массива, параметр t2 – значение индекса массива, а val - значение.

3.1.4 Функции чтения

void ReadTime(typegrp t1,typecom t2,double &val);
void ReadTime(typetime t2,double &val);

Эти функции-члены читают значения временных характеристик, значения их параметров такие же, как и для записи, только последний параметр передается ссылкой.

3.1.5 Чтение информации, идентифицирующей интервал

void ReadIdent(ident **p);

Устанавливает указатель равным адресу идентификатора интервала.

3.1.6 Сравнение идентифицирующей информации

int CompIdent(ident *p);

Сравнивает идентификатор интервала с другого процессора с идентификатором текущего интервала, параметр р - указатель на идентификатор интервала. В случае совпадения идентификаторов по всем элементам структуры возвращает 1, в противном случае – 0.

3.1.7 Суммирование временных характеристик

void SumInter(CInter *p);

Эта функция-член суммирует значения временных характеристик интервала со значениями интервала более высокого уровня. Параметр р – указатель на интервал более высокого уровня.

3.2 Класс CtreeInter, модуль treeinter.cpp

Этот класс предназначен для работы с интервалами, собранными на одном процессоре. Он содержит элементы данных: номер процессора - nproc, количество интервалов – qinter, номер текущего интервала – curninter, максимальный номер уровня вложенности maxnlev, а также указатель на динамический массив структур, содержащий номера интервалов более низкого, высокого или этого же уровня.

typedef struct ttree{




} ptree;
unsigned long


int
CInter
up,
next,
down,
sign,
*pint;
   
up, next, down - номера интервалов,
sign - признак, что интервал уже пройден при обходе,
*pint - указатель на класс Cinter,
ptree (*pt) - указатель на массив структур.

3.2.1 Конструктор

CtreeInter( FILE
int
char*
unsigned int
unsigned long
short
*stream,
lint,
pbuffer,
n,
qfrag,
maxn);
   
stream - указатель на дескриптор файла,
lint - длина информации в байтах,
pbuffer - начало буфера на этапе сбора,
n - номер процессора,
qfrag - количество интервалов,
maxn - максимальный уровень вложенности.

Конструктор читает из файла, записанного в конце выполнения DVM-программы, информацию об интервалах, собранных на процессоре.

Эта функция-член запрашивает память под массив структур данного дерева интервалов, заполняет его и обращается к конструктору класса Cinter с прочитанными из файла характеристиками интервала.

3.2.2 Деструктор

~CTreeInter();

Деструктор освобождает память, запрошенную под массив структур.

3.2.3 Получение результата работы конструктора

bool Valid();

Функция-член Valid() предназначена для получения результата работы конструктора. Возвращает TRUE в том случае, если работа конструктора завершилась успешно и FALSE в противном случае.

3.2.4 Сообщение об ошибке

void TextErr(char *t);

Предназначена для получения сообщения об ошибке, если Valid() возвратила код ответа FALSE.

3.2.5 Функции обхода интервалов

void BeginInter(void);
void NextInter(ident **id);
CInter *FindInter(ident *id);

Предназначены для обхода интервалов. Параметр *id – указатель на идентификатор интервала. Обход интервалов осуществляется в том же порядке, что и заполнение интервалов на этапе сбора. Функция FindInter осуществляет поиск интервала с такими идентификационными значениями, что и параметр, в случае, когда соответствующий интервал не найден возвращает NULL.

3.2.6 Суммирование характеристик по дереву интервалов

void SumLevel(void);

Эта функция-член служит для суммирования значений временных характеристик интервалов более низкого уровня с интервалами более высокого уровня для всего дерева интервалов.

3.3 Класс Csynchro, модуль synchro.cpp

Этот класс предназначен для хранения значений времен рассинхронизации и разброса времен.

typedef struct tsyn {



}psyn*ps;
short
unsigned long
void
double
nitem,
ninter,
*pgrp,
time,
   
nitem - номер коллективной операции, установленный в модуле statevnt.c,
ninter - номер текущего интервала, в момент, когда эта ситуация возникла,
pgrp - ссылка на группу операций,
time - время возникновения ситуации,
psyn - указатель на массив структур рассинхронизаций.

Функции-члены:

3.3.1 Конструктор

CSynchro( FILE
int
*stream,
l);

Чтение из файла времен рассинхронизации.

stream - указатель на файл, полученный при выполнении DVM-программы,
lt - длина записанной информации.

3.3.2 Деструктор

~CSynchro();

Освобождение запрошенной памяти.

3.3.3 Результат работы конструктора

bool Valid();

Служит для получения признака о работе конструктора, TRUE- работа конструктора завершилась успешно, FALSE – в противном случае.

3.3.4 Сообщение об ошибке

void TextErr(char *t);

Выдает сообщение об ошибке.

3.3.5 Подсчет числа рассинхронизаций и разброса времен интервала

void Count( unsigned long
short
Nint,
waserr);
   
nint – номер интервала,
waserr – признак, что под времена рассинхронизаций не хватило места в файле.

Подсчет числа рассинхронизаций и разброса времен по типам коллективных операций для интервала с заданным номером. Устанавливает значение заданного номера интервала текущим, следующие функции-члены возвращают значения для текущего интервала.

3.3.6 Количество рассинхронизаций в интервале

int GetCount(typecollect nitem);

Возвращает число рассинхронизаций для заданного типа коллективной операции.

3.3.7 Чтение значения времени рассинхронизации

double Find(typecollect nitem);
double GetCurr(void);

Служат для получения значения времени рассинхронизации и разброса времен для коллективной операции. Функция Find() осуществляет поиск нового значения времени для текущего интервала, а функция GetCurr() только читает это текущее значение.

nitem – тип коллективной операции.

3.3.8 Чтение значения времени рассинхронизации, поступившего вслед за текущим

double FindNearest(typecollect nitem);

Эта функция осуществляет поиск ближайшего от текущего значения, установленного функцией Find(), времени коллективной операции с номером, заданным параметром nitem, Используется для вычисления времен перекрытия операций.

3.4 Класс CstatRead, модуль statread.cpp

Служит для чтения из файла информации о работе системы поддержки, вызывает все вышеперечисленные конструкторы классов, обеспечивает проход по всем интервалам, собранным на всех процессорах, вычисляет некоторые временные характеристики и записывает их в соответствующие интервалы и находит максимальные, минимальные и суммарные значения характеристик.

Функции-члены:

3.4.1 Конструктор

CStatRead(const char *name);

name – имя файла.

Конструктор служит для чтения из файла информации о системе поддержки и для вызова конструкторов других классов для записи информации из файла в свои структуры.

3.4.2 Деструктор

~CStatRead(void);

Деструктор обеспечивает вызов деструкторов других классов и освобождает память, запрошенную под свои динамические массивы, запрошенные для хранения указателей на эти классы.

3.4.3 Количество процессоров

unsigned long QProc(void);

Возвращает количество процессоров, на которых считалась задача.

3.4.4 Номер процессора ввода/вывода

unsigned long IOProc(void);

Возвращает номер процессора ввода/вывода.

3.4.5 Тип передачи сообщений

tmps MPSType(void);

Возвращает тип передачи сообщений.

3.4.6 Обход деревьев интервалов

int BeginTreeWalk(void);
int TreeWalk(void);

Эти функции-члены служат для обхода по деревьям интервалов и возвращают количество интервалов, идентификационные значения которых совпадают.

3.4.7 Результат работы конструктора

bool Valid(void);

Возвращает TRUE в том случае, когда работа конструктора завершена успешно, FALSE в противном случае.

3.4.8 Сообщение об ошибке

void TextErr(char* t);

Записывает сообщение об ошибке по указателю t.

3.4.9 Чтение идентифицирующей информации интервала

void ReadTitle(char* p);

p – указатель на строку символов, в которую записывается информация о заголовке, идентифицирующем интервал.

3.4.10 Чтение временных характеристик по заданным процессорам

bool ReadProc( typeprint
unsigned long
int
double
char*
t,
*pnumb,
qnumb,
sum,
str);
   
t - тип информации о характеристиках по процессорам,
pnumb - указатель на массив номеров процессоров, для которых следует вывести характеристики по процессорам,
qnumb - число элементов массива номеров процессоров,
sum - суммарное значение характеристики по процессорам,
str - строка, в которую записывается название характеристики и значения времен.

Эта функция-член служит для выдачи характеристик выполнения программы на каждом процессоре, возвращает TRUE, когда характеристики данного типа закончились.

3.4.11 Минимальные, максимальные и суммарные значения временных характеристик

void MinMaxSum( typeprint
double*
unsigned long*
double*
unsigned long*
double*
t,
min,
nprocmin,
max,
nprocmax,
sum);
   
t - тип характеристики,
min - указатель на массив минимальных значений характеристик,
nprocmin - указатель на массив номеров процессоров, где достигаются минимальные значения,
max - указатель на массив максимальных значений характеристик,
nprocmax - указатель на массив номеров процессоров, где достигаются максимальные значения,
sum - указатель на массив суммарных значений характеристик.

Эта функция-член предназначена для подсчета минимальных, максимальных и суммарных значений характеристик, используется для выдачи сравнительных характеристик.

3.4.12 Размерность матрицы решения задачи

void VMSSize(char *p);

p – указатель на строку, в которую записывается размерность матрицы, на которой считалась задача.

3.4.13 Количество коллективных операций в интервале

long ReadCall(typecom t);

t – тип коллективной операции.

Возвращает количество вызовов коллективной операции данного типа.

3.5 Модуль statfile.cpp, функция main

Чтение и разбор параметров, обращение к конструктору CstatRead(…) для чтения из файла накопленных времен и интервалов и вывод в файл заказанных характеристик. Характеристики, имеющие нулевые значения не печатаются.