Files
SAPFOR/dvm/tools/pppa/trunk/src/inter.cpp
2023-09-15 08:30:58 +03:00

409 lines
12 KiB
C++

#define _STATFILE_
#include "inter.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define CLEAR(A) memset(A, 0, sizeof A);
typedef s_GRPTIMES (*matrix) [StatGrpCount];
CInter::CInter(
matrix pt,
s_SendRecvTimes ps,
ident id,
unsigned long nint,
int iIM,
int jIM,
short sore,
dvmh_stat_interval *dvmhStatInterval
) { int i, j;
// ----------------------------------------------------------------------------------------
// -- Store DVMH statistics for the interval
// ----------------------------------------------------------------------------------------
// store prepared DVMH statistics
this->dvmhStatInterval = dvmhStatInterval;
// ----------------------------------------------------------------------------------------
// -- Store general information about the interval
// ----------------------------------------------------------------------------------------
// set interval name (name of DVM programm)
if (id.pname) {
idint.pname = new char[strlen(id.pname) + 1];
if (idint.pname == NULL)
throw("Internal error: out of memory at %s, line %d \n", __FILE__, __LINE__);
strcpy(idint.pname, id.pname);
}
else idint.pname = NULL;
idint.nline = id.nline; // number of DVM-programm line
idint.nline_end = id.nline_end; // number of end of DVM-programm line
idint.nenter = id.nenter; // number of enters into the interval
idint.expr = id.expr; // conditional expession
idint.nlev = id.nlev; // number of interval level
idint.t = id.t; // type of interval
idint.proc = id.proc; // number of processors§
ninter = nint; // inteval number
// ----------------------------------------------------------------------------------------
// -- Clean statistics storages
// ----------------------------------------------------------------------------------------
CLEAR(mgen)
CLEAR(mcom)
CLEAR(mrcom)
CLEAR(msyn)
CLEAR(mvar)
CLEAR(mcall)
CLEAR(moverlap)
CLEAR(lost)
CLEAR(calls)
CLEAR(prod)
// ----------------------------------------------------------------------------------------
// -- Aggregate statistics information
// ----------------------------------------------------------------------------------------
// Execution characteristics on each processor
for (i = 0; i < StatGrpCount; i++) {
mgen[SUMCOM] += pt[i][MsgPasGrp].LostTime;
mgen[SUMRCOM] += pt[i][MsgPasGrp].ProductTime;
// mgen[CPUUSR] += pt[i][UserGrp].ProductTime;
// mgen[INSUFUSR] += pt[i][UserGrp].LostTime;
// mgen[IOTIME] += pt[i][IOGrp].ProductTime;
for (j = 0; j < StatGrpCount; j++) {
if (i == UserGrp) mgen[CPUUSR] += pt[UserGrp][j].ProductTime;
if (i == UserGrp) mgen[INSUFUSR] += pt[UserGrp][j].LostTime;
if (i == IOGrp) mgen[IOTIME] += pt[IOGrp][j].ProductTime;
mgen[CPU] += pt[i][j].ProductTime;
mgen[EXEC] += pt[i][j].ProductTime + pt[i][j].LostTime;
mgen[INSUF] += pt[i][j].LostTime;
}
}
mgen[EXEC] = mgen[EXEC] - mgen[SUMRCOM];
mgen[CPU] = mgen[CPU] - mgen[CPUUSR] - mgen[SUMRCOM] - mgen[IOTIME];
mgen[INSUF] = mgen[INSUF] - mgen[INSUFUSR] - mgen[SUMCOM];
if (mgen[CPU] < 0) mgen[CPU] = 0.0;
//real synchronization,number of calls, communication
// reduction
mcom[RD] = pt[WaitRedGrp][MsgPasGrp].LostTime + pt[StartRedGrp][MsgPasGrp].LostTime;
mrcom[RD] = pt[WaitRedGrp][MsgPasGrp].ProductTime;
mcall[RD] = pt[UserGrp][WaitRedGrp].CallCount;
// shadow
mcom[SH] = pt[WaitShdGrp][MsgPasGrp].LostTime + pt[DoPLGrp][MsgPasGrp].LostTime + pt[StartShdGrp][MsgPasGrp].LostTime;
mrcom[SH] = pt[WaitShdGrp][MsgPasGrp].ProductTime + pt[DoPLGrp][MsgPasGrp].ProductTime;
mcall[SH] = pt[UserGrp][WaitShdGrp].CallCount;
// remote access
mcom[RA] = pt[RemAccessGrp][MsgPasGrp].LostTime;
mrcom[RA] = pt[RemAccessGrp][MsgPasGrp].ProductTime;
mcall[RA] = pt[UserGrp][RemAccessGrp].CallCount;
// redistribute
mcom[RED] = pt[ReDistrGrp][MsgPasGrp].LostTime;
mrcom[RED] = pt[ReDistrGrp][MsgPasGrp].ProductTime;
mcall[RED] = pt[UserGrp][ReDistrGrp].CallCount;
// input/output
mcom[IO] = pt[IOGrp][MsgPasGrp].LostTime;
mrcom[IO] = pt[IOGrp][MsgPasGrp].ProductTime;
mcall[IO] = pt[UserGrp][IOGrp].CallCount;
// add information
SendCallTime = ps.SendCallTime;
MinSendCallTime = ps.MinSendCallTime;
MaxSendCallTime = ps.MaxSendCallTime;
SendCallCount = ps.SendCallCount;
RecvCallTime = ps.RecvCallTime;
MinRecvCallTime = ps.MinRecvCallTime;
MaxRecvCallTime = ps.MaxRecvCallTime;
RecvCallCount = ps.RecvCallCount;
mgen[START] = SendCallTime + RecvCallTime;
// -- FOR DEBUG !!!
if (iIM != 0) {
for (i = 0; i < StatGrpCount; i++) {
if (sore == 1) {//sum
for (j = 0; j < StatGrpCount; j++) {
//mgen[j] = mgen[j] + pt[i][k].ProductTime;
lost[i] = lost[i] + pt[i][j].LostTime;
prod[i] = prod[i] + pt[i][j].ProductTime;
calls[i] = calls[i] + pt[i][j].CallCount;
}
} else {
//mgen[j]=pt[iIM-1][i].ProductTime;
lost[i] = pt[iIM-1][i].LostTime;
prod[i] = pt[iIM-1][i].ProductTime;
calls[i] = pt[iIM-1][i].CallCount;
}
}
}
if (jIM != 0) {
for (i = 0; i < StatGrpCount; i++) {
if (sore == 1) {
for (j = 0; j < StatGrpCount; j++) {
//mgen[j] = mgen[j] + pt[k][i].ProductTime;
prod[i] = prod[i] + pt[j][i].ProductTime;
lost[i] = lost[i] + pt[j][i].LostTime;
calls[i] = calls[i] + pt[j][i].CallCount;
}
} else {
//mgen[j] = pt[i][jIM-1].ProductTime;
prod[i] = pt[i][jIM-1].ProductTime;
lost[i] = pt[i][jIM-1].LostTime;
calls[i] = pt[i][jIM-1].CallCount;
}
}
}
}
//-------------------------------------------------
// deallocate memory for name of DVM-program
CInter::~CInter()
{
if (idint.pname!=NULL) delete []idint.pname;
delete[] this->dvmhStatInterval->threads;
delete this->dvmhStatInterval;
}
//--------------------------------------------------
// addition execution time characteristics
void CInter::AddTime(typetime t2,double val)
//t2 - type of execution characteristics
// val - additional value
{
#ifdef _DEBUG
if (t2<0 || t2>ITER) {
printf("CInter AddTime incorrect typetime %d\n",t2);
return;
}
#endif
if (t2 == DVMH_GPU_TIME_PRODUCTIVE)
this->dvmhStatInterval->allGPUTimeProductive += val;
else if (t2 == DVMH_GPU_TIME_LOST)
this->dvmhStatInterval->allGPUTimeLost += val;
else if (t2 == DVMH_THREADS_USER_TIME)
this->dvmhStatInterval->allThreadsUserTime += val;
else if (t2 == DVMH_THREADS_SYSTEM_TIME)
this->dvmhStatInterval->allThreadsSystemTime += val;
else
mgen[t2] = mgen[t2] + val;
}
//--------------------------------------------------
//write new execution time characteristics
void CInter::WriteTime(typetime t2,double val)
//t2 - type of execution characteristics
// val - new value
{
#ifdef _DEBUG
if (t2<0 || t2>ITER) {
printf("CInter WriteTime incorrect typetime %d\n",t2);
return;
}
#endif
if (t2 == DVMH_GPU_TIME_PRODUCTIVE)
this->dvmhStatInterval->allGPUTimeProductive = val;
else if (t2 == DVMH_GPU_TIME_LOST)
this->dvmhStatInterval->allGPUTimeLost = val;
else if (t2 == DVMH_THREADS_USER_TIME)
this->dvmhStatInterval->allThreadsUserTime = val;
else if (t2 == DVMH_THREADS_SYSTEM_TIME)
this->dvmhStatInterval->allThreadsSystemTime = val;
else
mgen[t2] = val;
}
//-------------------------------------------------
// read execution time characteristics
void CInter::ReadTime(typetime t2,double &val)
//t2 - type of execution characteristics
// val - answer
{
#ifdef _DEBUG
if (t2<0 || t2>ITER) {
printf("CInter ReadTime incorrect typetime %d\n",t2);
return;
}
#endif
if (t2 == DVMH_GPU_TIME_PRODUCTIVE)
val = this->dvmhStatInterval->allGPUTimeProductive;
else if (t2 == DVMH_GPU_TIME_LOST)
val = this->dvmhStatInterval->allGPUTimeLost;
else if (t2 == DVMH_THREADS_USER_TIME)
val = this->dvmhStatInterval->allThreadsUserTime;
else if (t2 == DVMH_THREADS_SYSTEM_TIME)
val = this->dvmhStatInterval->allThreadsSystemTime;
else
val = mgen[t2];
}
//--------------------------------------------------
// addition times of collective operations
void CInter::AddTime(typegrp t1,typecom t2,double val)
//t1 - type of communication operation
//t2 - type of collective operation
//val - additional value
{
#ifdef _DEBUG
if (t2<0 || t2>RED) {
printf("CInter AddTime incorrect typecom %d\n",t2);
return;
}
#endif
switch (t1) {
case COM:
mcom[t2]=mcom[t2]+val;
break;
case RCOM:
mrcom[t2]=mrcom[t2]+val;
break;
case SYN :
msyn[t2]=msyn[t2]+val;
break;
case VAR:
mvar[t2]=mvar[t2]+val;
break;
case CALL:
mcall[t2]=mcall[t2]+val;
break;
case OVERLAP:
moverlap[t2]=moverlap[t2]+val;
break;
default:
printf("CInter WriteCom incorrect typegrp\n");
break;
}
}
//---------------------------------------------------
// read communication collective operations time
void CInter::ReadTime(typegrp t1,typecom t2,double &val)
//t1 - type of communication operation
//t2 - type of collective operation
//val - answer
{
#ifdef _DEBUG
if (t2<0 || t2>RED) {
printf("CInter ReadTime incorrect typecom %d\n",t2);
return;
}
#endif
switch (t1) {
case COM:
val=mcom[t2];
break;
case RCOM:
val=mrcom[t2];
break;
case SYN :
val=msyn[t2];
break;
case VAR:
val=mvar[t2];
break;
case CALL:
val=mcall[t2];
break;
case OVERLAP:
val=moverlap[t2];
break;
default:
printf("CInter ReadTime incorrect typegrp\n");
break;
}
}
//---------------------------------------------------
// read time from interval matrix
void CInter::ReadTime(typetimeim t1,int t2,double &val)
//t1 - type of time (lost/number of calls)
//t2 - index
//val - answer
{
#ifdef _DEBUG
if (t2<0 || t2>=StatGrpCount) {
printf("CInter ReadTime incorrect 2 parameter %d\n",t2);
return;
}
#endif
switch (t1) {
case CALLSMT:
val=calls[t2];
break;
case LOSTMT:
val=lost[t2];
break;
case PRODMT:
val=prod[t2];
break;
default:
printf("CInter ReadTime incorrect type of im time\n");
break;
}
}
//-----------------------------------------------------
// compare identifier information on other processors
int CInter::CompIdent(ident *p)
//p - pointer identifire information
{
if ((idint.pname==NULL || (strcmp(p->pname,idint.pname)==0)) && (p->nline==idint.nline) &&
(p->nlev==idint.nlev) && (p->expr==idint.expr) && (p->t==idint.t)) {
return(1);
}
return(0);
}
//------------------------------------------------------
// read identifier information
void CInter::ReadIdent(ident **p)
{
*p=&idint;
}
//-----------------------------------------------------
// sum times characteristics upon levels
void CInter::SumInter(CInter *p)
{
int i;
for (i=0;i<=RED;i++) {
mgen[SUMSYN]=mgen[SUMSYN]+msyn[i];
mgen[SUMVAR]=mgen[SUMVAR]+mvar[i];
mgen[SUMOVERLAP]=mgen[SUMOVERLAP]+moverlap[i];
}
mgen[PROC]=(double)idint.proc;
if (idint.proc!=0) {
mgen[LOST]=mgen[INSUF]+mgen[INSUFUSR]+mgen[IDLE]+mgen[SUMCOM];
}
if (p==NULL) return;
for (i=0;i<=ITER;i++) {
if (i<SUMSYN || i>SUMOVERLAP) p->mgen[i]=p->mgen[i]+mgen[i];
}
for (i=0;i<StatGrpCount;i++) {
p->lost[i]=p->lost[i]+lost[i];
p->prod[i]=p->prod[i]+prod[i];
p->calls[i]=p->calls[i]+calls[i];
}
// add information
p->SendCallTime=p->SendCallTime+SendCallTime;
p->MinSendCallTime=p->MinSendCallTime+MinSendCallTime;
p->MaxSendCallTime=p->MaxSendCallTime+MaxSendCallTime;
p->SendCallCount=p->SendCallCount+SendCallCount;
p->RecvCallTime=p->RecvCallTime+RecvCallTime;
p->MinRecvCallTime=p->MinRecvCallTime+MinRecvCallTime;
p->MaxRecvCallTime=p->MaxRecvCallTime+MaxRecvCallTime;
p->RecvCallCount=p->RecvCallCount+RecvCallCount;
// sum communication information
for (i=0;i<=RED;i++) {
p->mcom[i]=p->mcom[i]+mcom[i];
p->mrcom[i]=p->mrcom[i]+mrcom[i];
p->msyn[i]=p->msyn[i]+msyn[i];
p->mvar[i]=p->mvar[i]+mvar[i];
p->moverlap[i]=p->moverlap[i]+moverlap[i];
p->mcall[i]=p->mcall[i]+mcall[i];
}
}