| [2533] | 1 | /* #include "machdefs.h" */ | 
|---|
|  | 2 |  | 
|---|
|  | 3 | #include <stdlib.h> | 
|---|
|  | 4 | #include <stdio.h> | 
|---|
|  | 5 | #include <math.h> | 
|---|
|  | 6 | #include <string.h> | 
|---|
|  | 7 | #include <time.h> | 
|---|
|  | 8 |  | 
|---|
|  | 9 |  | 
|---|
|  | 10 | /*  ---------------------------------------------------  */ | 
|---|
|  | 11 | /*  --- Petit programme d'estimation de la puissance CPU */ | 
|---|
| [2537] | 12 | /*  Compilation: csh> cc -O3 -o cpupower cpupower.c -lm  */ | 
|---|
| [2533] | 13 | /*  R. Ansari   -   LAL   Mai 2004                       */ | 
|---|
|  | 14 | /*  ---------------------------------------------------  */ | 
|---|
|  | 15 |  | 
|---|
|  | 16 | /*  Choix de type d'operations  float double int ... */ | 
|---|
| [2534] | 17 | #define  T_Type  double | 
|---|
| [2533] | 18 |  | 
|---|
| [2584] | 19 | static int SZ=20000;                    /* Taille de tableau */ | 
|---|
|  | 20 | static double N_OP=0;               /* Nb operations */ | 
|---|
|  | 21 | static  int OPE=0;                  /* Choix Operation fop_1/2/3/4    */ | 
|---|
|  | 22 | static int ckprt=0;                 /* > 0 : Print check apres calcul */ | 
|---|
| [2533] | 23 |  | 
|---|
|  | 24 | /*  Tableaux X,Y,Z   */ | 
|---|
|  | 25 | static T_Type * x; | 
|---|
|  | 26 | static T_Type * y; | 
|---|
|  | 27 | static T_Type * z; | 
|---|
|  | 28 |  | 
|---|
| [2584] | 29 | void fop_0() | 
|---|
|  | 30 | { | 
|---|
|  | 31 | T_Type s=0; | 
|---|
|  | 32 | int i,k; | 
|---|
| [2712] | 33 | /*  printf("--- fop_0: Simple Loop: z[k] = x[k]*y[i] --- \n"); */ | 
|---|
|  | 34 | for(k=0; k<SZ; k++) z[k] = x[k]*y[99]; | 
|---|
| [2584] | 35 | N_OP += SZ; | 
|---|
|  | 36 | return; | 
|---|
|  | 37 | } | 
|---|
| [2712] | 38 | void fop_30() | 
|---|
|  | 39 | { | 
|---|
|  | 40 | T_Type s=0; | 
|---|
|  | 41 | int i,k; | 
|---|
|  | 42 | /*  printf("--- fop_30: Simple Loop triple: z[k] = x[k]*y[i] --- \n");  */ | 
|---|
|  | 43 | for(k=0; k<SZ; k+=3) { z[k] = x[k]*y[99]; z[k+1] = x[k+1]*y[99]; z[k+2] = x[k+2]*y[99]; } | 
|---|
|  | 44 | N_OP += SZ; | 
|---|
|  | 45 | return; | 
|---|
|  | 46 | } | 
|---|
| [2584] | 47 |  | 
|---|
| [2533] | 48 | void fop_1() | 
|---|
|  | 49 | { | 
|---|
| [2537] | 50 | T_Type s=0; | 
|---|
| [2533] | 51 | int i,j,k; | 
|---|
|  | 52 | printf("--- fop_1: Double Loop: z[k] = Somme_i(x[k]*y[i]) --- \n"); | 
|---|
|  | 53 | for(k=0; k<SZ; k++) { | 
|---|
|  | 54 | for(i=0; i<SZ; i++)  s += x[k]*y[i]; | 
|---|
|  | 55 | z[k] = s; | 
|---|
|  | 56 | N_OP += 2*SZ; | 
|---|
|  | 57 | } | 
|---|
|  | 58 | return; | 
|---|
|  | 59 | } | 
|---|
|  | 60 |  | 
|---|
|  | 61 | void fop_2() | 
|---|
|  | 62 | { | 
|---|
| [2537] | 63 | T_Type s=0; | 
|---|
| [2533] | 64 | int i,j,k; | 
|---|
|  | 65 | printf("--- fop_2: Double Loop: z[k] = Somme_i(x[k]*y[i]+x[i]*y[k]) --- \n"); | 
|---|
|  | 66 | for(k=0; k<SZ; k++) { | 
|---|
|  | 67 | for(i=0; i<SZ; i++)  s += x[k]*y[i]+x[i]*y[k]; | 
|---|
|  | 68 | z[k] = s; | 
|---|
|  | 69 | N_OP += 4*SZ; | 
|---|
|  | 70 | } | 
|---|
|  | 71 | return; | 
|---|
|  | 72 | } | 
|---|
|  | 73 |  | 
|---|
| [2534] | 74 | void fop_3() | 
|---|
|  | 75 | { | 
|---|
| [2537] | 76 | T_Type s=0; | 
|---|
| [2534] | 77 | int i,j,k; | 
|---|
|  | 78 | printf("--- fop_3: Double Loop: z[k] = Somme_i(x[k]*y[i]+x[i]*y[k]-0.85*(y[k]+x[k])) --- \n"); | 
|---|
|  | 79 | for(k=0; k<SZ; k++) { | 
|---|
|  | 80 | for(i=0; i<SZ; i++)  s += x[k]*y[i]+x[i]*y[k]-0.85*(y[k]+x[k]); | 
|---|
|  | 81 | z[k] = s; | 
|---|
|  | 82 | N_OP += 7*SZ; | 
|---|
|  | 83 | } | 
|---|
|  | 84 | return; | 
|---|
|  | 85 | } | 
|---|
|  | 86 |  | 
|---|
| [2537] | 87 | void fop_4() | 
|---|
|  | 88 | { | 
|---|
|  | 89 | T_Type s=0; | 
|---|
|  | 90 | int i,j,k; | 
|---|
|  | 91 | printf("--- fop_4: Double Loop: z[k] = Somme_i(x[k]*sin(y[i])+y[k]*cos(x[i])) --- \n"); | 
|---|
|  | 92 | for(k=0; k<SZ; k++) { | 
|---|
|  | 93 | for(i=0; i<SZ; i++)  s += x[k]*sin(y[i])+y[k]*cos(x[i]); | 
|---|
|  | 94 | z[k] = s; | 
|---|
| [2553] | 95 | N_OP += 70*SZ;  /* le facteur 70 est approximatif */ | 
|---|
| [2537] | 96 | } | 
|---|
|  | 97 | return; | 
|---|
|  | 98 | } | 
|---|
|  | 99 |  | 
|---|
|  | 100 | void fop_5() | 
|---|
|  | 101 | { | 
|---|
|  | 102 | T_Type s=0; | 
|---|
|  | 103 | int i,j,k; | 
|---|
|  | 104 | printf("--- fop_5: Double Loop: z[k] = Somme_i(x[k]*sin(y[i])+log(fabs(x[i])+0.1)+y[k]) --- \n"); | 
|---|
|  | 105 | for(k=0; k<SZ; k++) { | 
|---|
|  | 106 | for(i=0; i<SZ; i++)  s += x[k]*sin(y[i])+log(fabs(x[i])+0.1)+y[k]; | 
|---|
|  | 107 | z[k] = s; | 
|---|
| [2553] | 108 | N_OP += 100*SZ;  /* le facteur 100 est approximatif */ | 
|---|
| [2537] | 109 | } | 
|---|
|  | 110 | return; | 
|---|
|  | 111 | } | 
|---|
|  | 112 |  | 
|---|
| [2533] | 113 | /* Fonctions de timing (TCPU) - voir en fin de fichier */ | 
|---|
|  | 114 | void InitTim(void); | 
|---|
|  | 115 | void PrtTim(const char * Comm); | 
|---|
|  | 116 | double GetPartialCPUTime(); | 
|---|
|  | 117 | double GetTotalCPUTime(); | 
|---|
|  | 118 |  | 
|---|
|  | 119 | int main(int narg, char* arg[]) | 
|---|
|  | 120 | { | 
|---|
|  | 121 | int maxnprt = 1000; | 
|---|
| [2584] | 122 | int nloop = 1000; | 
|---|
| [2533] | 123 | int i,nprt; | 
|---|
|  | 124 | double mflops; | 
|---|
|  | 125 |  | 
|---|
|  | 126 | /*  SophyaInit();   */ | 
|---|
|  | 127 | InitTim();   /* Initializing the CPU timer  */ | 
|---|
|  | 128 |  | 
|---|
|  | 129 | if (narg < 2) { | 
|---|
|  | 130 | printf("--- Programme cpupower: (Puissance de calcul) ---- \n"); | 
|---|
| [2584] | 131 | printf("  Usage cpupower Op=0/1/2/3/4/5 [Size=20000] [NLoop=1000] [CkPrt=0]\n"); | 
|---|
|  | 132 | printf("  Op=0 Simple Loop: z[k] = x[k]*y[k]  effectue NLoop fois\n"); | 
|---|
|  | 133 | printf("    Size=10^6 par defaut, NLoop=100 \n"); | 
|---|
| [2538] | 134 | printf("  Op=1 Double Loop: z[k] = Somme_i(x[k]*y[i])  \n"); | 
|---|
|  | 135 | printf("    Op=1 *,+=2 op / tour de boucle \n"); | 
|---|
| [2537] | 136 | printf("  Op=2 Double Loop: z[k] = Somme_i(x[k]*y[i]+x[i]*y[k]) \n"); | 
|---|
| [2538] | 137 | printf("    Op=2 2x(*,+)=4 op /  tour de boucle \n"); | 
|---|
| [2537] | 138 | printf("  Op=3 Double Loop: z[k] = Somme_i(x[k]*y[i]+x[i]*y[k]-0.85*(y[k]+x[k])) \n"); | 
|---|
| [2538] | 139 | printf("    Op=3  7 op (*,+) /  tour de boucle \n"); | 
|---|
| [2537] | 140 | printf("  Op=4 Double Loop: z[k] = Somme_i(x[k]*sin(y[i])+y[k]*cos(x[i])) \n"); | 
|---|
| [2538] | 141 | printf("    Op=4   ~ 70 op float /  tour de boucle \n"); | 
|---|
| [2537] | 142 | printf("  Op=5 Double Loop: z[k] = Somme_i(x[k]*sin(y[i])+log(fabs(x[i])+0.1)+y[k]) \n"); | 
|---|
| [2538] | 143 | printf("    Op=5   ~ 100 op float /  tour de boucle \n"); | 
|---|
| [2584] | 144 | printf("    Test 4,5 Size=2000 par defaut  \n"); | 
|---|
| [2534] | 145 | return 1; | 
|---|
| [2533] | 146 | } | 
|---|
|  | 147 | OPE = atoi(arg[1]); | 
|---|
|  | 148 | SZ = 20000; | 
|---|
| [2584] | 149 | if (OPE == 0) SZ = 1000000; | 
|---|
|  | 150 | if (OPE >= 4) SZ = 2000; | 
|---|
| [2533] | 151 | if (narg > 2)  SZ = atoi(arg[2]); | 
|---|
| [2584] | 152 | nloop = 100; | 
|---|
|  | 153 | if (narg > 3)  nloop = atoi(arg[3]); | 
|---|
| [2533] | 154 | ckprt = 0; | 
|---|
| [2712] | 155 | if (narg > 4)  ckprt = atoi(arg[4]); | 
|---|
| [2533] | 156 |  | 
|---|
|  | 157 | printf("::::::: cpupower: OPE=%d SZ= %d ::::::: \n", OPE,SZ); | 
|---|
|  | 158 | x = malloc(SZ*sizeof(T_Type)); | 
|---|
|  | 159 | y = malloc(SZ*sizeof(T_Type)); | 
|---|
|  | 160 | z = malloc(SZ*sizeof(T_Type)); | 
|---|
|  | 161 |  | 
|---|
|  | 162 | for(i=0; i<SZ; i++) { | 
|---|
|  | 163 | x[i] = (T_Type)((random()%10000)-5000); | 
|---|
|  | 164 | y[i] = (T_Type)((random()%10000)-5000); | 
|---|
| [2584] | 165 | z[i] = (T_Type)(0); | 
|---|
| [2533] | 166 | } | 
|---|
|  | 167 | PrtTim("--Fin malloc+init x,y,z "); | 
|---|
| [2584] | 168 | N_OP = 0; | 
|---|
| [2537] | 169 | if (OPE == 5)  fop_5(); | 
|---|
|  | 170 | else if (OPE == 4)  fop_4(); | 
|---|
|  | 171 | else if (OPE == 3)  fop_3(); | 
|---|
| [2534] | 172 | else if (OPE == 2)  fop_2(); | 
|---|
| [2584] | 173 | else if (OPE == 1)  fop_1(); | 
|---|
| [2712] | 174 | else if (OPE == 30)  for(i=0; i<nloop; i++) fop_30(); | 
|---|
| [2584] | 175 | else for(i=0; i<nloop; i++) fop_0(); | 
|---|
| [2533] | 176 | PrtTim("---Fin OpeDoubleBoucle "); | 
|---|
|  | 177 | mflops = N_OP/ GetPartialCPUTime()*1.e-6; | 
|---|
| [2534] | 178 | printf("-> Nb Operations= %g  MFLOPS= %g \n",N_OP,mflops); | 
|---|
| [2533] | 179 | if (ckprt > 0) { | 
|---|
|  | 180 | printf(" CheckPrint - ckprt= %d maxnprt= %d \n", ckprt, maxnprt); | 
|---|
|  | 181 | nprt = 0; | 
|---|
|  | 182 | for(i=0; i<SZ; i+= ckprt) { | 
|---|
|  | 183 | printf("i=%d x[i]=%g y[i]=%g z[i]=%g \n", i, (double)x[i], | 
|---|
|  | 184 | (double)y[i], (double)z[i]); | 
|---|
|  | 185 | nprt++; | 
|---|
|  | 186 | if (nprt > 1000) break; | 
|---|
|  | 187 | } | 
|---|
|  | 188 | } | 
|---|
|  | 189 |  | 
|---|
|  | 190 | PrtTim("----Fin cpupower"); | 
|---|
| [2534] | 191 | printf(":::::: FIN cpupower N_OP= %g MFLOPS= %g ::::::: \n", N_OP,mflops); | 
|---|
| [2533] | 192 |  | 
|---|
|  | 193 | free(x); | 
|---|
|  | 194 | free(y); | 
|---|
|  | 195 | free(z); | 
|---|
| [2534] | 196 | return 0; | 
|---|
| [2533] | 197 | } | 
|---|
|  | 198 |  | 
|---|
|  | 199 |  | 
|---|
|  | 200 | static clock_t CPUT0, CPUT; | 
|---|
|  | 201 | static time_t ELT0, ELT; | 
|---|
|  | 202 | static double _totcpu, _partialcpu; | 
|---|
|  | 203 |  | 
|---|
|  | 204 | void InitTim(void) | 
|---|
|  | 205 | { | 
|---|
|  | 206 | CPUT0 = CPUT = clock(); | 
|---|
|  | 207 | ELT0 = ELT = time(NULL); | 
|---|
|  | 208 | _totcpu = _partialcpu = 0.; | 
|---|
|  | 209 | return; | 
|---|
|  | 210 | } | 
|---|
|  | 211 | double GetPartialCPUTime() { return _partialcpu; } | 
|---|
|  | 212 | double GetTotalCPUTime() { return _totcpu; } | 
|---|
|  | 213 |  | 
|---|
|  | 214 | /* Nouvelle-Fonction */ | 
|---|
|  | 215 | void PrtTim(const char * Comm) | 
|---|
|  | 216 | { | 
|---|
|  | 217 | float tcal,tcalt; | 
|---|
|  | 218 | clock_t cput; | 
|---|
|  | 219 | time_t elt; | 
|---|
|  | 220 | int etm,etmt; | 
|---|
|  | 221 |  | 
|---|
|  | 222 | elt = time(NULL);  cput = clock(); | 
|---|
|  | 223 | tcalt = ( (float)(cput) - (float)(CPUT0) ) / (float)(CLOCKS_PER_SEC); | 
|---|
|  | 224 | tcal = ( (float)(cput) - (float)(CPUT) ) / (float)(CLOCKS_PER_SEC); | 
|---|
|  | 225 | _totcpu = tcalt; | 
|---|
|  | 226 | _partialcpu = tcal; | 
|---|
|  | 227 |  | 
|---|
|  | 228 | etm = elt - ELT; | 
|---|
|  | 229 | etmt = elt - ELT0; | 
|---|
|  | 230 | printf("%s CPUTime: Total= %g  (Partial= %g) Sec. \n", | 
|---|
|  | 231 | Comm, tcalt, tcal); | 
|---|
|  | 232 | printf("ElapsedTime(hh:mm:ss): Total= %02d:%02d:%02d ", | 
|---|
|  | 233 | etmt/3600, (etmt%3600)/60, etmt%60); | 
|---|
|  | 234 | printf(" (Partial= %02d:%02d:%02d)\n", | 
|---|
|  | 235 | etm/3600, (etm%3600)/60, etm%60); | 
|---|
|  | 236 |  | 
|---|
|  | 237 | ELT = elt; | 
|---|
|  | 238 | CPUT = cput; | 
|---|
|  | 239 | return; | 
|---|
|  | 240 | } | 
|---|