import java.util.*; import java.util.concurrent.*; import java.util.concurrent.locks.*; import easyIO.*; // file: Modell2.java // Lagt ut 15 feb 2017.Korrigert: Arne Maus, Ifi, UiO // Som BARE et eksempel, er problemet med å øke fellesvariabelen i n*antKjerner ganger løst // mens denne modell2 bruker 0.05 ms på trådene for hver iterasjon bruker modell3 0,5 ms tilsvarende // FOUTSETTER bare 1 parallell metode skal utføres. class Modell2{ // ****** Problemets FELLES DATA HER int i; int [] allI; final String navn = "TEST AV i++ med synchronized oppdatering som eksempel"; // Felles system-variable - samme for 'alle' programmer CyclicBarrier vent,ferdig, heltferdig ; // for at trådene og main venter på hverandre int antTraader; int antKjerner; int numIter ; // antall ganger for å lage median (1,3,5,,) int nLow,nStep,nHigh; // laveste, multiplikator, hoyeste n-verdi int n; // problemets størrelse String filnavn; volatile boolean stop = false; int med; Out ut; double [] seqTime ; double [] parTime ; /** for også utskrift på fil */ synchronized void println(String s) { ut.outln(s); System.out.println(s); } /** for også utskrift på fil */ synchronized void print(String s) { ut.out(s); System.out.print(s); } /** initieringen i main-tråden */ void intitier(String [] args) { nLow = Integer.parseInt(args[0]); nStep = Integer.parseInt(args[1]); nHigh = Integer.parseInt(args[2]); numIter = Integer.parseInt(args[3]); filnavn = args[4]; seqTime = new double [numIter]; parTime = new double [numIter]; ut = new Out(filnavn, true); antKjerner = Runtime.getRuntime().availableProcessors(); antTraader = antKjerner; allI = new int [antTraader]; vent = new CyclicBarrier(antTraader+1); //+1, også main ferdig = new CyclicBarrier(antTraader+1); //+1, også main heltferdig = new CyclicBarrier(2); // for at main skal vente på at tråd 0 er ferdig // start trådene for (int i = 0; i< antTraader; i++) new Thread(new Para(i)).start(); } // end initier public static void main (String [] args) { if ( args.length != 5) { System.out.println("use: >java Modell2 "); } else { new Modell2().utforTest(args); } } // end main void utforTest (String [] args) { intitier(args); println("Test av "+ navn+ "\n med "+ antKjerner + " kjerner , og " + antTraader+" traader, Median av:" + numIter+" iterasjoner\n"); println("\n n sekv.tid(ms) para.tid(ms) Speedup "); for (n = nHigh; n >= nLow; n=n/nStep) { for (med = 0; med < numIter; med++) { long t = System.nanoTime(); // start tidtagning parallell // Start alle trådene parallell beregning nå try { vent.await(); // start de parallelle trådene ferdig.await(); // vent på at trådene er ferdige med beregningene } catch (Exception e) {return;} try { heltferdig.await(); // vent på at tråd 0 har summert svaret } catch (Exception e) {return;} t = (System.nanoTime()-t); parTime[med] =t/1000000.0; t = System.nanoTime(); // start tidtagning sekvensiell //**** KALL PÅ DIN SEKVENSIELLE METODE H E R ******** sekvensiellMetode (n); t = (System.nanoTime()-t); seqTime[med] =t/1000000.0; } // end for med println(Format.align(n,10)+ Format.align(median(seqTime,numIter),12,3)+ Format.align(median(parTime,numIter),15,3)+ Format.align(median(seqTime,numIter)/median(parTime,numIter),13,4)); } // end n-llop exit(); } // utforTest /** terminate parallel threads*/ void exit() { stop = true; try { // start the other threads and they terminate vent.await(); } catch (Exception e) {return;} ut.close(); } // end exit /*** HER er din egen sekvensielle metode som selvsagt IKKE ER synchronized, */ void sekvensiellMetode (int n){ i=0; for (int j=0; j t ) { a[i] = a[i-1]; if (--i == 0) break; } a[i] = t; } // end k return (a[a.length/2]); } // end insertSort }// END class Parallell