Files
SAPFOR/Sapfor/_src/Predictor/Lib/ModelRemAccess.cpp

279 lines
8.3 KiB
C++
Raw Normal View History

2023-09-14 19:43:13 +03:00
#include <fstream>
#include <assert.h>
#include "ModelStructs.h"
#include "FuncCall.h"
#include "CallInfoStructs.h"
#include "Interval.h"
#include "Vm.h"
using namespace std;
extern ofstream prot;
extern _PSInfo* GetPSByIndex(long ID);
extern _ParLoopInfo ParLoopInfo;
extern _DArrayFlag * DAF_tmp;
_DArrayInfo* GetDArrayByIndex(long ID);
_RemAccessInfo *RemAccess = NULL;
int _RemAccessInfo::count = 0;
//-------------------------------- RemAccess --------------------------------------------
int GetRemAccessIndex(long ID)
{
int i;
for (i = RemAccess->size() - 1; (i >= 0) && RemAccess[i].ID!=ID; i--);
return i;
}
_RemAccessInfo* GetRemAccessByIndex(long ID)
{
int i = GetRemAccessIndex(ID);
return (i>=0) ? &RemAccess[i] : NULL;
}
_RemAccessInfo* AddRemAccess(long ID)
{
_RemAccessInfo* tmp;
int curr_size = RemAccess->size();
RemAccess=(_RemAccessInfo*)realloc(RemAccess,(curr_size+1)*sizeof(_RemAccessInfo));
assert(RemAccess != NULL);
++*RemAccess;
tmp=&RemAccess[curr_size];
tmp->ID=ID;
return tmp;
}
void DelRemAccess(long ID)
{
int idx=GetRemAccessIndex(ID);
int curr_size = RemAccess->size();
int i;
if (idx<0)
return;
delete RemAccess[idx].RemAccess_Obj;
for (i=idx+1; i<curr_size; i++) {
RemAccess[i-1]=RemAccess[i];
}
RemAccess=(_RemAccessInfo*)realloc(RemAccess,(curr_size-1)*sizeof(_RemAccessInfo));
assert((RemAccess != NULL) || (curr_size == 1));
--*RemAccess;
}
//--------------------------------------------------------------------------------------------------
static double fillRemoteCost(_RemAccessInfo *tmp, _DArrayInfo *ArrFrom, Block &RemBlock)
{
/*DAF_tmp = new (_DArrayFlag);
DAF_tmp->ProcessTimeStamp = (double *)malloc(MPSProcCount() * sizeof(double));*/
CommCost *remCost = new CommCost(currentVM);
for (int i = 0; i < MPSProcCount(); ++i)
remCost->CopyUpdateDistr(ArrFrom->DArray_Obj, RemBlock, i);
double ret = remCost->GetCost();
/*tmp->StartRemoteTimes = (double *)malloc(MPSProcCount() * sizeof(double));
tmp->EndRemoteTimes = (double *)malloc(MPSProcCount() * sizeof(double));
for (int i = 0; i < MPSProcCount(); ++i)
tmp->EndRemoteTimes[currentVM->map(i)] = DAF_tmp->ProcessTimeStamp[currentVM->map(i)]; // time of communication
free(DAF_tmp->ProcessTimeStamp);
delete DAF_tmp;
DAF_tmp = NULL;*/
return ret;
}
void FuncCall::crtrbp()
{
crtrbp_Info *params = (crtrbp_Info*)call_params;
_RemAccessInfo *tmp = AddRemAccess(params->ID);
if (params->PSRef == 0)
tmp->RemAccess_Obj = new RemAccessBuf(currentVM);
else
{
_PSInfo *ps = GetPSByIndex(params->PSRef);
tmp->RemAccess_Obj = new RemAccessBuf(ps->VM_Obj);
}
_DArrayInfo *ArrFrom = GetDArrayByIndex(params->RemArrayHeader);
vector<LS> blockIni;
for (int z = 0; z < params->CoordArray.size(); ++z)
{
if (params->CoordArray[z] == -1)
blockIni.push_back(LS(0, ArrFrom->DArray_Obj->GetSize(z + 1) - 1, 1));
else
blockIni.push_back(LS(0, 1, 1));
}
Block RemBlock(blockIni);
ret_time += fillRemoteCost(tmp, ArrFrom, RemBlock);
}
void FuncCall::crtrbl()
{
int i, j;
CommCost *remCost = new CommCost(currentVM);
vector<long> FromInitIndexArray;
vector<long> FromLastIndexArray;
vector<long> FromStepIndexArray;
vector<long> proc_indexes;
vector <LS> blockIni;
crtrbl_Info* params = (crtrbl_Info*)call_params;
_RemAccessInfo* tmp = AddRemAccess(params->BufferHeader);
_DArrayInfo* ArrFrom = GetDArrayByIndex(params->RemArrayHeader);
// printf("Create Remote block %x %x\n",params->RemArrayHeader, params->LoopRef);
LoopBlock** ProcBlock = (LoopBlock**)calloc(MPSProcCount(), sizeof(LoopBlock*));
assert(ProcBlock != NULL);
proc_indexes.resize(0);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (i = 0; i < MPSProcCount(); i++)
{
ProcBlock[i] = new LoopBlock(ParLoopInfo.ParLoop_Obj, i, 1);
if (!ProcBlock[i]->empty())
proc_indexes.push_back(i);
}
/*
for(i=0;i<MPSProcCount();i++)
{
printf("Proc[%d] Block=",i);
for(j=0;j<ProcBlock[i]->LSDim.size();j++)
printf(" %d..%d",ProcBlock[i]->LSDim[j].Lower,ProcBlock[i]->LSDim[j].Upper);
printf("\n");
}
printf("Array size=");
for(j=0;j<ArrFrom->DArray_Obj->Rank();j++)
printf(" %d",ArrFrom->DArray_Obj->GetSize(j+1));
printf("\n");
*/
FromInitIndexArray.resize(params->AxisArray.size());
FromLastIndexArray.resize(params->AxisArray.size());
FromStepIndexArray.resize(params->AxisArray.size());
for (j = 0; j < params->AxisArray.size(); j++)
{
if (params->AxisArray[j] == -1)
{
FromInitIndexArray[j] = 0;
FromLastIndexArray[j] = ArrFrom->DArray_Obj->GetSize(j + 1) - 1;
FromStepIndexArray[j] = 1;
}
else
{
if (params->CoeffArray[j] == 0)
{
FromInitIndexArray[j] = params->ConstArray[j];
FromLastIndexArray[j] = params->ConstArray[j];
FromStepIndexArray[j] = 1;
}
else
{
//dont know yet
}
}
}
/*
printf("Remote block =");
for(j=0;j<params->AxisArray.size();j++)
printf(" %d..%d(st=%d)",FromInitIndexArray[j],FromLastIndexArray[j],FromStepIndexArray[j]);
printf(" Transfer to procs =");
for(j=0;j<proc_indexes.size();j++)
printf(" %d",proc_indexes[j]);
printf("\n");
*/
for (j = 0; j < FromInitIndexArray.size(); j++)
blockIni.push_back(LS(FromInitIndexArray[j], FromLastIndexArray[j], FromStepIndexArray[j]));
Block RemBlock(blockIni);
for (i = 0; i < proc_indexes.size(); i++)
remCost->CopyUpdateDistr(ArrFrom->DArray_Obj, RemBlock, proc_indexes[i]);
DAF_tmp = new (_DArrayFlag);
DAF_tmp->ProcessTimeStamp = (double *)malloc(MPSProcCount() * sizeof(double));
remCost->GetCost();
tmp->StartRemoteTimes = (double *)malloc(MPSProcCount() * sizeof(double));
tmp->EndRemoteTimes = (double *)malloc(MPSProcCount() * sizeof(double));
for (i = 0; i < MPSProcCount(); i++)
tmp->EndRemoteTimes[currentVM->map(i)] = DAF_tmp->ProcessTimeStamp[currentVM->map(i)]; // time of communication
free(DAF_tmp->ProcessTimeStamp);
delete DAF_tmp;
DAF_tmp = NULL;
++CurrInterval->num_op_remote; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D><> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
void FuncCall::loadrb()
{
loadrb_Info* params=(loadrb_Info*) call_params;
_RemAccessInfo* tmp=GetRemAccessByIndex(params->ID);
int i;
for (i=0; i < MPSProcCount(); i++)
{
tmp->StartRemoteTimes[currentVM->map(i)] = CurrProcTime(currentVM->map(i)); // time of START of communication
tmp->EndRemoteTimes[currentVM->map(i)] += CurrProcTime(currentVM->map(i)); // time of END of communication
}
++CurrInterval->num_op_remote;
}
void FuncCall::waitrb()
{
waitrb_Info* params=(waitrb_Info*) call_params;
_RemAccessInfo* tmp=GetRemAccessByIndex(params->ID);
double curr_pt;
int i;
for (i=0; i < MPSProcCount(); i++)
{
curr_pt=CurrProcTime(currentVM->map(i));
if(curr_pt < tmp->EndRemoteTimes[currentVM->map(i)])
{
AddTime(__Remote_access, currentVM->map(i), tmp->EndRemoteTimes[currentVM->map(i)] - curr_pt);
AddTime(__Remote_overlap, currentVM->map(i), curr_pt - tmp->StartRemoteTimes[currentVM->map(i)]);
}
else
{
AddTime(__Remote_overlap, currentVM->map(i), tmp->EndRemoteTimes[currentVM->map(i)] - tmp->StartRemoteTimes[currentVM->map(i)]);
}
}
++CurrInterval->num_op_remote; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D><> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
void FuncCall::RemAccessTime()
{
switch(func_id) {
case crtrbp_ :
crtrbp();
break;
case crtrbl_ :
crtrbl();
break;
case loadrb_ :
loadrb();
break;
case waitrb_ :
waitrb();
break;
}
RegularTime();
}