| 1 | /*  Class CPUPower .. Test performances CPU en Java     */
 | 
|---|
| 2 | /*  Compilation: javac cpupower.java                    */
 | 
|---|
| 3 | /*  Execution: java CPUPower Ope Size                   */ 
 | 
|---|
| 4 | /*  R. Ansari - LAL/UPS - Mai 2004                      */
 | 
|---|
| 5 | 
 | 
|---|
| 6 | import java.lang.*;
 | 
|---|
| 7 | 
 | 
|---|
| 8 | class CPUPower {
 | 
|---|
| 9 |  
 | 
|---|
| 10 |   public static void main(String[] args) throws java.io.IOException {
 | 
|---|
| 11 |     if (args.length < 1) { 
 | 
|---|
| 12 |         System.out.println("Java CPUPower.main() Usage: java CPUPower Ope=1/2/3/4/5 [Size=20000]");
 | 
|---|
| 13 |       return;
 | 
|---|
| 14 |     }
 | 
|---|
| 15 |     Integer aOp = new Integer(args[0]);
 | 
|---|
| 16 |     int ope = aOp.intValue();
 | 
|---|
| 17 |     Integer N;
 | 
|---|
| 18 |     if (args.length > 1) N  = new Integer(args[1]);
 | 
|---|
| 19 |     else {
 | 
|---|
| 20 |         if (ope == 0) N = new Integer("1000000");
 | 
|---|
| 21 |         else if (ope >= 4) N = new Integer("2000");
 | 
|---|
| 22 |         else N = new Integer("20000");
 | 
|---|
| 23 |     }
 | 
|---|
| 24 |     int sz = N.intValue();
 | 
|---|
| 25 |     if (sz < 10) sz = 20000;
 | 
|---|
| 26 |     System.out.println("Java CPUPower: OPE= " + ope + " SZ= " + sz);    
 | 
|---|
| 27 |     CPUPower cpup = new CPUPower(sz);
 | 
|---|
| 28 |     cpup.Compute(ope);    
 | 
|---|
| 29 |   }
 | 
|---|
| 30 | 
 | 
|---|
| 31 |   double x[];
 | 
|---|
| 32 |   double y[];
 | 
|---|
| 33 |   double z[];
 | 
|---|
| 34 |   int SZ;
 | 
|---|
| 35 |   int OPE;
 | 
|---|
| 36 |   long N_OP;
 | 
|---|
| 37 |   long tml,tm,dtm;
 | 
|---|
| 38 |  
 | 
|---|
| 39 |   CPUPower(int sz) {   
 | 
|---|
| 40 |     tml = System.currentTimeMillis();
 | 
|---|
| 41 |     SZ = sz;
 | 
|---|
| 42 |     x = new double[SZ];
 | 
|---|
| 43 |     y = new double[SZ];
 | 
|---|
| 44 |     z = new double[SZ];
 | 
|---|
| 45 |     int k;
 | 
|---|
| 46 |     for(k=0; k<SZ; k++) {
 | 
|---|
| 47 |       double xx = (k%340);
 | 
|---|
| 48 |       x[k] = Math.PI*Math.exp(-xx/160.);
 | 
|---|
| 49 |       y[k] = Math.sin(x[k]);
 | 
|---|
| 50 |       z[k] = 0.;
 | 
|---|
| 51 |     }
 | 
|---|
| 52 |     N_OP = 0;
 | 
|---|
| 53 |     tm = System.currentTimeMillis();
 | 
|---|
| 54 |     dtm = tm-tml;
 | 
|---|
| 55 |     tml = tm;
 | 
|---|
| 56 |     System.out.println("CPUPower.CPUPower  Time= " + dtm + "  ms ..."); 
 | 
|---|
| 57 | 
 | 
|---|
| 58 |   }
 | 
|---|
| 59 | 
 | 
|---|
| 60 |   public void Compute(int ope) {
 | 
|---|
| 61 |     int i;
 | 
|---|
| 62 |     OPE = ope;
 | 
|---|
| 63 |     System.out.println("CPUPower.Compute() OPE= " + OPE );
 | 
|---|
| 64 |     tml = System.currentTimeMillis();
 | 
|---|
| 65 |     if (OPE == 5)  fop5();
 | 
|---|
| 66 |     else if (OPE == 4)  fop4();
 | 
|---|
| 67 |     else if (OPE == 3)  fop3();
 | 
|---|
| 68 |     else if (OPE == 2)  fop2();
 | 
|---|
| 69 |     else if (OPE == 1)  fop1();
 | 
|---|
| 70 |     else for(i=0; i<100; i++) fop0();
 | 
|---|
| 71 |     tm = System.currentTimeMillis();
 | 
|---|
| 72 |     dtm = tm-tml;
 | 
|---|
| 73 |     tml = tm;
 | 
|---|
| 74 |     double mflops = N_OP;
 | 
|---|
| 75 |     mflops = mflops/dtm*1.e-3;
 | 
|---|
| 76 |     System.out.println("CPUPower.Compute() N_OP= " + N_OP + " Time= " + dtm + "  ms ");
 | 
|---|
| 77 |     System.out.println("CPUPower.Compute()  Time= " + dtm + "  ms  -> MFLOPS= " + mflops); 
 | 
|---|
| 78 |   }
 | 
|---|
| 79 | 
 | 
|---|
| 80 |   public void fop0() {
 | 
|---|
| 81 |       //    System.out.println("CPUPower.fop0(): Double Loop: z[k] = Somme_i(x[k]*y[i]) --");
 | 
|---|
| 82 |     int k;
 | 
|---|
| 83 |     double s = 0.;
 | 
|---|
| 84 |     for(k=0; k<SZ; k++) z[k] = x[k]*y[k];
 | 
|---|
| 85 |     N_OP += SZ;
 | 
|---|
| 86 |     return;
 | 
|---|
| 87 |   }
 | 
|---|
| 88 | 
 | 
|---|
| 89 |   public void fop1() {
 | 
|---|
| 90 |     System.out.println("CPUPower.fop1(): Double Loop: z[k] = Somme_i(x[k]*y[i]) --");
 | 
|---|
| 91 |     int i,j,k;
 | 
|---|
| 92 |     double s = 0.;
 | 
|---|
| 93 |     for(k=0; k<SZ; k++) {
 | 
|---|
| 94 |       for(i=0; i<SZ; i++)  s += x[k]*y[i];
 | 
|---|
| 95 |       z[k] = s;
 | 
|---|
| 96 |       N_OP += 2*SZ;
 | 
|---|
| 97 |     }    
 | 
|---|
| 98 |     return;
 | 
|---|
| 99 |   }
 | 
|---|
| 100 |  
 | 
|---|
| 101 |   public void fop2() {
 | 
|---|
| 102 |     System.out.println("CPUPower.fop2() Double Loop: z[k] = Somme_i(x[k]*y[i]+x[i]*y[k] --");
 | 
|---|
| 103 |     double s = 0.;
 | 
|---|
| 104 |     int i,j,k;
 | 
|---|
| 105 |     for(k=0; k<SZ; k++) {
 | 
|---|
| 106 |       for(i=0; i<SZ; i++)  s += x[k]*y[i]+x[i]*y[k];
 | 
|---|
| 107 |       z[k] = s;
 | 
|---|
| 108 |       N_OP += 4*SZ;
 | 
|---|
| 109 |     }
 | 
|---|
| 110 | 
 | 
|---|
| 111 |   return;
 | 
|---|
| 112 |   }
 | 
|---|
| 113 | 
 | 
|---|
| 114 |   public void fop3() {
 | 
|---|
| 115 |     System.out.println("CPUPower.fop3() Double Loop: z[k] = Somme_i(x[k]*y[i]+x[i]*y[k]-0.85*(y[k]+x[k])) --");
 | 
|---|
| 116 |     double s = 0.;
 | 
|---|
| 117 |     int i,j,k;
 | 
|---|
| 118 |     for(k=0; k<SZ; k++) {
 | 
|---|
| 119 |       for(i=0; i<SZ; i++)  s += x[k]*y[i]+x[i]*y[k]-0.85*(y[k]+x[k]);
 | 
|---|
| 120 |       z[k] = s;
 | 
|---|
| 121 |       N_OP += 7*SZ;
 | 
|---|
| 122 |     }
 | 
|---|
| 123 |   return;
 | 
|---|
| 124 |   }
 | 
|---|
| 125 |   public void fop4() {
 | 
|---|
| 126 |     System.out.println("CPUPower.fop4() Double Loop: z[k] = Somme_i(x[k]*sin(y[i])+y[k]*cos(x[i])) --");
 | 
|---|
| 127 |     double s = 0.;
 | 
|---|
| 128 |     int i,j,k;
 | 
|---|
| 129 |     for(k=0; k<SZ; k++) {
 | 
|---|
| 130 |       for(i=0; i<SZ; i++)  s += x[k]*Math.sin(y[i])+y[k]*Math.cos(x[i]);
 | 
|---|
| 131 |       z[k] = s;
 | 
|---|
| 132 |       N_OP += 70*SZ;  // le facteur 70 est approximatif
 | 
|---|
| 133 |     }
 | 
|---|
| 134 |   }
 | 
|---|
| 135 |   public void fop5() {
 | 
|---|
| 136 |     System.out.println("CPUPower.fop5() Double Loop: z[k] = Somme_i(x[k]*sin(y[i])+log(abs(x[i])+0.1)+y[k]) --");
 | 
|---|
| 137 |     double s = 0.;
 | 
|---|
| 138 |     int i,j,k;
 | 
|---|
| 139 |     for(k=0; k<SZ; k++) {
 | 
|---|
| 140 |       for(i=0; i<SZ; i++)  s += x[k]*Math.sin(y[i])+Math.log(Math.abs(x[i])+0.1)+y[k];
 | 
|---|
| 141 |       z[k] = s;
 | 
|---|
| 142 |       N_OP += 100*SZ;  // le facteur 100 est approximatif
 | 
|---|
| 143 |     }
 | 
|---|
| 144 |   }
 | 
|---|
| 145 | 
 | 
|---|
| 146 | }
 | 
|---|
| 147 | 
 | 
|---|
| 148 | 
 | 
|---|
| 149 | 
 | 
|---|
| 150 | 
 | 
|---|
| 151 | 
 | 
|---|
| 152 | 
 | 
|---|