| Предиктор.
        Детальный дизайн (продолжение) | 
- дата последнего обновления 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