Предиктор.
Детальный дизайн (продолжение) |
- дата последнего обновления 22.05.01 -
Приложение 1. Связь имен полей в выходном HTML-файле и имен полей в структуре _IntervalResult
| Имя поля | Якорь | Переменная inter | ||
| Efficiency | effic | Efficiency | ||
| Execution time | exec | Execution_time | ||
| Total time | total | Total_time | ||
| Productive time | ptime | Productive_time | ||
| CPU | ptimec | Productive_CPU_time | ||
| SYS | ptimes | Productive_SYS_time | ||
| I/O | ptimei | IO_time | ||
| Lost time | lost | Lost_time | ||
| Insufficient parallelism | insuf | Insuff_parallelism | ||
| USR | iuser | Insuff_parallelism_sys | ||
| SYS | isyst | Insuff_parallelism_usr | ||
| Communications | comm | Communication | ||
| SYN | csyn | Communication_SYNCH | ||
| Idle time | idle | Idle | ||
| Load imbalance | imbal | Load_imbalance | ||
| Synchronization | synch | Synchronization | ||
| Time variation | vary | Time_variation | ||
| Overlap | over | Overlap | ||
IO |
# op | nopi | num_op_io | |
| Communications | comi | IO_comm | ||
| Real synch | synchi | IO_synch | ||
| Overlap | overi | IO_overlap | ||
| Reduction | # op | nopr | num_op_reduct | |
| Communications | comr | Wait_reduction | ||
| Real synch | synchr | Reduction_synch | ||
| Overlap | overr | Reduction_overlap | ||
| Shadow | # op | nops | num_op_shadow | |
| Communications | coms | Wait_shadow | ||
| Real synch | synchs | Shadow_synch | ||
| Overlap | overs | Shadow_overlap | ||
| Remote access | # op | nopa | num_op_remote | |
| Communications | coma | Remote_access | ||
| Real synch | syncha | Remote_synch | ||
| Overlap | overa | Remote_overlap | ||
| Redistribution | # op | nopd | num_op_redist | |
| Communications | comd | Redistribution | ||
| Real synch | synchd | Redistribution_synch | ||
| Overlap | overd | Redistribution_overlap |
Приложение 2. Описание вспомогательных функций и классов
Ниже приводится описание функций и классов, используемых при реализации алгоритмов описанных в предыдущей главе.
Базовый класс для большинства классов.
class Space {
protected:
long Rank; // Размерность пространства
vector<long> SizeArray; // Размер каждого измерения
vector<long> MultArray; // Множитель для каждого измерения
public:
Space();
Space(long ARank,vector<long> ASizeArray,vector<long> MultArray);
Space(long ARank, long *ASizeArray);
Space(const Space &);
~Space();
Space & operator= (const Space &x);
long GetRank();
long GetSize(long AAxis);
void GetSI(long LI, vector<long> & SI);
long GetLI(const vector<long> & SI);
long GetCenterLI();
long GetSpecLI(long LI, long dim, int shift);
long GetLSize();
long GetNumInDim(long LI, long dimNum);
long GetDistance(long LI1, long LI2);
};
| GetRank | – | возвращает размерность пространства. |
| GetSize | – | возвращает размер измерения с номером AAxis. |
| GetSI | – | вычисляет координаты SI в данном пространстве по линейному индексу LI. |
| GetLI | – | вычисляет линейный индекс по координатам в данном пространстве. |
| GetCenterLI | – | возвращает линейный индекс элемента, являющегося геометрическим центром пространства. |
| GetSpecLI | – | функция возвращает линейный индекс элемента, который смещён на shift по измерению dim от элемента заданного линейным индексом LI. |
| GetLSize | – | возвращает линейный размер (число элементов) пространства. |
| GetNumInDim | – | возвращает координату элемента, заданного линейным индексом LI, в данном измерении dimNum. |
| GetDistance | – | расстояние между двумя элементами пространства заданными линейными индексами LI1 и LI2. |
Класс “Виртуальная машина”
(“Процессорная система”).
class VM : public Space {
int MType; // Тип распределенной системы процессоров
// 0 – сеть с шинной организацией, 1 – транспьютерная система
double TStart; // Время старта операции обмена
double TByte; // Время пересылки одного байта
public:
// конструктор
VM(vector<long>& ASizeArray, int AMType, double ATStart,
double ATByte,double AProcPower);
~VM();
double getTByte();
double getTStart();
int getMType();
};
Класс “Представление абстрактной машины”.
class AMView : public Space {
public:
VM *VM_Dis; // Система процессоров, на которую отображен шаблон
list<DArray *> AlignArrays; // Список выравненных на данный шаблон массивов
vector<DistAxis> DistRule; // Правило отображения шаблона в систему процессоров
vector<long> FillArr; // Массив с информацией о заполнении процессорной
// системы элементами шаблона
AMView(long ARank, long *ASizeArray);
AMView(const AMView &);
~AMView();
void DelDA(DArray *RAln_da);
void AddDA(DArray *Aln_da);
void DisAM(VM *AVM_Dis, long AParamCount, long *AAxisArray,
long *ADistrParamArray);
double RDisAM(long AParamCount, long *AAxisArray, long *ADistrParamArray,
long ANewSign);
bool IsDistribute();
};
| DelDA | - | удаляет распределенный массив DArray из списка выравненных массивов. |
| AddDA | - | добавляет распределенный массив DArray в список выравненных массивов. |
| DisAM | - | функция отображения шаблона в систему процессоров. Производится инициализация указателя на систему процессоров, правила отображения и массив с информацией о заполнении процессорной системы элементами шаблона в соответствии с параметрами функции. |
| RdisAM | - | функция определения времени затрачиваемого на обмены при изменении отображения шаблона в систему процессоров (перераспределение шаблона). Алгоритм, реализуемый ею, описан в п.3.2. |
| IsDistribute | - | проверяет, распределен ли уже шаблон на систему процессоров. |
Класс “ распределенный массив”.
class DArray : public Space {
private:
void PrepareAlign(long& TempRank, long *AAxisArray, long *ACoeffArray,
long *AConstArray, vector<AlignAxis>& IniRule);
long CheckIndex(long *InitIndexArray, long *LastIndexArray, long *StepArray);
public:
long TypeSize; // Размер в байтах одного элемента массива
AMView *AM_Dis; // Шаблон по которому выравнен данный массив
vector<AlignAxis> AlignRule // Правило выравнивания массива на шаблон
int Repl; // признак полностью размноженного по шаблону массива
DArray();
DArray(long ARank, long *ASizeArray, long ATypeSize);
DArray(const DArray &);
~DArray();
DArray & operator= (DArray &x);
void AlnDA(AMView *APattern, long *AAxisArray, long *ACoeffArray,
long *AConstArray);
void AlnDA(DArray *APattern, long *AAxisArray, long *ACoeffArray,
long *AConstArray);
double RAlnDA(AMView *APattern, long *AAxisArray, long *ACoeffArray,
long *AConstArray, long ANewSign);
double RAlnDA(DArray *APattern, long *AAxisArray, long *ACoeffArray,
long *AConstArray, long ANewSign);
friend double ArrayCopy(DArray *AFromArray, long *AFromInitIndexArray,
long *AFromLastIndexArray, long *AFromStepArray, DArray *AToArray,
long *AToInitIndexArray, long *AToLastIndexArray, long *AToStepArray,
long ACopyRegim);
long GetMapDim(long arrDim, int &dir);
bool IsAlign();
};
| PrepareAlign | – | инициализирует правило выравнивания массива на образец выравнивания. |
| CheckIndex | – | возвращает число элементов в секции данного массива, заданной параметрами функции ( 0 – если она пуста или индексы вышли за пределы массива). |
| AlnDA | – | функции задания расположения (выравнивания) распределенного массива. Во второй функции производится косвенное задание шаблона через распределенный массив. Производится инициализация указателя на шаблон. В первой функции производится определение признака полностью размноженного по шаблону массива, во второй же он наследуется у массива, выступающего в качестве образца отображения. Также в первой функции производится инициализация правила выравнивания массива на шаблон при помощи функции PrepareAlign, а во второй, кроме этого, производится изменение полученного правила с учетом того, как выравнен образец, по которому выравнивается данный массив (т.е. осуществляется суперпозиция выравниваний, для получения результирующего выравнивания массива на шаблон). |
| RAlnDA | – | функция определения времени затрачиваемого на обмены при повторного выравнивания массива на шаблон. Алгоритм, реализуемый ею, описан в п.3.2. |
| ArrayCopy | – | функция определения времени затрачиваемого на обмены при загрузке буферов удаленными элементами массива. (Алгоритм описан в п.3.5.) |
| GetMapDim | – | функция возвращает номер измерения системы процессоров, на которое в итоге отображено указанное измерение массива arrDim. Если измерение массива размножено по всем направлениям матрицы процессоров, то возвращается 0. В dir заносится 1 или -1 в зависимости от направления разбиения измерения массива. |
| IsAlign | – | проверяет, выравнен ли уже массив на шаблон. |
Класс ”Группа границ”.
class BoundGroup {
AMView *amPtr; // Шаблон, по которому выравнены массивы, чьи границы
// добавлены в данную группу
CommCost boundCost; // Информация об обменах между процессорами
public:
BoundGroup();
virtual ~BoundGroup();
void AddBound(DArray *ADArray, long *ALeftBSizeArray,
long *ARightBSizeArray, long ACornerSign);
double StartB();
};
| AddBound | – | включение границы распределенного массива в группу границ. (Алгоритм описан в п.3.3.) |
| StartB | – | функция определения времени затрачиваемого на обмены границами распределенных массивов, включенными в данную группу. (Алгоритм описан в п.3.3.) |
Класс “Редукционная переменная”.
class RedVar {
public:
long RedElmSize; //Размер элемента редукционной переменной - массива в
//байтах
long RedArrLength; //Число элементов в редукционной переменной-массиве
long LocElmSize; //Размер в байтах одного элемента массива с дополнительной
//информацией
RedVar(long ARedElmSize, long ARedArrLength, long ALocElmSize);
RedVar();
virtual ~RedVar();
long GetSize();
};
| GetSize | – | возвращает размер в байтах редукционной переменной-массива вместе с массивом дополнительной информации. |
Класс “Редукционная группа”.
class RedGroup {
public:
VM *vmPtr; // Указатель на систему процессоров
vector<RedVar *> redVars; // Массив редукционных переменных
long TotalSize; // Общий размер в байтах редукционных переменных
// включенных в группу с их дополнительной информации
long CentralProc; // Линейный индекс геометрического центра системы
// процессоров
RedGroup(VM *AvmPtr);
virtual ~RedGroup();
void AddRV(RedVar *ARedVar);
double StartR(DArray *APattern, long ALoopRank, long *AAxisArray);
};
| void AddRV | – | функция включения редукционной переменной в редукционную группу.( Алгоритм описан в п.3.4). |
| StartR | – | функция возвращающая время затрачиваемое на обмены при выполнении операций редукции. (Алгоритм описан в п.3.4). |
Класс “Распределение измерения
массива”.
class DistAxis {
public:
long Attr; // Тип распределения
long Axis; // Номер измерения шаблона
long PAxis; // Номер измерения системы процессоров
DistAxis(long AAttr, long AAxis, long APAxis);
DistAxis();
virtual ~DistAxis();
DistAxis& operator= (const DistAxis&);
};
Класс “Выравнивание измерения распределенного массива на шаблон”.
class AlignAxis {
public:
long Attr; // Тип выравнивания
long Axis; // Номер измерение массива
long TAxis; // Номер измерения шаблона
long A; // Коэффициент для индексной переменной распределенного
// массива в линейном правиле выравнивания TAxis-го
// измерения шаблона
long B; // Константа линейного правила выравнивания для TAxis-го
// измерения шаблона
long Bound; // Размер измерения массива выступающего в качестве образца
// выравнивания при частично размножении выравниваемого
// массива
AlignAxis(long AAttr, long AAxis, long ATAxis, long AA = 0, long AB = 0, long ABound = 0);
AlignAxis();
virtual ~AlignAxis();
AlignAxis& operator= (const AlignAxis&);
};
Класс “Теневая грань по одному измерению распределенного массива”.
class DimBound {
public:
long arrDim; // Номер измерения массива
long vmDim; // Номер измерения системы процессоров
int dir; // Равно 1 или -1 в зависимости от направления разбиения
// измерения массива
long LeftBSize; // Ширина левой границы для arrDim-го измерения массива
long RightBSize; // Ширина правой границы для arrDim-го измерения массива
DimBound(long AarrDim, long AvmDim, int Adir, long ALeftBSize, long ARightBSize);
DimBound();
virtual ~DimBound();
};
Класс “Секция массива”.
class Block {
vector<LS> LSDim; // Вектор, содержащий соответствующие линейные сегменты,
// для каждого измерения массива, описывающие данную секцию
public:
Block(vector<LS> &v);
Block(DArray *da, long ProcLI);
Block();
virtual ~Block();
Block & operator =(const Block & x);
long GetRank();
long GetBlockSize();
long GetBlockSizeMult(long dim);
long GetBlockSizeMult2(long dim1, long dim2);
bool IsLeft(long arrDim, long elem);
bool IsRight(long arrDim, long elem);
bool IsBoundIn(long *ALeftBSizeArray,long *ARightBSizeArray);
bool empty();
friend Block operator^ (Block &x, Block &y);
};
| Block | – | создает секцию массива da, лежащую на процессоре с линейным индексом ProcLI. |
| GetRank | – | возвращает размерность секции. |
| GetBlockSize | – | число элементов в секции. |
| GetBlockSizeMult, GetBlockSizeMult2 |
– | данные функции возвращают произведение размеров секции по каждому измерению кроме указанных при обращении к ним. |
| IsLeft, IsRight | – | проверка того, что по данному измерению arrDim элемент elem находится левее (правее) данной секции |
| IsBoundIn | – | проверка на не выход границы распределенного массива за пределы данной секции. |
| Empty | – | проверка секции на отсутствие элементов. |
| Block operator^ | – | возвращает секцию, являющуюся пересечением секций заданных при обращении к функции. |
Класс “Линейный сегмент”.
class LS {
public:
long Lower; // Нижнее значение индекса
long Upper; // Верхнее значение индекса
LS(long ALower, long AUpper);
LS();
virtual ~LS();
long GetLSSize();
void transform(long A, long B, long daDimSize);
bool IsLeft(long elem);
bool IsRight(long elem);
bool IsBoundIn(long ALeftBSize, long ARightBSize);
bool empty();
LS operator^ (LS &x);
};
| GetLSSize | – | возвращает размер линейного сегмента. |
| Transform | – | преобразует линейный сегмент шаблона в линейный сегмент распределенного массива выравненного по данному шаблону. |
| IsLeft, IsRight | – | проверка того, что элемент elem находится левее (правее) данного сегмента. |
| IsBoundIn | – | проверка на не выход заданной границы за пределы сегмента. |
| empty | – | проверка сегмента на отсутствие элементов. |
| LS operator | – | оператор пересечения сегментов. |
Класс “Оценка обменов между
процессорами”.
class CommCost {
public:
Dim2Array transfer; // Массив содержащий информацию о количестве байтов
// пересылаемых между парой процессоров
VM *vm; // Указатель на систему процессоров
CommCost(VM *Avm);
CommCost();
virtual ~CommCost();
CommCost & operator =(const CommCost &);
double GetCost();
void Update(DArray *oldDA, DArray *newDA);
void BoundUpdate(DArray *daPtr, vector<DimBound> & dimInfo, bool IsConer);
void CopyUpdate(DArray *FromArray, Block & readBlock);
};
| GetCost | – | функция возвращает время, затрачиваемое на обмены между процессорами системы. (Алгоритм описан в п.3.2). |
| Update | – | функция для изменения массива transfer в соответствии с обменами, возникающими между процессорами при переходе от одного распределения массива к другому. Алгоритм, реализуемый ею, описан в п.3.2. |
| BoundUpdate | – | функция для изменения массива transfer в соответствии с пересылками, возникающими при обмене границей заданного распределенного массива. (Алгоритм описан в п.3.3). |
| CopyUpdate | – | функция изменения массива transfer в соответствии с обменами, возникающими при размножении секции readBlock массива FromArray по всем процессорам. |
Приложение 3. Основные функции экстраполятора времени
Конструктор объекта “Виртуальная машина”
VM::VM( vector<long> ASizeArray, int AMType, double
ATStart, double ATByte,
double AProcPower );
| ASizeArray | – | вектор, i-й элемент которого содержит размер данной системы процессоров по измерению i + 1 (0 <= i <= ARank – 1); |
| AMType | – | тип распределенной системы процессоров (0 – сеть с шинной организацией, 1 – транспьютерная система); |
| ATStart | – | время старта операции обмена; |
| ATByte | – | время пересылки одного байта; |
| AProcPower | – | относительная производительность процессора. |
Конструктор объекта
“Представление абстрактной
машины”
AMView::AMView( vector< long> ASizeArray );
| ASizeArray | – | вектор, i-й элемент которого содержит размер данного шаблона по измерению i + 1 (0 <= i <= ARank – 1); |
Отображение шаблона
void AMView::DisAM (ImLastVM *AVM_Dis, vector<long>
AAxisArray,
vector<long>
*ADistrParamArray );
| AVM_Dis | – | ссылка на систему процессоров, на которую отображается шаблон. |
| AAxisArray | – | вектор, j-й элемент которого содержит номер измерения шаблона, используемый в правиле отображения для (j+1)-го измерения системы процессоров. |
| ADistrParamArray | – | игнорируется (т.е. обеспечиваются только два правила отображения: 1 и 2 (см. описание Lib-DVM). Причем в 1-ом правиле размер блока вычисляется, а не берется из ADistrParamArray). |
Задание перераспределения шаблона на систему процессоров и определение времени такого перераспределения.
double AMView::RdisAM( vector<long> AAxisArray,
vector<long>
ADistrParamArray, long ANewSign );
| AAxisArray | – | массив, j-й элемент которого содержит номер измерения шаблона, используемый в правиле отображения для (j+1)-го измерения системы процессоров. |
| ADistrParamArray | – | игнорируется (т.е. обеспечиваются только два правила отображения: 1 и 2 (см. описание Lib-DVM). Причем в 1-ом правиле размер блока вычисляется, а не берется из ADistrParamArray). |
| ANewSign | – | задаваемый единицей признак обновления содержимого всех перераспределяемых массивов. |
Конструктор объекта “ Распределенный массив”
DArray::DArray( vector<long> ASizeArray,
vector<long> AlowShdWidthArray,
vector<long>
AhiShdWidthArray, long ATypeSize );
| ASizeArray | – | вектор, i-й элемент которого содержит размер создаваемого массива по измерению i+1 (0 <= i <= ARank–1). |
| AlowShdWidthArray | – | вектор, i-ый элемент которого содержит ширину левой границы по измерению i+1. |
| AHiShdWidthArray | – | вектор, i-ый элемент которого содержит ширину правой границы по измерению i+1. |
| ATypeSize | – | размер в байтах одного элемента массива. |
Выравнивание распределенного массива
void DArray::AlnDA( AMView *APattern, vector<long>
AAxisArray,
vector<long>
ACoeffArray, vector<long> AConstArray );
void DArray::AlnDA( DArray *APattern, vector<long>
AAxisArray,
vector<long>
ACoeffArray, vector<long> AConstArray );
| APattern | – | ссылка на образец выравнивания. |
| AAxisArray | – | вектор, j-й элемент которого содержит номер индексной переменной (номер измерения) распределенного массива для линейного правила выравнивания (j+1)-го измерения образца. |
| ACoeffArray | – | вектор, j-й элемент которого содержит коэффициент для индексной переменной распределенного массива в линейном правиле выравнивания (j+1)-го измерения образца. |
| AConstArray | – | вектор, j-й элемент которого содержит константу линейного правила выравнивания для (j+1)-го измерения образца. |
Повторное выравнивание распределенного массива и определение времени выполнения этой операции.
double DArray::RAlnDA( AMView *APattern, vector<long>
AAxisArray,
vector<long>
ACoeffArray, vector<long> AConstArray,
long
ANewSign );
double DArray::RAlnDA( DArray *APattern, vector<long>
AAxisArray,
vector<long>
ACoeffArray, vector<long> AConstArray,
long ANewSign );
| APattern | – | ссылка на образец выравнивания (массив или шаблон). |
| AAxisArray | – | вектор, j-й элемент которого содержит номер индексной переменной (номер измерения) распределенного массива для линейного правила выравнивания (j+1)-го измерения образца. |
| ACoeffArray | – | вектор, j-й элемент которого содержит коэффициент для индексной переменной распределенного массива в линейном правиле выравнивания (j+1)-го измерения образца. |
| AconstArray | – | вектор, j-й элемент которого содержит константу линейного правила выравнивания для (j+1)-го измерения образца. |
| ANewSign | – | задаваемый единицей признак обновления содержимого распределенного массива. |
Функция возвращает время повторного выравнивания массива.
Конструктор объекта “ параллельный цикл”
ParLoop::ParLoop( long ARank );
| ARank | – | размерность параллельного цикла. |
Создание параллельного цикла.
void ParLoop::MapPL( AMView *APattern, vector<long>
AAxisArray,
vector<long>
ACoeffArray, vector<long> AConstArray,
vector<long>
AInitIndexArray,
vector<long>
ALastIndexArray, vector<long> AStepArray );
void ParLoop::MapPL( DArray *APattern, vector<long>
AAxisArray,
vector<long>
ACoeffArray, vector<long>AConstArray,
vector<long>AInitIndexArray,
vector<long>
ALastIndexArray, vector<long>AStepArray );
| APattern | – | ссылка на образец отображения параллельного цикла. |
| AAxisArray | – | вектор, j-й элемент которого содержит номер индексной переменной (номер измерения) параллельного цикла для линейного правила выравнивания (j+1)-го измерения образца. |
| ACoeffArray | – | вектор, j-й элемент которого содержит коэффициент для индексной переменной параллельного цикла в линейном правиле выравнивания (j+1)-го измерения образца. |
| AConstArray | – | вектор, j-й элемент которого содержит константу линейного правила выравнивания для (j+1)-го измерения образца. |
| AInitIndexArray | – | вектор, i-ый элемент которого содержит начальное значение индексной переменной (i+1)-го измерения параллельного цикла. |
| ALastIndexArray | – | вектор, i-ый элемент которого содержит конечное значение индексной переменной (i+1)-го измерения параллельного цикла. |
| AStepArray | – | вектор, i-ый элемент которого содержит значение шага для индексной переменной (i+1)-го измерения параллельного цикла. |
Отображение параллельного цикла.
void ParLoop::ExFirst( ParLoop *AParLoop, BoundGroup *ABoundGroup)ImLast;
| AParLoop | – | ссылка на параллельный цикл. |
| ABoundGroup | – | ссылка на группу границ, обмен которыми должен быть запущен после вычисления экспортируемых элементов локальных частей распределенных массивов. |
Выставить флаг изменения порядка выполнения витков циклов.
void ParLoop::ImLast( ParLoop *AParLoop, BoundGroup *ABoundGroup)ImLast;
| AParLoop | – | ссылка на параллельный цикл. |
| ABoundGroup | – | ссылка на группу границ, обмен которыми должен быть запущен после вычисления экспортируемых элементов локальных частей распределенных массивов. |
Функция выставляет флаг изменения порядка выполнения витков циклов.
Определение времени затрачиваемого на обмены при загрузке буферов удаленными элементами массива
double ArrayCopy( DArray *AFromArray, vector<long>
AFromInitIndexArray,
vector<long>
AFromLastIndexArray,
vector<long>
AFromStepArray, DArray *AToArray,
vector<long>
AToInitIndexArray,
vector<long>
AToLastIndexArray,
vector<long>
AToStepArray, long ACopyRegim );
| AFromArray | – | ссылка на читаемый распределенный массив. |
| AFromInitIndexArray | – | вектор, i-й элемент которого содержит начальное значение индекса для (i+1)-го измерения читаемого массива. |
| AFromLastIndexArray | – | вектор, i-й элемент которого содержит конечное значение индекса для (i+1)-го измерения читаемого массива. |
| AFromStepArray | – | вектор, i-й элемент которого содержит шаг изменения индекса для (i+1)-го измерения читаемого массива. |
| AToArray | – | заголовок записываемого распределенного массива. |
| AToInitIndexArray | – | вектор, j-й элемент которого содержит начальное значение индекса для (j+1)-го измерения записываемого массива. |
| AToLastIndexArray | – | вектор, j-й элемент которого содержит конечное значение индекса для (j+1)-го измерения записываемого массива. |
| AToStepArray | – | вектор, j-й элемент которого содержит шаг изменения индекса для (j+1)-го измерения записываемого массива. |
| ACopyRegim | – | режим копирования. |
Функция возвращает искомое время.
Конструктор объекта “Группа границ”
BoundGroup::BoundGroup( );
Создание группы границ. Создается пустая группа границ (не содержащая ни одной границы).
Добавить границы массива в группу.
void BoundGroup::AddBound( DArray *ADArray,
vector<long> ALeftBSizeArray,
vector<long>
ARightBSizeArray,
long
ACornerSign);
| ADArray | – | ссылка на распределенный массив. |
| ALeftBSizeArray | – | вектор, i-й элемент которого содержит ширину нижней границы для (i+1)-го измерения массива. |
| ARightBSizeArray | – | вектор, i-й элемент которого содержит ширину верхней границы для (i+1)-го измерения массива. |
| ACornerSign | – | признак включения в границу угловых элементов. |
Определение времени затрачиваемого на обмены границами распределенных массивов, включенных в данную группу.
double BoundGroup::StartB( );
Функция возвращает искомое время.
Конструктор объекта “Редукционная переменная”
RedVar::RedVar( long ARedElmSize, long ARedArrLength, long ALocElmSize);
| AredElmSize | – | размер одного элемента редукционной переменной-массива в байтах. |
| ARedArrLength | – | число элементов в редукционной переменной-массиве. |
| ALocElmSize | – | размер в байтах одного элемента массива с дополнительной информацией. |
Конструктор объекта “Редукционная группа”
RedGroup::RedGroup( VM *AvmPtr );
| AvmPtr | – | ссылка на систему процессоров. |
Создание редукционной группы. Создается пустая редукционная группа (не содержащая ни одной редукционной переменной).
Включение редукционной переменной в редукционную группу.
void RedGroup::AddRV( RedVar *AredVar );
| ARedVar | – | ссылка на редукционную переменную. |
Определение времени затрачиваемого на обмены при выполнении операций редукции.
double RedGroup::StartR( ParLoop *AParLoop );
| AParLoop | – | ссылка на параллельный цикл, в котором вычисляются значения редукционных переменных из данной группы. |
Приложение 4. Фрагменты трассы и параметры моделируемых Предиктором функций Lib-DVM
ПОСТРОЕНИЕ ПРЕДСТАВЛЕНИЙ АБСТРАКТНОЙ МАШИНЫ
getamr_ 3.3 Опрос ссылки на элемент представления абстрактной машины
AMRef getamr_ (AMViewRef *AMViewRefPtr, long IndexArray[]);
| *AMViewRefPtr | – | ссылка на представление абстрактной машины. |
| IndexArray | – | массив, i-й элемент которого содержит значение индекса опрашиваемого элемента (т.е. абстрактной машины) по измерению i+1. |
call_getamr_ TIME=0.000000 LINE=6 FILE=tasks.fdv AMViewRefPtr=4dff90; AMViewRef=9024c0; IndexArray[0]=0; ret_getamr_ TIME=0.000000 LINE=6 FILE=tasks.fdv AMRef=903350;
МНОГОПРОЦЕССОРНЫЕ СИСТЕМЫ
genblk_ Веса элементов многопроцессорной системы
long genblk_(PSRef *PSRefPtr, AMViewRef *AMViewRefPtr,
AddrType
AxisWeightAddr[], long *AxisCountPtr,
long *DoubleSignPtr
);
| *PSRefPtr | – | ссылка на многопроцессорную систему, для элементов которой устанавливаются веса. |
| *AMViewRefPtr | – | ссылка на представление абстрактной машины, при oтображении которой в заданную процессорную систему будут использованы устанавливаемые веса координат. |
| AxisWeightAddr[] | – | веса координат процессоров задаются в отдельном для каждого измерения процессорной системы. |
| *AxisCountPtr | – | (неотрицательное целое число) задаёт количество элементов в массиве AxisWeightAddr. |
| *DoubleSignPtr | – | ненулевой признак представления весов координат процессоров в виде вещественных положительных чисел (double). |
call_genblk_ TIME=0.000000 LINE=7 FILE=gausgb.fdv PSRefPtr=4d4c48; PSRef=8417d0; AMViewRefPtr=4d4c60; AMViewRef=842860; AxisCount=1; DoubleSign=0 AxisWeightAddr[0][0] = 3 ret_genblk_ TIME=0.000000 LINE=7 FILE=gausgb.fdv
crtps_ 4.2 Создание подсистемы заданной многопроцессорной системы
PSRef crtps_ (PSRef *PSRefPtr, long InitIndexArray[], long
LastIndexArray[],
long
*StaticSignPtr);
| *PSRefPtr | – | ссылка на процессорную систему (исходную), подсистему которой требуется создать. |
| InitIndexArray | – | массив, i-й элемент которого содержит начальное значение индекса исходной процессорной системы по измерению i+1. |
| LastIndexArray | – | массив, i-й элемент которого содержит конечное значение ндекса исходной процессорной системы по измерению i+1. |
| *StaticSignPtr | – | признак создания статической подсистемы. |
call_crtps_ TIME=0.000000 LINE=15 FILE=tasks.fdv
PSRefPtr=4ded68; PSRef=902450; StaticSign=0;
InitIndexArray[0]=0;
LastIndexArray[0]=0;
SizeArray[0]=1;
CoordWeight[0]= 1.00(1.00)
ret_crtps_ TIME=0.000000 LINE=15 FILE=tasks.fdv
PSRef=903950;
psview_ 4.3 Реконфигурация (изменение формы) многопроцессорной системы
PSRef psview_ (PSRef *PSRefPtr, long *RankPtr, long
SizeArray[],
long
*StaticSignPtr);
| *PSRefPtr | – | ссылка на исходную (реконфигурируемую) процессорную систему. |
| *RankPtr | – | размерность результирующей (реконфигурированной) процессорной системы. |
| SizeArray | – | массив, i-й элемент которого содержит размер результирующей процессорной системы по измерению i+1. |
| *StaticSignPtr | – | признак статической результирующей процессорной системы. |
call_psview_ TIME=0.000000 LINE=6 FILE=tasks.fdv
PSRefPtr=4dff84; PSRef=901330; Rank=1; StaticSign=0;
SizeArray[0]=1;
SizeArray[0]=1;
CoordWeight[0]= 1.00(1.00)
ret_psview_ TIME=0.000000 LINE=6 FILE=tasks.fdv
PSRef=902450;
ОТОБРАЖЕНИЕ РАСПРЕДЕЛЕННОГО МАССИВА
getamv_ 7.8 Опрос ссылки на представление абстрактной машины, в которое отображён заданный распределённый массив
AMViewRef getamv_ (long * ArrayHeader);
| ArrayHeader | – | заголовок распределённого массива. |
call_getamv_ TIME=0.000000 LINE=16 FILE=tasks.fdv ArrayHeader=4dfee8; ArrayHandlePtr=903530; ret_getamv_ TIME=0.000000 LINE=16 FILE=tasks.fdv AMViewRef=0;
ПРЕДСТАВЛЕНИЕ
ПРОГРАММЫ В ВИДЕ СОВОКУПНОСТИ
ПАРАЛЛЕЛЬНО ВЫПОЛНЯЮЩИХСЯ
ПОДЗАДАЧ
mapam_ 10.1 Отображение абстрактной машины (создание подзадачи)
long mapam_ (AMRef *AMRefPtr, PSRef *PSRefPtr );
| *AMRefPtr | – | ссылка на отображаемую абстрактную машину. |
| *PSRefPtr | – | ссылка на процессорную подсистему, определяющую состав выделяемых абстрактной машине процессоров (область выполнения создаваемой подзадачи). |
call_mapam_ TIME=0.000000 LINE=51 FILE=tsk_ra.cdv AMRefPtr=4b3cc0; AMRef=823210; PSRefPtr=4b3ec4; PSRef=8231a0; ret_mapam_ TIME=0.000000 LINE=51 FILE=tsk_ra.cdv
runam_ 10.2 Начало выполнения (активизация, пуск) подзадачи
long runam_ (AMRef *AMRefPtr);
| *AMRefPtr | – | ссылка на абстрактную машину запускаемой подзадачи. |
call_runam_ TIME=0.000000 LINE=102 FILE=tsk_ra.cdv AMRefPtr=4b3cc0; AMRef=823210; ret_runam_ TIME=0.000000 LINE=102 FILE=tsk_ra.cdv
stopam_ 10.3 Завершение выполнения (останов) текущей подзадачи
long stopam_ (void);
call_stopam_ TIME=0.000000 LINE=104 FILE=tsk_ra.cdv ret_stopam_ TIME=0.000000 LINE=104 FILE=tsk_ra.cdv
РЕДУКЦИЯ
strtrd_ 11.5 Запуск редукционной группы
long strtrd_ (RedGroupRef *RedGroupRefPtr);
| *RedGroupRefPtr | – | ссылка на редукционную группу. |
call_strtrd_ TIME=0.000000 LINE=129 FILE=tsk_ra.cdv RedGroupRefPtr=6ffcdc; RedGroupRef=8291f0; rf_MAX; rt_DOUBLE; RVAddr = 6ffd24; RVVal = 7.000000 ret_strtrd_ TIME=0.000000 LINE=129 FILE=tsk_ra.cdv
waitrd_ 11.6 Ожидание завершения редукции
long waitrd_ (RedGroupRef *RedGroupRefPtr);
| *RedGroupRefPtr | – | ссылка на редукционную группу. |
call_waitrd_ TIME=0.000000 LINE=129 FILE=tsk_ra.cdv RedGroupRefPtr=6ffcdc; RedGroupRef=8291f0; rf_MAX; rt_DOUBLE; RVAddr = 6ffd24; RVVal = 7.000000 rf_MAX; rt_DOUBLE; RVAddr = 6ffd24; RVVal = 7.000000 ret_waitrd_ TIME=0.000000 LINE=129 FILE=tsk_ra.cdv
ОБМЕН ГРАНИЦАМИ РАСПРЕДЕЛЕННЫХ МАССИВОВ
recvsh_ 12.4 Инициализация приема импортируемых элементов заданной группы границ
long recvsh_(ShadowGroupRefPtr *ShadowGroupRefPtr);
| *ShadowGroupRefPtr | – | ссылка на группу границ. |
call_recvsh_ TIME=0.000000 LINE=20 FILE=sor.fdv ShadowGroupRefPtr=4cf6b8; ShadowGroupRef=8433c0; ret_recvsh_ TIME=0.000000 LINE=20 FILE=sor.fdv
sendsh_ 12.5 Инициализация передачи экспортируемых элементов заданной группы границ
long sendsh_(ShadowGroupRefPtr *ShadowGroupRefPtr);
| *ShadowGroupRefPtr | – | ссылка на группу границ. |
call_sendsh_ TIME=0.000000 LINE=29 FILE=sor.fdv ShadowGroupRefPtr=4cf6b8; ShadowGroupRef=8433c0; ret_sendsh_ TIME=0.000000 LINE=29 FILE=sor.fdv
РЕГУЛЯРНЫЙ ДОСТУП К УДАЛЕННЫМ ДАННЫМ
crtrbl_ 14.1 Создание буфера удалённых элементов распределённого массива
long crtrbl_(long RemArrayHeader[], long BufferHeader[],
void *BasePtr,
long *StaticSignPtr,
LoopRef *LoopRefPtr, long AxisArray[],
long CoeffArray[], long
ConstArray[]);
| RemArrayHeader | – | заголовок удалённого распределённого массива. |
| BufferHeader | – | заголовок создаваемого буфера удалённых элементов. |
| BasePtr | – | базовый указатель для доступа к буферу удалённых элементов. |
| *StaticSignPtr | – | признак создания статического буфера. |
| *LoopRefPtr | – | ссылка на параллельный цикл, при выполнении которого необходимы размещённые в буфере элементы удалённого массива. |
| AxisArray | – | массив i-й элемент которого содержит номер измерения параллельного цикла (k(i+1)), соответствующего (i+1)-му измерению удалённого массива. |
| CoeffArray | – | массив, i-й элемент которого содержит коэффициент индексной переменной линейного правила выборки для (i+1)-го измерения удалённого массива A(i+1). |
| ConstArray | массив, i-й элемент которого содержит константу линейного правила выборки для (i+1)-го измерения удалённого массива B(i+1). |
call_crtrbl_ TIME=0.000000 LINE=45 FILE=tasks.fdv
RemArrayHeader=4dfd2c; RemArrayHandlePtr=9057c0; BufferHeader=4dfd48;
BasePtr=4e1200; StaticSign=1; LoopRefPtr=4dffd0; LoopRef=906b70;
AxisArray[0]=1; AxisArray[1]=0;
CoeffArray[0]=1; CoeffArray[1]=0;
ConstArray[0]=-1; ConstArray[1]=1;
SizeArray[0]=8;
LowShdWidthArray[0]=0;
HiShdWidthArray[0]=0;
Local[0]: Lower=0 Upper=7 Size=8 Step=1
ret_crtrbl_ TIME=0.000000 LINE=45 FILE=tasks.fdv
BufferHandlePtr=906e70; IsLocal=1
loadrb_ 14.2 Запуск загрузки буфера удаленных элементов распределенного массива
long loadrb_ (long BufferHeader[], long *RenewSignPtr);
| BufferHeader | – | заголовок буфера удаленных элементов. |
| *RenewSignPtr | – | признак повторной перезагрузки уже загруженного буфера. |
call_loadrb_ TIME=0.000000 LINE=45 FILE=tasks.fdv
BufferHeader=4dfd48; BufferHandlePtr=906e70; RenewSign=0;
FromInitIndexArray[0]=0; FromInitIndexArray[1]=1;
FromLastIndexArray[0]=7; FromLastIndexArray[1]=1;
FromStepArray[0]=1; FromStepArray[1]=1;
ToInitIndexArray[0]=0;
ToLastIndexArray[0]=7;
ToStepArray[0]=1;
ResInitIndexArray[0]=0; ResInitIndexArray[1]=1;
ResLastIndexArray[0]=7; ResLastIndexArray[1]=1;
ResStepArray[0]=1; ResStepArray[1]=1;
ResInitIndexArray[0]=0;
ResLastIndexArray[0]=7;
ResStepArray[0]=1;
ret_loadrb_ TIME=0.000000 LINE=45 FILE=tasks.fdv
waitrb_ 14.3 Ожидание завершения загрузки буфера удаленных элементов распределенного массива
long waitrb_ (long BufferHeader[]);
| BufferHeader | – | заголовок буфера удаленных элементов. |
call_waitrb_ TIME=0.000000 LINE=45 FILE=tasks.fdv BufferHeader=4dfd48; BufferHandlePtr=906e70; ret_waitrb_ TIME=0.000000 LINE=45 FILE=tasks.fdv
crtbg_ 14.6 Создание группы буферов удаленных элементов
RegularAccessGroupRef crtbg_(long *StaticSignPtr, long *DelBufSignPtr );
| *StaticSignPtr | – | признак создания статической группы буферов. |
| *DelBufSignPtr | – | признак уничтожения всех буферов, входящих в группу, при её уничтожении. |
call_crtbg_ TIME=0.000000 LINE=43 FILE=tasks.fdv StaticSign=0; DelBufSign=1; ret_crtbg_ TIME=0.000000 LINE=43 FILE=tasks.fdv RegularAccessGroupRef=906310;
insrb_ Включение в группу буфера удаленных элементов
long insrb_(RegularAccessGroupRef
*RegularAccessGroupRefPtr,
long BufferHeader[]);
| *RegularAccessGroupRefPtr | – | ссылка на группу буферов. |
| BufferHeader | – | заголовок включаемого буфера. |
call_insrb_ TIME=0.000000 LINE=45 FILE=tasks.fdv RegularAccessGroupRefPtr=4e1210; RegularAccessGroupRef=906310; BufferHeader=4dfd48; BufferHeader[0]=906e70 ret_insrb_ TIME=0.000000 LINE=45 FILE=tasks.fdv
loadbg_ Запуск загрузки буферов удаленных элементов заданной группы
long loadbg_(RegularAccessGroupRef
*RegularAccessGroupRefPtr,
long
*RenewSignPtr);
| *RegularAccessGroupRefPtr | – | ссылка на группу буферов. |
| *RenewSignPtr | – | признак повторной перезагрузки уже загруженной группы буферов. |
call_loadbg_ TIME=0.000000 LINE=43 FILE=tasks.fdv
RegularAccessGroupRefPtr=4e1210; RegularAccessGroupRef=906310; RenewSign=1
FromInitIndexArray[0]=0; FromInitIndexArray[1]=1;
FromLastIndexArray[0]=7; FromLastIndexArray[1]=1;
FromStepArray[0]=1; FromStepArray[1]=1;
ToInitIndexArray[0]=0;
ToLastIndexArray[0]=7;
ToStepArray[0]=1;
ResInitIndexArray[0]=0; ResInitIndexArray[1]=1;
ResLastIndexArray[0]=7; ResLastIndexArray[1]=1;
ResStepArray[0]=1; ResStepArray[1]=1;
ResInitIndexArray[0]=0;
ResLastIndexArray[0]=7;
ResStepArray[0]=1;
FromInitIndexArray[0]=0; FromInitIndexArray[1]=3;
FromLastIndexArray[0]=7; FromLastIndexArray[1]=3;
FromStepArray[0]=1; FromStepArray[1]=1;
ToInitIndexArray[0]=0;
ToLastIndexArray[0]=7;
ToStepArray[0]=1;
ResInitIndexArray[0]=0; ResInitIndexArray[1]=3;
ResLastIndexArray[0]=7; ResLastIndexArray[1]=3;
ResStepArray[0]=1; ResStepArray[1]=1;
ResInitIndexArray[0]=0;
ResLastIndexArray[0]=7;
ResStepArray[0]=1;
ret_loadbg_ TIME=0.010000 LINE=43 FILE=tasks.fdv
waitbg_ Ожидание завершения загрузки буферов удаленных элементов заданной группы
long waitbg_ (RegularAccessGroupRef *RegularAccessGroupRefPtr);
| *RegularAccessGroupRefPt | – | ссылка на группу буферов. |
call_waitbg_ TIME=0.000000 LINE=45 FILE=tasks.fdv RegularAccessGroupRefPtr=4e1210; RegularAccessGroupRef=906310; ret_waitbg_ TIME=0.000000 LINE=45 FILE=tasks.fdv