<= Предиктор. Детальный дизайн (начало)

Предиктор. Детальный дизайн (продолжение)
* Сентябрь, 2000 *

- дата последнего обновления 22.05.01 -


11 Параметры DVM-системы

Приложение 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

Литература

  1. В.Е.Денисов, В.Н.Ильяков, Н.В.Ковалева, В.А.Крюков.Отладка эффективности DVM-программ. ИПМ им. М.В.Келдыша РАН. Препринт № 74 за 1998 г.