962 lines
26 KiB
C++
962 lines
26 KiB
C++
|
|
#define _STATFILE_
|
||
|
|
#include "zlib.h"
|
||
|
|
#include <string.h>
|
||
|
|
#include <float.h>
|
||
|
|
#include <limits.h>
|
||
|
|
#include <stdio.h>
|
||
|
|
#include <string.h>
|
||
|
|
#include <stdlib.h>
|
||
|
|
#include <new>
|
||
|
|
#include "bool.h"
|
||
|
|
#include "strall.h"
|
||
|
|
#include "inter.h"
|
||
|
|
#include "treeinter.h"
|
||
|
|
#include "potensyn.h"
|
||
|
|
#include "statread.h"
|
||
|
|
using namespace std;
|
||
|
|
extern short reverse,szsh,szl,szd,szv,torightto,torightfrom;
|
||
|
|
// read intervals and synchronyzation times from file
|
||
|
|
CStatRead::CStatRead(const char * name,int iIM,int jIM,short sore)
|
||
|
|
// name - file name
|
||
|
|
{
|
||
|
|
gzFile ff=NULL;
|
||
|
|
valid=TRUE;
|
||
|
|
valid_warning=0;
|
||
|
|
BOOL valid_synchro=TRUE;
|
||
|
|
valid_synchro=TRUE;
|
||
|
|
pclfrag=NULL;
|
||
|
|
pclsyn=NULL;
|
||
|
|
pic=NULL;
|
||
|
|
pch_vmssize=NULL;
|
||
|
|
pvers=NULL;
|
||
|
|
pvms *pb_vms=NULL;
|
||
|
|
proccount=0;
|
||
|
|
ff=gzopen(name,"rb");
|
||
|
|
if (ff==NULL) {
|
||
|
|
valid=FALSE;
|
||
|
|
sprintf(texterr,"Can't open file %s \n",name);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
unsigned long lbufcompr,lbufuncompr=0,luncompr,luncomprread;
|
||
|
|
pbufcompr=NULL;pbufuncompr=NULL;
|
||
|
|
char lbufplusch[12]={0};
|
||
|
|
char nprocch[12]={0};
|
||
|
|
int s; // for gzread
|
||
|
|
long l; // for gztell
|
||
|
|
short sz[QV_CONST];
|
||
|
|
unsigned char *psz; //struc sz
|
||
|
|
gzplus =0; // sign of file gz/ gz+
|
||
|
|
if (strstr(name,".gz+") !=NULL) { //file gz+
|
||
|
|
gzplus=1;
|
||
|
|
int k;
|
||
|
|
for (k=0;;k++) { // number of compressed bytes
|
||
|
|
if (gzread(ff,&(lbufplusch[k]),1)!=1) {
|
||
|
|
valid=FALSE;
|
||
|
|
sprintf(texterr,"Can't read from file %s \n",name);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
if (lbufplusch[k]==0) break;
|
||
|
|
}
|
||
|
|
lbufuncompr=atol(lbufplusch); // size of buffer
|
||
|
|
for (k=0;k<12;k++) lbufplusch[k]=0;
|
||
|
|
for (k=0;;k++) { // number of processors
|
||
|
|
if (gzread(ff,&(nprocch[k]),1)!=1) {
|
||
|
|
valid=FALSE;
|
||
|
|
sprintf(texterr,"Can't read from file %s \n",name);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
if (nprocch[k]==0) break;
|
||
|
|
}
|
||
|
|
for (k=0;;k++) { // number of compressed bytes
|
||
|
|
if (gzread(ff,&(lbufplusch[k]),1)!=1) {
|
||
|
|
valid=FALSE;
|
||
|
|
sprintf(texterr,"Can't read from file %s \n",name);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
if (lbufplusch[k]==0) break;
|
||
|
|
}
|
||
|
|
lbufcompr=atol(lbufplusch);
|
||
|
|
pbufcompr=new unsigned char[lbufcompr];
|
||
|
|
if (pbufcompr==NULL) throw("Out of memory\n");
|
||
|
|
luncompr=lbufuncompr+lbufuncompr/1000+12; // length uncompressed buffer
|
||
|
|
luncomprread=luncompr;
|
||
|
|
if (pbufcompr!=NULL) {
|
||
|
|
pbufuncompr=new unsigned char[luncompr];
|
||
|
|
if (pbufuncompr==NULL) throw("Out of memory\n");
|
||
|
|
}
|
||
|
|
s=gzread(ff,pbufcompr,lbufcompr);
|
||
|
|
if (s!=(int)lbufcompr) {
|
||
|
|
valid=FALSE;
|
||
|
|
sprintf(texterr,"Can't read from file %s l=%ld\n",name,lbufcompr);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
int err=uncompress(pbufuncompr,&luncomprread,pbufcompr,lbufcompr);
|
||
|
|
if (err!=Z_OK || luncomprread!=lbufuncompr) {
|
||
|
|
valid=FALSE;
|
||
|
|
sprintf(texterr,"Can't uncompress l=%ld\n",lbufcompr);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
psz=pbufuncompr;
|
||
|
|
} else { // file gz or other files
|
||
|
|
l=gztell(ff);
|
||
|
|
psz=(unsigned char *)(&(sz[0]));
|
||
|
|
// read const information about size of variables and reverse
|
||
|
|
s=gzread(ff,&sz,sizeof(sz));
|
||
|
|
if (s!=(int)sizeof(sz)) {
|
||
|
|
valid=FALSE;
|
||
|
|
sprintf(texterr,"Can't read from file %s addr=%ld size=%d\n",
|
||
|
|
name,l,(int)sizeof(sz));
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
// data presentation
|
||
|
|
memcpy(&reverse,psz,2); // variables reverse and toright for CPYMEM
|
||
|
|
if (reverse!=1) {
|
||
|
|
short imcpy,sh1=0;
|
||
|
|
for (imcpy=sizeof(reverse)-1;imcpy>=0;imcpy--) {
|
||
|
|
*((unsigned char*)(&sh1)+imcpy)=
|
||
|
|
*((unsigned char *)(&reverse)+sizeof(reverse)-1-imcpy);
|
||
|
|
}
|
||
|
|
if (sh1!=1) {
|
||
|
|
valid=FALSE;
|
||
|
|
sprintf(texterr,"Analyzing file %s is not statistics\n",name);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
reverse=1;
|
||
|
|
}else reverse=0;
|
||
|
|
short left=1; torightto=0;torightfrom=0;
|
||
|
|
char *pleft=(char *)&left;
|
||
|
|
if (reverse==1) { // data reverse
|
||
|
|
if (pleft[0]==0 ) torightto=1;else torightfrom=1;
|
||
|
|
}
|
||
|
|
// size of used variables
|
||
|
|
CPYMEM(szsh,psz+2,2);
|
||
|
|
CPYMEM(szl,psz+4,2);
|
||
|
|
CPYMEM(szv,psz+6,2);
|
||
|
|
CPYMEM(szd,psz+8,2);
|
||
|
|
if ((szsh!=SZSH) || /*(szl>SZL) || (szv>SZV) ||*/ (szd!=SZD)) {
|
||
|
|
valid=FALSE;
|
||
|
|
sprintf(texterr,"Size of accumulating data > size of machine data %d>%d\n",
|
||
|
|
szsh,(int)SZSH);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
if ((szl>SZL) || (szv>SZV) ) {
|
||
|
|
sprintf(textwarning[valid_warning],"Number of operation may be incorrect. Data size not equal. %d>%d %d>%d\n",
|
||
|
|
szl,(int)SZL,szv,(int)SZV);
|
||
|
|
valid_warning++;
|
||
|
|
}
|
||
|
|
// calculate size of const information
|
||
|
|
int lvms=QV_SHORT*szsh+QV_LONG*szl+QV_VOID*szv+QV_DOUBLE*szd;
|
||
|
|
// read const information from file
|
||
|
|
unsigned char *pch_vms=NULL;
|
||
|
|
if (gzplus==1) pch_vms=pbufuncompr+sizeof(sz);
|
||
|
|
else {
|
||
|
|
pch_vms=new unsigned char[lvms];
|
||
|
|
if (pch_vms==NULL) throw("Out of memory\n");
|
||
|
|
l=gztell(ff);
|
||
|
|
s=gzread(ff,pch_vms,lvms);
|
||
|
|
if (s!=lvms) {
|
||
|
|
valid=FALSE;
|
||
|
|
sprintf(texterr,"Can't read from file %s addr=%ld size=%d\n",
|
||
|
|
name,l,lvms);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
unsigned long linter=0; // read there only for control
|
||
|
|
CPYMEM(linter,pch_vms+MAKELONG(pb_vms,linter,proccount,QV_SHORT),szl);
|
||
|
|
if (linter<=0) {
|
||
|
|
valid=FALSE;
|
||
|
|
sprintf(texterr,"Execution was exit with statistics error. \n");
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
// smallbuff - not enough memory in buffer,not all data accumulated
|
||
|
|
CPYMEM(smallbuff,pch_vms+MAKESHORT(pb_vms,smallbuff,rank),szsh);
|
||
|
|
if (smallbuff==1) {
|
||
|
|
sprintf(textwarning[valid_warning],
|
||
|
|
"Not all times of collective operations were accumulated\n");
|
||
|
|
valid_warning++;
|
||
|
|
}
|
||
|
|
CPYMEM(rank,pch_vms+MAKESHORT(pb_vms,rank,rank),szsh);
|
||
|
|
// global size of const information
|
||
|
|
size_t lvms_add=lvms+szl*rank+QV_CONST*2;
|
||
|
|
// size of VMS run
|
||
|
|
pch_vmssize=new unsigned char[szl*rank];
|
||
|
|
if (pch_vmssize==NULL) throw("Out of memory\n");
|
||
|
|
if (gzplus==1) memcpy(pch_vmssize,pbufuncompr+sizeof(sz)+lvms,szl*rank);
|
||
|
|
else {
|
||
|
|
l=gztell(ff);
|
||
|
|
s=gzread(ff,pch_vmssize,szl*rank);
|
||
|
|
if (s!=szl*rank) {
|
||
|
|
valid=FALSE;
|
||
|
|
sprintf(texterr,"Can't read from file %s addr=%ld size=%d\n",
|
||
|
|
name,l,szl*rank);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
CPYMEM(maxnlevel,pch_vms+MAKESHORT(pb_vms,maxnlev,rank),szsh);
|
||
|
|
CPYMEM(proccount,pch_vms+MAKELONG(pb_vms,proccount,proccount,QV_SHORT),szl);
|
||
|
|
pclfrag=new CTreeInter*[proccount];
|
||
|
|
if (pclfrag==NULL) throw("Out of memory\n");
|
||
|
|
unsigned long i;
|
||
|
|
for (i=0;i<proccount;i++) pclfrag[i]=NULL;
|
||
|
|
// allocate memory for pointer of synchronization times
|
||
|
|
pclsyn=new CSynchro*[proccount];
|
||
|
|
if (pclsyn==NULL) throw("Out of memory\n");
|
||
|
|
// proccount - number of processors, the main loop
|
||
|
|
for (i=0;i<proccount;i++) pclsyn[i]=NULL;
|
||
|
|
unsigned long lsynchro=0;
|
||
|
|
for (i=0;i<proccount;i++) {// main processor's loop
|
||
|
|
unsigned long qfrag=0;
|
||
|
|
short maxn=0;
|
||
|
|
// qfrag - number of intervals
|
||
|
|
CPYMEM(qfrag,pch_vms+MAKELONG(pb_vms,qfrag,proccount,QV_SHORT),szl);
|
||
|
|
// maxn - number of levels
|
||
|
|
CPYMEM(maxn,pch_vms+MAKESHORT(pb_vms,maxnlev,rank),szsh);
|
||
|
|
// linter - size of all intervals in bytes
|
||
|
|
CPYMEM(linter,pch_vms+MAKELONG(pb_vms,linter,proccount,QV_SHORT),szl); //all variables on other processors may be not equivalent
|
||
|
|
char *pbuffer=NULL;
|
||
|
|
CPYMEM(pbuffer,pch_vms+MAKEVOID(pb_vms,pbuffer,pbuffer,QV_SHORT,QV_LONG),szv);
|
||
|
|
// length of version, platform and processor name
|
||
|
|
short lvers=0;
|
||
|
|
CPYMEM(lvers,pch_vms+MAKESHORT(pb_vms,lvers,rank),szsh);
|
||
|
|
// different values on each processor
|
||
|
|
if (lvers<=0) {
|
||
|
|
valid=FALSE;
|
||
|
|
sprintf(texterr,"Incorrect version\n");
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
pvers=new char[lvers];
|
||
|
|
if (pvers==NULL) throw("Out of memory\n");
|
||
|
|
l=gztell(ff);
|
||
|
|
if (gzplus==1) {
|
||
|
|
memcpy(pvers,(char *)(pbufuncompr+sizeof(sz)+lvms+szl*rank),lvers);
|
||
|
|
} else {
|
||
|
|
// read from file platform, version number, processor name and time
|
||
|
|
s=gzread(ff,pvers,lvers);
|
||
|
|
if (s!=lvers) {
|
||
|
|
valid=FALSE;
|
||
|
|
sprintf(texterr,"Can't read from file %s addr=%ld size=%d\n",
|
||
|
|
name,l,lvers);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
pbuffer=pbuffer+lvms_add+lvers;
|
||
|
|
unsigned char * pinterinbuff;
|
||
|
|
if (gzplus==1) pinterinbuff=pbufuncompr+lvms_add+lvers;
|
||
|
|
else pinterinbuff=NULL;
|
||
|
|
// processor name
|
||
|
|
char * pprocname=pvers+strlen(pvers)+strlen(pvers+strlen(pvers)+1)+2;
|
||
|
|
double proct=0.;// processor time
|
||
|
|
CPYMEM(proct,pch_vms+MAKEDOUBLE(pb_vms,proctime,proctime,QV_SHORT,QV_LONG,QV_VOID),szd);
|
||
|
|
// create interval tree
|
||
|
|
pclfrag[i]=new CTreeInter(ff,linter,pbuffer,i,qfrag,maxn,
|
||
|
|
pprocname,proct,iIM,jIM,sore,pinterinbuff);
|
||
|
|
if (pclfrag[i]==NULL) throw("Out of memory\n");
|
||
|
|
valid=pclfrag[i]->Valid();
|
||
|
|
if (!valid) {
|
||
|
|
pclfrag[i]->TextErr(texterr);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
unsigned long lbuf=0;
|
||
|
|
// lbuf - size of buffer
|
||
|
|
CPYMEM(lbuf,pch_vms+MAKELONG(pb_vms,lbuf,proccount,QV_SHORT),szl);
|
||
|
|
// lsynchro - size of synchronyzation times in bytes
|
||
|
|
if (valid_synchro==FALSE) lsynchro=0; // out of memory for synchro operations
|
||
|
|
else CPYMEM(lsynchro,pch_vms+MAKELONG(pb_vms,lsynchro,proccount,QV_SHORT),szl);
|
||
|
|
// set it the first time
|
||
|
|
unsigned char *psynchroinbuff;
|
||
|
|
if (gzplus==1) {
|
||
|
|
psynchroinbuff=lbuf-lsynchro+pbufuncompr;
|
||
|
|
//psynchroinbuff=pinterinbuff+lbuf-lsynchro-linter-lvms_add-lvers;
|
||
|
|
} else {
|
||
|
|
psynchroinbuff=NULL;
|
||
|
|
if (z_off_t zo=gzseek(ff,lbuf-lsynchro-linter-lvms_add-lvers,SEEK_CUR)==-1) {
|
||
|
|
sprintf(texterr,"Can't read from file %s addr=%ld size=%ld\n",
|
||
|
|
name,l,lbuf-lsynchro-linter-lvms_add-lvers);
|
||
|
|
valid=FALSE;
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (lsynchro>0) {
|
||
|
|
l=gztell(ff);
|
||
|
|
// create array of synchronization times
|
||
|
|
try {
|
||
|
|
pclsyn[i]= new CSynchro(ff,lsynchro,psynchroinbuff);
|
||
|
|
if (pclsyn[i]==NULL) throw("Out of memory\n");
|
||
|
|
}
|
||
|
|
catch (bad_alloc e) {
|
||
|
|
valid_synchro=FALSE;
|
||
|
|
//lsynchro=0;
|
||
|
|
for (unsigned int j=0;j<=i;j++) {
|
||
|
|
if (pclsyn[j]!=NULL) {
|
||
|
|
pclsyn[j]->~CSynchro();
|
||
|
|
pclsyn[j]=NULL;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
sprintf(textwarning[valid_warning],"Out of memory for synchronization operations\n");
|
||
|
|
valid_warning++;
|
||
|
|
} // end catch
|
||
|
|
catch (char *str) {
|
||
|
|
valid_synchro=FALSE;
|
||
|
|
//lsynchro=0;
|
||
|
|
for (unsigned int j=0;j<=i;j++) {
|
||
|
|
if (pclsyn[j]!=NULL) {
|
||
|
|
pclsyn[j]->~CSynchro();
|
||
|
|
pclsyn[j]=NULL;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
sprintf(textwarning[valid_warning],"Out of memory for synchronization operations\n");
|
||
|
|
valid_warning++;
|
||
|
|
} // end catch
|
||
|
|
if (pclsyn[i]!=NULL) {
|
||
|
|
valid=pclsyn[i]->Valid();
|
||
|
|
if (!valid) {
|
||
|
|
pclsyn[i]->TextErr(texterr);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
} // end if
|
||
|
|
} else {
|
||
|
|
// synchronization times not accumulated
|
||
|
|
pclsyn[i]=0;
|
||
|
|
if (lsynchro >0 && gzplus==0) {
|
||
|
|
if (gzseek(ff,lsynchro,SEEK_CUR)!=0) {
|
||
|
|
valid=FALSE;
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (gzplus==1) {delete []pbufcompr; pbufcompr=NULL;}
|
||
|
|
if (i!=proccount-1) {
|
||
|
|
if (gzplus==1) {
|
||
|
|
for (int k=0;;k++) {
|
||
|
|
if (gzread(ff,&(lbufplusch[k]),1)!=1) {
|
||
|
|
valid=FALSE;
|
||
|
|
sprintf(texterr,"Can't read from file %s \n",name);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
if (lbufplusch[k]==0) break;
|
||
|
|
}
|
||
|
|
lbufcompr=atol(lbufplusch);
|
||
|
|
pbufcompr=new unsigned char[lbufcompr];
|
||
|
|
if (pbufcompr==NULL) throw("Out of memory\n");
|
||
|
|
s=gzread(ff,pbufcompr,lbufcompr);
|
||
|
|
if (s!=(int)lbufcompr) {
|
||
|
|
valid=FALSE;
|
||
|
|
sprintf(texterr,"Can't read from file %s l=%ld\n",name,lbufcompr);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
int err=uncompress(pbufuncompr,&luncomprread,pbufcompr,lbufcompr);
|
||
|
|
if (err!=Z_OK || luncomprread!=lbufuncompr) {
|
||
|
|
valid=FALSE;
|
||
|
|
sprintf(texterr,"Can't uncompress l=%ld\n",lbufcompr);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
s=gzread(ff,&sz,sizeof(sz));
|
||
|
|
if (s!=sizeof(sz)) {
|
||
|
|
valid=FALSE;
|
||
|
|
sprintf(texterr,"Can't read from file %s addr=%ld size=%d\n",
|
||
|
|
name,l,(int)sizeof(sz));
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
s=gzread(ff,pch_vms,lvms);
|
||
|
|
if (s!=lvms) {
|
||
|
|
valid=FALSE;
|
||
|
|
sprintf(texterr,"Can't read from file %s addr=%ld size=%d\n",
|
||
|
|
name,l,lvms);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
CPYMEM(rank,pch_vms+MAKESHORT(pb_vms,rank,rank),szsh);
|
||
|
|
if (gzplus==1) pch_vms=pbufuncompr+sizeof(sz);
|
||
|
|
else {
|
||
|
|
l=gztell(ff);
|
||
|
|
s=gzread(ff,pch_vmssize,szl*rank);
|
||
|
|
if (s!=szl*rank) {
|
||
|
|
valid=FALSE;
|
||
|
|
sprintf(texterr,"Can't read from file %s addr=%ld size=%d\n",
|
||
|
|
name,l,szl*rank);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
l=gztell(ff);
|
||
|
|
delete [] pvers; pvers=NULL;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (gzplus==1) {delete []pbufuncompr; pbufuncompr=NULL;}
|
||
|
|
pic=new CInter*[proccount];
|
||
|
|
if (pic==NULL) throw("Out of memory\n");
|
||
|
|
// add synchronization times to interval characteristics
|
||
|
|
if (lsynchro>0) {
|
||
|
|
unsigned long n=BeginTreeWalk();
|
||
|
|
while (n!=0) {
|
||
|
|
BOOL b=Synchro();
|
||
|
|
if (b==1) return;
|
||
|
|
n=TreeWalk();
|
||
|
|
}
|
||
|
|
for (i=0;i<proccount;i++) {
|
||
|
|
pclsyn[i]->~CSynchro();
|
||
|
|
}
|
||
|
|
}//lsynchro
|
||
|
|
// sum interval characteristics
|
||
|
|
for (i=0;i<proccount;i++){
|
||
|
|
pclfrag[i]->SumLevel();
|
||
|
|
pclsyn[i]=NULL;
|
||
|
|
}
|
||
|
|
// Idle, Load imbalance
|
||
|
|
unsigned long n=BeginTreeWalk();
|
||
|
|
while (n!=0) {
|
||
|
|
double max=0.0,maxi=0.0;
|
||
|
|
double time,time1;
|
||
|
|
// calculate maximal values
|
||
|
|
for (i=0;i<proccount;i++) {
|
||
|
|
if (pic[i]!=NULL) {
|
||
|
|
pic[i]->ReadTime(EXEC,time);
|
||
|
|
if (time>max) max=time;
|
||
|
|
pic[i]->ReadTime(CPU,time);
|
||
|
|
pic[i]->ReadTime(CPUUSR,time1);
|
||
|
|
if (time+time1>maxi) maxi=time+time1;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
// calculate maximal - current
|
||
|
|
for (i=0;i<proccount;i++) {
|
||
|
|
if (pic[i]!=NULL) {
|
||
|
|
double qproc;
|
||
|
|
pic[i]->ReadTime(PROC,qproc);
|
||
|
|
if (qproc!=n) {
|
||
|
|
// interval execute not on all processors
|
||
|
|
for (i=0;i<proccount;i++) {
|
||
|
|
if (pic[i]!=NULL) {
|
||
|
|
pic[i]->WriteTime(IDLE,0);
|
||
|
|
pic[i]->WriteTime(LOST,0);
|
||
|
|
pic[i]->WriteTime(IMB,0);
|
||
|
|
pic[i]->WriteTime(PROC,0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
} else {
|
||
|
|
pic[i]->ReadTime(EXEC,time);
|
||
|
|
if (max-time>0.0) {
|
||
|
|
pic[i]->AddTime(IDLE,max-time);
|
||
|
|
pic[i]->AddTime(LOST,max-time);
|
||
|
|
}
|
||
|
|
pic[i]->ReadTime(CPU,time);
|
||
|
|
pic[i]->ReadTime(CPUUSR,time1);
|
||
|
|
if (maxi-time-time1>0.0)
|
||
|
|
pic[i]->AddTime(IMB,maxi-time-time1);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
n=TreeWalk();
|
||
|
|
}
|
||
|
|
if (gzplus!=1) {
|
||
|
|
if (pch_vms!=NULL) {delete [] pch_vms;pch_vms=NULL;}
|
||
|
|
}
|
||
|
|
gzclose(ff);
|
||
|
|
}
|
||
|
|
//--------------------------------------------------
|
||
|
|
// deallocate memory for trees and syn times
|
||
|
|
CStatRead::~CStatRead(void)
|
||
|
|
{
|
||
|
|
if (pvers!=NULL) delete []pvers;
|
||
|
|
if (gzplus==1) {
|
||
|
|
if (pbufcompr!=NULL) delete []pbufcompr;
|
||
|
|
if (pbufuncompr!=NULL) delete []pbufuncompr;
|
||
|
|
} else {
|
||
|
|
if (pch_vms!=NULL) delete [] pch_vms;
|
||
|
|
}
|
||
|
|
if (pclfrag!=NULL) {
|
||
|
|
for (unsigned long i=0;i<proccount;i++) {
|
||
|
|
if (pclfrag[i]!=NULL) pclfrag[i]->~CTreeInter();
|
||
|
|
pclfrag[i]=NULL;
|
||
|
|
if (pic!=NULL) pic[i]=NULL;
|
||
|
|
if (pclsyn!=NULL) {
|
||
|
|
if (pclsyn[i]!=NULL) pclsyn[i]->~CSynchro();
|
||
|
|
pclsyn[i]=NULL;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
delete [] pclfrag;
|
||
|
|
}
|
||
|
|
// deallocate memory for data-member
|
||
|
|
if (pclsyn!=NULL) delete [] pclsyn;
|
||
|
|
if (pch_vmssize!=NULL) delete []pch_vmssize;
|
||
|
|
if (pic!=NULL) delete [] pic;
|
||
|
|
}
|
||
|
|
//--------------------------------------------------
|
||
|
|
// begin tree-walk
|
||
|
|
unsigned long CStatRead::BeginTreeWalk(void)
|
||
|
|
// return number of intervals
|
||
|
|
{
|
||
|
|
unsigned long n=0;
|
||
|
|
for (unsigned long i=0;i<proccount;i++) {
|
||
|
|
pclfrag[i]->BeginInter();
|
||
|
|
pic[i]=NULL;
|
||
|
|
}
|
||
|
|
ident *id;
|
||
|
|
for(curnproc=0;curnproc<proccount;curnproc++) {
|
||
|
|
pclfrag[curnproc]->NextInter(&id);
|
||
|
|
if (id!=NULL) {
|
||
|
|
for (unsigned long j=0;j<proccount;j++) {
|
||
|
|
pic[j]=pclfrag[j]->FindInter(id);
|
||
|
|
if (pic[j]!=NULL) n++;
|
||
|
|
}
|
||
|
|
return(n);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return(n);
|
||
|
|
}
|
||
|
|
//------------------------------------------------
|
||
|
|
// continue tree-walk
|
||
|
|
unsigned long CStatRead::TreeWalk(void)
|
||
|
|
// return number of intervals
|
||
|
|
{
|
||
|
|
unsigned long n=0;
|
||
|
|
ident *id;
|
||
|
|
pclfrag[curnproc]->NextInter(&id);
|
||
|
|
if (id!=NULL) {
|
||
|
|
for (unsigned long j=0;j<proccount;j++) {
|
||
|
|
pic[j]=pclfrag[j]->FindInter(id);
|
||
|
|
if (pic[j]!=NULL) n++;
|
||
|
|
}
|
||
|
|
if (n!=0)return(n);
|
||
|
|
}
|
||
|
|
for(unsigned long i=curnproc+1;i<proccount;i++) {
|
||
|
|
pclfrag[i]->NextInter(&id);
|
||
|
|
if (id!=NULL) {
|
||
|
|
curnproc=i;
|
||
|
|
for (unsigned long j=0;j<proccount;j++) {
|
||
|
|
pic[j]=pclfrag[j]->FindInter(id);
|
||
|
|
if (pic[j]!=NULL) n++;
|
||
|
|
}
|
||
|
|
return(n);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return(n);
|
||
|
|
}
|
||
|
|
//------------------------------------------------
|
||
|
|
// calculate synchronization times, variation times and overlap
|
||
|
|
BOOL CStatRead::Synchro(void)
|
||
|
|
// return 0 - OK
|
||
|
|
{
|
||
|
|
unsigned long nint=0;
|
||
|
|
for (unsigned long k=0;k<proccount;k++) {
|
||
|
|
if (pic[k]!=NULL) {
|
||
|
|
// nint - number of current interval
|
||
|
|
nint=pic[k]->ninter;
|
||
|
|
BOOL b=pclsyn[k]->Count(nint,smallbuff);
|
||
|
|
if (b!=0) {
|
||
|
|
pclsyn[k]->TextErr(texterr);
|
||
|
|
valid=FALSE;
|
||
|
|
return(1);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (nint==0) return(0);
|
||
|
|
for (short i=1;i<=QCOLLECT+QCOLLECT;i++) {
|
||
|
|
if ((i&3)!=0 && (i&3)!=2) { //4 type not used
|
||
|
|
typegrp t1;
|
||
|
|
typecom t2;
|
||
|
|
if (i<=QCOLLECT) {
|
||
|
|
t1=SYN;
|
||
|
|
t2=(typecom)((i)>>2);
|
||
|
|
}else{
|
||
|
|
t1=VAR;
|
||
|
|
t2=(typecom)((i-QCOLLECT)>>2);
|
||
|
|
}
|
||
|
|
int min=INT_MAX;
|
||
|
|
unsigned long j;
|
||
|
|
for (j=0;j<proccount;j++) {
|
||
|
|
if (pic[j]!=NULL) {
|
||
|
|
// n - number of times in the interval
|
||
|
|
int n=pclsyn[j]->GetCount((typecollect)(i));
|
||
|
|
if (min!=INT_MAX && n!=min && smallbuff==0) {
|
||
|
|
valid=FALSE;
|
||
|
|
sprintf(texterr,
|
||
|
|
"Number of synhro or variation times not equivalent on other processors %ld %ld numbers %d %d %\n",j+1,j,n,min);
|
||
|
|
return(1);
|
||
|
|
}
|
||
|
|
if (min>n) min=n;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (min!=0) {
|
||
|
|
// times is accumulated
|
||
|
|
for ( int k=0; k<min; k++) {
|
||
|
|
double max=0.0;
|
||
|
|
// calculate maximal value
|
||
|
|
for (j=0;j<proccount;j++) {
|
||
|
|
if (pic[j]!=NULL) {
|
||
|
|
double time=pclsyn[j]->Find((typecollect)i);
|
||
|
|
if (time-max>0.0) max=time;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
double maxs=0.0;
|
||
|
|
if (i<QCOLLECT && (i&3)==3) {
|
||
|
|
// overlap for wait_operation
|
||
|
|
for (j=0;j<proccount;j++) {
|
||
|
|
if (pic[j]!=NULL) {
|
||
|
|
double time=pclsyn[j]->FindNearest
|
||
|
|
((typecollect)(i+QCOLLECT-1)); //Start_operation
|
||
|
|
if (time==0.0 && smallbuff==0) {
|
||
|
|
valid=FALSE;
|
||
|
|
sprintf(texterr,"Number of call operations != number of wait operations\n");
|
||
|
|
return(1);
|
||
|
|
}
|
||
|
|
if (time-maxs>0.0) maxs=time;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
for (j=0;j<proccount;j++) {
|
||
|
|
if (pic[j]!=NULL) {
|
||
|
|
double time=pclsyn[j]->GetCurr();
|
||
|
|
// write overlap
|
||
|
|
if (maxs>0.0 && time-maxs>0.0 ) {
|
||
|
|
pic[j]->AddTime(OVERLAP,t2,time-maxs);
|
||
|
|
}
|
||
|
|
// write syn and variation times
|
||
|
|
if (max-time>0.0) {
|
||
|
|
pic[j]->AddTime(t1,t2,max-time);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return(0);
|
||
|
|
}
|
||
|
|
//------------------------------------------------
|
||
|
|
// return result of constructor execution
|
||
|
|
BOOL CStatRead::Valid(int *warn)
|
||
|
|
{
|
||
|
|
*warn=valid_warning;
|
||
|
|
return(valid);
|
||
|
|
}
|
||
|
|
//---------------------------------------------------
|
||
|
|
// error message
|
||
|
|
void CStatRead::TextErr(char *t)
|
||
|
|
{
|
||
|
|
strcpy(t,texterr);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
// warning message
|
||
|
|
//---------------------------------------------------
|
||
|
|
// return number of processors
|
||
|
|
unsigned long CStatRead::QProc(void)
|
||
|
|
{
|
||
|
|
return(proccount);
|
||
|
|
}
|
||
|
|
//--------------------------------------------
|
||
|
|
// size of VMS
|
||
|
|
void CStatRead::VMSSize(char *str)
|
||
|
|
{
|
||
|
|
str[0]='\0';
|
||
|
|
char n[11];
|
||
|
|
long l=0;
|
||
|
|
for (int i=0;i<rank;i++) {
|
||
|
|
CPYMEM(l,pch_vmssize+i*szl,szl);
|
||
|
|
sprintf(n,"%ld",l);
|
||
|
|
if(i==rank-1) strcat(str,n);
|
||
|
|
else {
|
||
|
|
strcat(str,n);
|
||
|
|
strcat(str,"*");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
//-----------------------------------------------
|
||
|
|
// warning message
|
||
|
|
void CStatRead::WasErrAccum(char *str)
|
||
|
|
{
|
||
|
|
if (valid_warning==0) str[0]='\0';
|
||
|
|
else {
|
||
|
|
strcpy(str,textwarning[valid_warning-1]);
|
||
|
|
valid_warning--;
|
||
|
|
}
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
//---------------------------------------------
|
||
|
|
// return number of calls of collective operations
|
||
|
|
long CStatRead::ReadCall(typecom t)
|
||
|
|
{
|
||
|
|
double val=0.0;
|
||
|
|
long calll=0;
|
||
|
|
for (unsigned long i=0;i<proccount;i++) {
|
||
|
|
if (pic[i]!=NULL) {
|
||
|
|
double v;
|
||
|
|
pic[i]->ReadTime(CALL,t,v);
|
||
|
|
val=val+v;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
calll=(long)(val/1);
|
||
|
|
if (val-calll!=0.0) calll++;
|
||
|
|
return(calll);
|
||
|
|
}
|
||
|
|
//---------------------------------------------
|
||
|
|
// identifier information of interval
|
||
|
|
// set number of current characteristics =0
|
||
|
|
// return number of level
|
||
|
|
short CStatRead::ReadTitle(char *str)
|
||
|
|
{
|
||
|
|
short nlev=0;
|
||
|
|
ident *id=NULL;
|
||
|
|
// nenter = number of enters / weight
|
||
|
|
double nenter=0.0;
|
||
|
|
for (unsigned long i=0;i<proccount;i++) {
|
||
|
|
if (pic[i]!=NULL) {
|
||
|
|
pic[i]->ReadIdent(&id);
|
||
|
|
nlev=id->nlev;
|
||
|
|
nenter=nenter+id->nenter;
|
||
|
|
|
||
|
|
}
|
||
|
|
}
|
||
|
|
long nent=(long)(nenter/1);
|
||
|
|
if (nenter-nent!=0.0) nent++;
|
||
|
|
char type[10];
|
||
|
|
switch((int)(id->t)) {
|
||
|
|
case REDUC:strcpy(type,"REDUC");
|
||
|
|
break;
|
||
|
|
case SREDUC:strcpy(type,"SREDUC");
|
||
|
|
break;
|
||
|
|
case WREDUC:strcpy(type,"WREDUC");
|
||
|
|
break;
|
||
|
|
case SHAD:strcpy(type,"SHAD");
|
||
|
|
break;
|
||
|
|
case SSHAD:strcpy(type,"SSHAD");
|
||
|
|
break;
|
||
|
|
case WSHAD:strcpy(type,"WSHAD");
|
||
|
|
break;
|
||
|
|
case RACC:strcpy(type,"RACC");
|
||
|
|
break;
|
||
|
|
case SRACC:strcpy(type,"SRACC");
|
||
|
|
break;
|
||
|
|
case WRACC:strcpy(type,"WRACC");
|
||
|
|
break;
|
||
|
|
case REDISTR:strcpy(type,"REDISTR");
|
||
|
|
break;
|
||
|
|
case SREDISTR:strcpy(type,"SREDISTR");
|
||
|
|
break;
|
||
|
|
case WREDISTR:strcpy(type,"WREDISTR");
|
||
|
|
break;
|
||
|
|
case PREFIX:strcpy(type,"PREFIX");
|
||
|
|
break;
|
||
|
|
case SEQ:strcpy(type,"SEQ");
|
||
|
|
break;
|
||
|
|
case PAR: strcpy(type,"PAR");
|
||
|
|
break;
|
||
|
|
case USER: strcpy(type,"USER");
|
||
|
|
break;
|
||
|
|
default: sprintf(str,"Statread ReadTitle:Incorrect type\n");
|
||
|
|
return(0);
|
||
|
|
}
|
||
|
|
if (id->nlev==0) type[0]='\0';
|
||
|
|
if (id->pname==NULL) {
|
||
|
|
if (id->expr==Fic_index)
|
||
|
|
sprintf(str,"INTERVAL ( NLINE=%ld ) LEVEL=%d %s EXE_COUNT=%ld\n",
|
||
|
|
id->nline,id->nlev,type,nent);
|
||
|
|
else sprintf(str,"INTERVAL ( NLINE=%ld ) LEVEL=%d %s EXE_COUNT=%ld EXPR=%ld\n",
|
||
|
|
id->nline,id->nlev,type,nent,id->expr);
|
||
|
|
}else {
|
||
|
|
if (id->expr==Fic_index)
|
||
|
|
sprintf(str,"INTERVAL ( NLINE=%ld SOURCE=%s ) LEVEL=%d %s EXE_COUNT=%ld\n",
|
||
|
|
id->nline,id->pname,id->nlev,type,nent);
|
||
|
|
else sprintf(str,"INTERVAL ( NLINE=%ld SOURCE=%s ) LEVEL=%d %s EXE_COUNT=%ld EXPR=%ld\n",
|
||
|
|
id->nline,id->pname,id->nlev,type,nent,id->expr);
|
||
|
|
}
|
||
|
|
curntime=0;
|
||
|
|
return(nlev);
|
||
|
|
}
|
||
|
|
//--------------------------------------------------------
|
||
|
|
// return version number on accumulation
|
||
|
|
char *CStatRead::ReadVers(void)
|
||
|
|
{
|
||
|
|
return(pvers);
|
||
|
|
}
|
||
|
|
//--------------------------------------------------------
|
||
|
|
// return platform information on accumulation
|
||
|
|
char *CStatRead::ReadPlatform(void)
|
||
|
|
{
|
||
|
|
return(pvers+strlen(pvers)+1);
|
||
|
|
}
|
||
|
|
//-----------------------------------------------------------
|
||
|
|
//name and time of processor
|
||
|
|
void CStatRead::NameTimeProc(unsigned long n,char **name,double *time)
|
||
|
|
{
|
||
|
|
pclfrag[n]->ReadProcName(name);
|
||
|
|
pclfrag[n]->ReadProcTime(*time);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
//-------------------------------------------------------
|
||
|
|
// read current time characteristics
|
||
|
|
// use after ReadTitle()
|
||
|
|
BOOL CStatRead::ReadProc(typeprint t,unsigned long *pnumb,int qnumb,short fmt,
|
||
|
|
double sum,char *str)
|
||
|
|
//t - type of information of characteristics for each processor,
|
||
|
|
//pnumb - pointer to array of processor numbers, for which characteristics are to be output,
|
||
|
|
//qnumb - number of elements of processor number array,
|
||
|
|
//sum - total characteristic value for each processor,
|
||
|
|
//str - string where characteristic name and time values are written.
|
||
|
|
{
|
||
|
|
int q,prec,lstr;
|
||
|
|
if (t==PRGEN) q=ITER;else q=RED;
|
||
|
|
//char ss[1024];
|
||
|
|
curntime++;
|
||
|
|
if (sum==0.0) {
|
||
|
|
str[0]='\0';
|
||
|
|
if (curntime>q) curntime=0;
|
||
|
|
return(TRUE);
|
||
|
|
}
|
||
|
|
if (t==PRGEN) {
|
||
|
|
sprintf(str,"%s",nameGen[curntime-1]);
|
||
|
|
//sprintf(ss,"%s",nameGen[curntime-1]);
|
||
|
|
} else {
|
||
|
|
// nameCom for VAR,OVERLAP,SYN,COM,RCOM
|
||
|
|
sprintf(str,"%s",nameCom[curntime-1]);
|
||
|
|
strcat(str," ");
|
||
|
|
}
|
||
|
|
lstr=strlen(nameGen[curntime-1]);
|
||
|
|
// list of processor numbers - pnumb
|
||
|
|
// pr=TRUE - number is in list
|
||
|
|
for (unsigned long i=0;i<proccount;i++) {
|
||
|
|
BOOL pr=FALSE;
|
||
|
|
if (pic[i]!=NULL) {
|
||
|
|
if (pnumb!=NULL) {
|
||
|
|
for (int j=0;j<qnumb;j++) {
|
||
|
|
if (i+1>=pnumb[j] && i+1<=pnumb[j+1]) pr=TRUE;
|
||
|
|
}
|
||
|
|
} else pr=TRUE;
|
||
|
|
if (pr==TRUE) {
|
||
|
|
// read time characteristic
|
||
|
|
double time;
|
||
|
|
switch (t) {
|
||
|
|
case PRGEN:
|
||
|
|
pic[i]->ReadTime((typetime)(curntime-1),time);
|
||
|
|
break;
|
||
|
|
case PRCOM:
|
||
|
|
pic[i]->ReadTime(COM,(typecom)(curntime-1),time);
|
||
|
|
break;
|
||
|
|
case PRRCOM:
|
||
|
|
pic[i]->ReadTime(RCOM,(typecom)(curntime-1),time);
|
||
|
|
break;
|
||
|
|
case PRSYN:
|
||
|
|
pic[i]->ReadTime(SYN,(typecom)(curntime-1),time);
|
||
|
|
break;
|
||
|
|
case PRVAR:
|
||
|
|
pic[i]->ReadTime(VAR,(typecom)(curntime-1),time);
|
||
|
|
break;
|
||
|
|
case PROVER:
|
||
|
|
pic[i]->ReadTime(OVERLAP,(typecom)(curntime-1),time);
|
||
|
|
break;
|
||
|
|
default:sprintf(str,"Statread ReadProc:Incorrect type=%d\n",t);
|
||
|
|
return(FALSE);
|
||
|
|
}
|
||
|
|
if ((t==PRGEN) && ((typetime)(curntime-1)==PROC ||
|
||
|
|
(typetime)(curntime-1)==ITER)) prec=0;else prec=PREC;
|
||
|
|
sprintf((str+lstr),"%*.*lf ",fmt,prec,time);
|
||
|
|
//sprintf(ss+lstr,"%*.*lf",fmt,prec,time);
|
||
|
|
lstr=strlen(str);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (curntime>q) curntime=0;
|
||
|
|
return(TRUE);
|
||
|
|
}
|
||
|
|
//--------------------------------------------------------
|
||
|
|
// calculate min,max,sum time characteristics
|
||
|
|
void CStatRead::MinMaxSum(typeprint t,double *min,unsigned long *nprocmin,
|
||
|
|
double*max,unsigned long *nprocmax,
|
||
|
|
double *sum)
|
||
|
|
// t - characteristic type,
|
||
|
|
//min - pointer to array of minimal characteristic values,
|
||
|
|
//nprocmin,- pointer to processor number array, corresponding to minimal values,
|
||
|
|
//max, - pointer to array of maximal characteristic values,
|
||
|
|
//nprocmax, - pointer to processor number array, corresponding to maximal values,
|
||
|
|
//sum - pointer to array of total characteristic values.
|
||
|
|
{
|
||
|
|
int q;
|
||
|
|
if (t==PRGEN) q=ITER;else q=RED;
|
||
|
|
if (t==PRCALLS || t==PRLOST) q=StatGrpCount-1;
|
||
|
|
int k;
|
||
|
|
for (k=0;k<=q;k++) {
|
||
|
|
min[k]=DBL_MAX;
|
||
|
|
max[k]=0.0;
|
||
|
|
sum[k]=0.0;
|
||
|
|
nprocmin[k]=0;
|
||
|
|
nprocmax[k]=0;
|
||
|
|
}
|
||
|
|
for (unsigned long i=0;i<proccount;i++) {
|
||
|
|
if (pic[i]!=NULL) {
|
||
|
|
for (k=0;k<=q;k++) {
|
||
|
|
double time;
|
||
|
|
// read time characteristic
|
||
|
|
switch (t) {
|
||
|
|
case PRGEN:
|
||
|
|
pic[i]->ReadTime((typetime)k,time);
|
||
|
|
break;
|
||
|
|
case PRCOM:
|
||
|
|
pic[i]->ReadTime(COM,(typecom)k,time);
|
||
|
|
break;
|
||
|
|
case PRRCOM:
|
||
|
|
pic[i]->ReadTime(RCOM,(typecom)k,time);
|
||
|
|
break;
|
||
|
|
case PRSYN:
|
||
|
|
pic[i]->ReadTime(SYN,(typecom)k,time);
|
||
|
|
break;
|
||
|
|
case PRVAR:
|
||
|
|
pic[i]->ReadTime(VAR,(typecom)k,time);
|
||
|
|
break;
|
||
|
|
case PRCALLS:
|
||
|
|
pic[i]->ReadTime(CALLSMT,k,time);
|
||
|
|
break;
|
||
|
|
case PRLOST:
|
||
|
|
pic[i]->ReadTime(LOSTMT,k,time);
|
||
|
|
break;
|
||
|
|
case PROVER:
|
||
|
|
pic[i]->ReadTime(OVERLAP,(typecom)k,time);
|
||
|
|
break;
|
||
|
|
default:
|
||
|
|
valid=FALSE;
|
||
|
|
printf("CStatRead::MinMaxSum Unknown typeprint=%d\n",t);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
// minimal value
|
||
|
|
if (min[k]>time) {
|
||
|
|
min[k]=time;
|
||
|
|
nprocmin[k]=i+1;
|
||
|
|
}
|
||
|
|
//maximal value
|
||
|
|
if (max[k]<=time) {
|
||
|
|
max[k]=time;
|
||
|
|
nprocmax[k]=i+1;
|
||
|
|
}
|
||
|
|
// sum value
|
||
|
|
sum[k]=sum[k]+time;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
}
|
||
|
|
//-------------------------------------------------------------------------
|
||
|
|
// read grp characteristics
|
||
|
|
void CStatRead::GrpTimes(double *arrprod,double *arrlost,double *arrcalls,int nproc)
|
||
|
|
{
|
||
|
|
int q=StatGrpCount-1;
|
||
|
|
int k;
|
||
|
|
for (k=0;k<=q;k++) {
|
||
|
|
arrprod[k]=0.0;
|
||
|
|
arrlost[k]=0.0;
|
||
|
|
arrcalls[k]=0.0;
|
||
|
|
}
|
||
|
|
unsigned long i=nproc-1;
|
||
|
|
//double arr[StatGrpCount];
|
||
|
|
if (pic[i]!=NULL) {
|
||
|
|
for (k=0;k<=q;k++) {
|
||
|
|
// read time characteristic
|
||
|
|
pic[i]->ReadTime(CALLSMT,k,arrcalls[k]);
|
||
|
|
//arrcalls[k]=(int)arr[k];
|
||
|
|
pic[i]->ReadTime(LOSTMT,k,arrlost[k]);
|
||
|
|
pic[i]->ReadTime(PRODMT,k,arrprod[k]);
|
||
|
|
} // end for
|
||
|
|
}// end if
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|