#include "bool.h" #define _STATFILE_ #include "statread.h" #include #include #include #include #include #include "dvmvers.h" #include "statprintf.h" using namespace std; int main (int argv,char **argc) { //sfn outfn -l d>=0 -c d=-1..9 -n d-d>=0 -m text if (argv<3) { printf("Performance analyser parameters: [-l ]\n"); printf(" [-n ] [-c ] [-m ]\n"); printf(" - statistics file name \n"); printf(" - output file name \n"); printf(" - interval level number \n"); printf(" - list of processor numbers, 0 - without processor characteristics \n"); printf(" - -1..9 - compression level of output file,-1-no compression \n"); printf(" - ]|j[:]\n"); printf("i|j - sum of row or column elements of matrix of interval characteristics \n"); printf(" - name of group, set to output row or column per elements. Groups names :\n"); printf(" UserGrp|MsgPasGrp|StartRedGrp|WaitRedGrp|RedGrp|StartShdGrp|\n"); printf(" WaitShdGrp|ShdGrp|DistrGrp|ReDistrGrp|MapPLGrp|DoPLGrp|\n"); printf(" ProgBlockGrp|IOGrp|RemAccessGrp|UserDebGrp|StatistGrp|SystemGrp\n"); return 0; } if (argv>10) { printf("Incorrect number of parameters\n"); exit(1); } BOOL proc=TRUE,comp=TRUE,gen=TRUE; char compr[3],mode[5]; strcpy(mode,"wb0"); int nlevel=9999,qnumb=1; unsigned long *pnumb=NULL; int iIM=0,jIM=0,nparin=0,nparout=0; short sore=0; size_t st=0; //new_handler set_new_handler(NULL); nparin=1;// statistics file nparout=2;// output file for (int npar=3; npar9) { printf("Incorrect compression level of file %s \n",argc[3]); exit(1); } if (cc==-1) { strcpy(compr,"0"); } else { int comprd; if (cc==0) strcpy(compr,"-1"); else { comprd=cc; sprintf(compr,"%d",comprd); } } strcpy(mode,"wb"); strcat(mode,compr); break; case 'n': // list of processor numbers npar ++; qnumb=1; i=0; while (argc[npar][i]!=0) { if (argc[npar][i]==',') qnumb++; i++; } pnumb=new unsigned long(qnumb*2); if (pnumb==NULL) throw("Out of memory\n"); char * token; token=strtok(argc[npar],",/n"); i=0; while (token!=NULL) { char *tdiap=strchr(token,'-'); if (tdiap==NULL) { pnumb[i]=atoi(token); pnumb[i+1]=pnumb[i]; }else { pnumb[i+1]=atoi(tdiap+1); tdiap[0]='\0'; pnumb[i]=atoi(token); } token=strtok(NULL,",\n"); i=i+2; } // end while // -n 0 - not print processor characteristics if (qnumb==1 && pnumb[0]==0 && pnumb[1]==0) proc=FALSE; break; case 'm': // interval matrix npar++; let=argc[npar][0]; if (let!='i' && let!='j') { printf("Incorrect %d parameter %c, must be i/j\n",npar,let); exit(1); } sore=1; if (let=='i') iIM=1;else jIM=1; st=strlen(argc[npar]); if (st==1) break; sore=0; // element if (argc[npar][1]!=':') { printf("Incorrect %d parameter %s, must be i=/j=\n",npar,argc[npar]); exit(1); } strncpy(arrs,&(argc[npar][2]),st-2); iIM=0;jIM=0; for (i=1;i<=StatGrpCount;i++) { if (strcmp(nameGenMT[i-1],arrs)==0) { if (let=='i') iIM=i; else jIM=i; break; } } // end for if (iIM==0 && jIM==0) { printf("Incorrect group name %s \n",argc[npar]); exit(1); } break; default: printf("Incorrect parameter %s\n",argc[npar]); exit(1); break; } // end switch } // end for key parameters // read time characteristics and syn times try { CStatRead stat(argc[nparin],iIM,jIM,sore); int warn; if (stat.Valid(&warn)!=TRUE) { char t[80]; stat.TextErr(t); printf("%s",t); exit(1); } unsigned long qproc=stat.QProc(); if (qproc==0) exit(1); // string for processor characteristics - max // printf for compressed and not compressed out file CStatPrintf statpr(argc[nparout],1024,mode); if (statpr.Valid()!=TRUE) { char t[80]; statpr.TextErr(t); printf("%s",t); exit (1); } double min[ITER+1]; double max[ITER+1]; double sum[ITER+1]; // communication double minc[RED+1]; double maxc[RED+1]; double sumc[RED+1]; // real communication double minrc[RED+1]; double maxrc[RED+1]; double sumrc[RED+1]; // synchronization double mins[RED+1]; double maxs[RED+1]; double sums[RED+1]; // variation double minv[RED+1]; double maxv[RED+1]; double sumv[RED+1]; // overlap double minov[RED+1]; double maxov[RED+1]; double sumov[RED+1]; // number of processor unsigned long nprocmin[ITER+1],nprocmax[ITER+1]; unsigned long nprocminc[RED+1],nprocmaxc[RED+1]; unsigned long nprocminrc[RED+1],nprocmaxrc[RED+1]; unsigned long nprocmins[RED+1],nprocmaxs[RED+1]; unsigned long nprocminv[RED+1],nprocmaxv[RED+1]; unsigned long nprocminov[RED+1],nprocmaxov[RED+1]; char *namecomp[3]={"Tmin","Tmax","Tmid"}; int ltxt=strlen(nameCom[0])+1; char p_heading[80]; int lenstr=0; char *poutstr; int i; stat.VMSSize(p_heading); statpr.StatPrintf("Processor system=%s\n",p_heading); char * pvers=stat.ReadVers(); char *pplat=stat.ReadPlatform(); statpr.StatPrintf("Statistics has been accumulated on DVM-system version %s, platform %s\n",pvers,pplat); statpr.StatPrintf("Analyzer is executing on DVM-system version %s, platform %s\n",VERS,PLATFORM); for (i=0;i0.0)statpr.StatPrintf("%s %*.*lf\n","Overlap ",dig_time,PREC, sum[SUMOVERLAP]); long ncall=0; int dig_stat=DIGSTAT; for (i=0;i<=RED;i++) ncall=ncall+stat.ReadCall(typecom(i)); if (ncall>0) { statpr.StatPrintf("%*c",ltxt,' '); char tval[20]; sprintf(tval,"%ld",ncall); int l=strlen(tval); if (l>DIGSTAT)dig_stat=l; statpr.StatPrintf("%*s",dig_stat," Nop "); for (int j=SUMCOM;j<=SUMOVERLAP;j++) { if (sum[j]>0.0) statpr.StatPrintf("%*s ",dig_time,nameOper[j-SUMCOM]); } // end for statpr.StatPrintf("\n"); }// end if for (i=0;i<=RED;i++) { ncall=stat.ReadCall(typecom(i)); if (ncall>0) { statpr.StatPrintf("%s",nameCom[i]); statpr.StatPrintf("%*d ",dig_stat,ncall); if (sum[SUMCOM]>0.0)statpr.StatPrintf("%*.*lf ",dig_time,PREC,sumc[i]); if (sum[SUMRCOM]>0.0)statpr.StatPrintf("%*.*lf ",dig_time,PREC,sumrc[i]); if (sum[SUMSYN]>0.0)statpr.StatPrintf("%*.*lf ",dig_time,PREC,sums[i]); if (sum[SUMVAR]>0.0)statpr.StatPrintf("%*.*lf ",dig_time,PREC,sumv[i]); if (sum[SUMOVERLAP]>0.0)statpr.StatPrintf("%*.*lf ",dig_time,PREC,sumov[i]); statpr.StatPrintf("\n"); } // end if ncall>0 } // end for if (iIM>0 || jIM>0) { // statistics matrix for (unsigned long np=1;np<=qproc;np++) { double prod[StatGrpCount],lost[StatGrpCount],sumprod=0.0,sumlost=0.0; double calls[StatGrpCount],sumcalls=0.0; stat.GrpTimes(prod,lost,calls,np); sprintf(p_heading,"%ld",np); int ll=strlen(nameGen[0])-strlen(p_heading)-strlen(" Nproc=")-2; statpr.StatPrintf("%s %d %*c %*s %*s %*s\n"," Nproc=",np,ll,' ', dig_time,"CALL COUNT",dig_time,"PRODUCT TIME",dig_time, "LOST TIME"); for (i=0;i0 || prod[i]!=0.0 || lost[i]!=0.0 ) { statpr.StatPrintf("%s %*.*lf %*.*lf %*.*lf \n",nameGenMT[i], dig_time,PREC,calls[i], dig_time,PREC,prod[i], dig_time,PREC,lost[i]); //} } // end for statpr.StatPrintf("%s %*.*lf %*.*lf %*.*lf \n"," Total: ", dig_time,PREC,sumcalls,dig_time,PREC,sumprod,dig_time,PREC,sumlost); } // end for qproc } // end statistics matrix } // end main characteristics if (comp==TRUE) { // comparative characteristics statpr.StatPrintf("--- The comparative characteristics --- \n"); poutstr[0]=0; statpr.StatPrintf ("%*c",strlen(nameGen[0])+1,' '); int i; for (i=0;i<3;i++) { if (i==2)statpr.StatPrintf("%*s\n",dig_time,namecomp[i]); else statpr.StatPrintf("%*s %*s",dig_time,namecomp[i], DIGSTAT,"N proc"); } // general characteristics for (i=0;i<=ITER;i++) { if (sum[i]>0.0) { int prec; double tt=sum[i]/n; if ((typetime)(i)==PROC || (typetime)(i)==ITER) prec=0;else prec=PREC; statpr.StatPrintf("%s %*.*lf %*d %*.*lf %*d %*.*lf \n", nameGen[i],dig_time,prec, min[i],DIGSTAT,nprocmin[i],dig_time,prec,max[i],DIGSTAT, nprocmax[i],dig_time,prec,tt); } } long ncall=0; // characteristics of collective operations for (i=0;i<=RED;i++) ncall=ncall+stat.ReadCall(typecom(i)); if (ncall>0) { statpr.StatPrintf("%*c",ltxt-2,' '); for (int j=SUMCOM;j<=SUMOVERLAP;j++) { if (sum[j]>0.0) statpr.StatPrintf("%*s ",dig_time+DIGSTAT,nameOper[j-SUMCOM]); } statpr.StatPrintf("\n"); for (i=0;i<=RED;i++) { for (int k=0;k<3;k++) { if (sumc[i]==0.0 && sumrc[i]==0.0 && sums[i]==0.0 && sumv[i]==0.0 &&sumov[i]==0.0) break; double t[CALL];//com,realcom,syn,var,overlap unsigned long pnp[CALL]; // 0 - min; 1 - max; 2 - sum switch (k) { case 0: t[0]=minc[i];t[1]=minrc[i]; t[2]=mins[i];t[3]=minv[i]; t[4]=minov[i]; pnp[0]=nprocminc[i]; pnp[1]=nprocminrc[i]; pnp[2]=nprocmins[i]; pnp[3]=nprocminv[i]; pnp[4]=nprocminov[i]; break; case 1: t[0]=maxc[i];t[1]=maxrc[i]; t[2]=maxs[i];t[3]=maxv[i]; t[4]=maxov[i]; pnp[0]=nprocmaxc[i]; pnp[1]=nprocmaxrc[i]; pnp[2]=nprocmaxs[i]; pnp[3]=nprocmaxv[i]; pnp[4]=nprocmaxov[i]; break; case 2: t[0]=sumc[i]/n;t[1]=sumrc[i]/n; t[2]=sums[i]/n;t[3]=sumv[i]/n; t[4]=sumov[i]/n; pnp[0]=0; pnp[1]=0; pnp[2]=0; pnp[3]=0; pnp[4]=0; break; default: statpr.StatPrintf("Unknown type=%d\n",k); exit(1); }// end switch statpr.StatPrintf("%s%s",nameCom[i],namecomp[k]); for (int j=SUMCOM;j<=SUMOVERLAP;j++) { if (sum[j]>0.0) { if (pnp[0]==0) { statpr.StatPrintf("%*.*lf ", dig_time,PREC,t[j-SUMCOM]); statpr.StatPrintf("%*c",DIGSTAT+1,' '); } else statpr.StatPrintf("%*.*lf %*d ", dig_time,PREC,t[j-SUMCOM], DIGSTAT,pnp[j-SUMCOM]); } } statpr.StatPrintf("\n"); } //end for }//end for } } if (proc==TRUE) { // execution characteristics statpr.StatPrintf("--- The execution characteristics --- \n"); statpr.StatPrintf("%s"," "); unsigned long i; // print numbers of processor for (i=0;i=pnumb[j] && i+1<=pnumb[j+1]) pr=TRUE; } } if (pr==TRUE) { statpr.StatPrintf("%*d ",dig_time,i+1); // probel } } statpr.StatPrintf("\n"); // general characteristics for (i=0;i<=ITER;i++) { stat.ReadProc(PRGEN,pnumb,qnumb,dig_time,sum[i],poutstr); if (poutstr[0]!='\0')statpr.StatPrintf("%s\n",poutstr); //statpr.StatPrintf("\n"); } //statpr.StatPrintf("\n"); // characteristics of collective operatios long ncall=0; for (int k=0;k<=RED;k++) ncall=ncall+stat.ReadCall(typecom(k)); for (int j=SUMCOM;j<=SUMOVERLAP;j++) { double *ps; switch (j) { case SUMCOM: ps=sumc;break; case SUMRCOM: ps=sumrc;break; case SUMSYN: ps=sums;break; case SUMVAR: ps=sumv;break; case SUMOVERLAP: ps=sumov;break; default:statpr.StatPrintf("Unknown type=%d\n",j); exit(1); }// end for j int i=0; //if (j==SUMOVERLAP) ncall=0; //for pc sum[j]=0.0 if (sum[j]>0.0 && ncall>0) { statpr.StatPrintf(" %s\n",nameGen[j]); for (i=0;i<=RED;i++) { stat.ReadProc((typeprint)(j-SUMCOM+1),pnumb,qnumb,dig_time,ps[i],poutstr); if (poutstr[0]!='\0')statpr.StatPrintf("%s\n",poutstr); } } } // end for k }//exec characteristics } // if nlev<=nlevel n=stat.TreeWalk(); } //names and times of processors char *pname=NULL,*pnamemin=NULL,*pnamemax=NULL; double time,mintime=DBL_MAX,maxtime=0.0,sumtime=0.0; stat.NameTimeProc(0,&pname,&time); if (pname==NULL) exit(1); // not MPI unsigned long minn=0,maxn=0; statpr.StatPrintf("%s","-------------------------------------------------------------------------\n"); statpr.StatPrintf("Name (number) and performance time of processors\n"); for (unsigned long i1=0;i1maxtime) {maxtime=time; maxn=i1+1;pnamemax=pname;} statpr.StatPrintf("%s(%d) %lf\n",pname,i1+1,time); } statpr.StatPrintf("min - %s(%d) %lf; max - %s(%d) %lf; mid - %lf\n", pnamemin,minn,mintime,pnamemax,maxn,maxtime,sumtime/qproc); } // end try catch (bad_alloc ex) { printf("Out of memory\n"); exit(1); } catch (exception ex) { printf("Exception in standart library %s\n",ex.what()); exit(1); } catch (char *str) { printf("%s\n",str); exit(1); } return 0; }