Документ взят из кэша поисковой машины. Адрес оригинального документа : http://sp.cs.msu.ru/dvm/dvmhtm1107/rus/sys/predictor/predDDr1.html
Дата изменения: Mon Feb 13 12:59:46 2006
Дата индексирования: Mon Oct 1 23:29:04 2012
Кодировка: Windows-1251
Предиктор. Детальный дизайн (продолжение)

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

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