279 lines
8.3 KiB
C++
279 lines
8.3 KiB
C++
|
|
#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();
|
|||
|
|
}
|
|||
|
|
|