From 8e7cf6effcb74c348924f8559cd9e01ce48c68a3 Mon Sep 17 00:00:00 2001 From: bdemsky Date: Mon, 4 Jan 2010 05:16:12 +0000 Subject: [PATCH] changes --- Robust/TransSim/Executor.java | 190 +++++++++++++++++++++++++++++ Robust/TransSim/FlexScheduler.java | 126 +++++++++++-------- Robust/TransSim/Scheduler.java | 52 ++++---- Robust/TransSim/Series.java | 8 +- Robust/TransSim/TEvent.java | 27 ++++ Robust/TransSim/ThreadInfo.java | 18 +++ Robust/TransSim/TransSim.java | 6 +- Robust/TransSim/Transaction.java | 32 ++++- 8 files changed, 371 insertions(+), 88 deletions(-) create mode 100644 Robust/TransSim/TEvent.java diff --git a/Robust/TransSim/Executor.java b/Robust/TransSim/Executor.java index 1294e650..4c65b400 100644 --- a/Robust/TransSim/Executor.java +++ b/Robust/TransSim/Executor.java @@ -1,4 +1,8 @@ import java.util.Random; +import java.io.FileInputStream; +import java.io.InputStream; +import java.io.BufferedInputStream; +import java.util.Vector; public class Executor { int numThreads; @@ -30,6 +34,192 @@ public class Executor { this(numThreads, numTrans, deltaTrans, numObjects, numAccesses, deltaAccesses, readPercent, delay, deltaDelay, nonTrans, deltaNonTrans, 100, 100, 0); } + public static int readInt(InputStream is) { + try { + int b1=is.read(); + int b2=is.read(); + int b3=is.read(); + int b4=is.read(); + int retval=(b1<<24)|(b2<<16)|(b3<<8)|b4; + if (retval<0) + throw new Error(); + return retval; + } catch (Exception e) { + throw new Error(); + } + } + + public static long readLong(InputStream is) { + try { + long b1=is.read(); + long b2=is.read(); + long b3=is.read(); + long b4=is.read(); + long b5=is.read(); + long b6=is.read(); + long b7=is.read(); + long b8=is.read(); + long retval=(b1<<56)|(b2<<48)|(b3<<40)|(b4<<32)| + (b5<<24)|(b6<<16)|(b7<<8)|b8; + if (retval<0) + throw new Error(); + return retval; + } catch (Exception e) { + throw new Error(); + } + } + + public Executor(String filename) { + BufferedInputStream bir; + try { + bir=new BufferedInputStream(new FileInputStream(filename)); + } catch (Exception e) { + throw new Error(); + } + numThreads=readInt(bir); + threads=new ThreadClass[numThreads]; + long earliest=-1; + for(int i=0;iinittime) { + earliest=inittime; + } + } + for(int i=0;i v) { + Transaction t=new Transaction(v.size()); + for(int i=0;i transactions=new Vector(); + Vector currtrans=null; + long starttime=-1; + long lasttime=0; + long firsttime=-1; + for(int i=0;i(); + if (lasttime!=-1) { + Transaction t=new Transaction(1); + t.setEvent(0, Transaction.DELAY); + t.setTime(0, time-lasttime); + t.setObject(0, -1); + t.setIndex(0, -1); + transactions.add(t); + } + break; + case EV_READ: + case EV_ARRAYREAD: { + long delta=time-starttime; + TEvent ev=new TEvent(Transaction.READ, delta, object, index); + currtrans.add(ev); + } + break; + case EV_WRITE: + case EV_ARRAYWRITE: { + long delta=time-starttime; + TEvent ev=new TEvent(Transaction.WRITE, delta, object, index); + currtrans.add(ev); + } + break; + case EV_COMMIT: { + long delta=time-starttime; + TEvent ev=new TEvent(Transaction.DELAY, delta); + currtrans.add(ev); + lasttime=time; + transactions.add(createTransaction(currtrans)); + } + break; + case EV_ABORT: + //No need to generate new delay transaction + lasttime=-1; + break; + case EV_THREAD: + //No need to do anything + break; + case EV_ENTERBARRIER: { + //Barrier + if (lasttime!=-1) { + Transaction t=new Transaction(1); + t.setEvent(0, Transaction.DELAY); + t.setTime(0, time-lasttime); + t.setObject(0, -1); + t.setIndex(0, -1); + transactions.add(t); + } + transactions.add(Transaction.getBarrier()); + } + break; + case EV_EXITBARRIER: { + //Barrier + lasttime=time; + } + break; + } + } + ThreadClass tc=new ThreadClass(transactions.size()); + for(int i=0;iopponenttime) opponenttime=otime; } @@ -382,10 +379,9 @@ public class FlexScheduler { public void enqueueEvent(Event ev, Transaction trans) { //just enqueue next event int event=ev.getEvent(); - int currtime=ev.getTime(); - int object=trans.getObject(event); + long currtime=ev.getTime(); + ObjIndex object=trans.getObjIndex(event); int operation=trans.getEvent(event); - Integer obj=new Integer(object); if ((operation==Transaction.READ||operation==Transaction.WRITE)&&isLock()) { ObjectInfo oi=getmapping(object); @@ -405,13 +401,13 @@ public class FlexScheduler { break; } //follow one more in depth - toi=getmapping(threadinfo[toi.getOwner()].getObject()); + toi=getmapping(threadinfo[toi.getOwner()].getObjIndex()); } if (!deadlocked) { //don't wait on stalled threads, we could deadlock threadinfo[ev.getThread()].setStall(true); - threadinfo[ev.getThread()].setObject(object); + threadinfo[ev.getThread()].setObjIndex(object); if (serStall!=null) serStall.addPoint(ev.getTime(),ev.getThread()); oi.addWaiter(ev); @@ -431,9 +427,9 @@ public class FlexScheduler { //process the current event if (operation==Transaction.READ) { //record read event - if (!rdobjmap.containsKey(obj)) - rdobjmap.put(obj,new HashSet()); - ((Set)rdobjmap.get(obj)).add(new Integer(ev.getThread())); + if (!rdobjmap.containsKey(object)) + rdobjmap.put(object,new HashSet()); + ((Set)rdobjmap.get(object)).add(new Integer(ev.getThread())); if (isEager()) { //do eager contention management Set conflicts=rdConflictSet(ev.getThread(), object); @@ -444,9 +440,9 @@ public class FlexScheduler { } } else if (operation==Transaction.WRITE) { //record write event - if (!wrobjmap.containsKey(obj)) - wrobjmap.put(obj,new HashSet()); - ((Set)wrobjmap.get(obj)).add(new Integer(ev.getThread())); + if (!wrobjmap.containsKey(object)) + wrobjmap.put(object,new HashSet()); + ((Set)wrobjmap.get(object)).add(new Integer(ev.getThread())); if (isEager()) { Set conflicts=wrConflictSet(ev.getThread(), object); if (conflicts!=null) { @@ -454,10 +450,30 @@ public class FlexScheduler { return; } } + } else if (operation==Transaction.BARRIER) { + barriercount--; + if (barriercount==0) { + for(int i=0;i0) + return 1; + else + return -1; + } if (((getEvent()+1)==getTransaction().numEvents())&& (e.getEvent()+1)!=e.getTransaction().numEvents()) return -1; diff --git a/Robust/TransSim/Scheduler.java b/Robust/TransSim/Scheduler.java index ae04fa89..7fd3b97b 100644 --- a/Robust/TransSim/Scheduler.java +++ b/Robust/TransSim/Scheduler.java @@ -3,40 +3,39 @@ import java.util.HashSet; public class Scheduler { Executor e; - public Scheduler(Executor e, int time) { + public Scheduler(Executor e, long time) { this.e=e; schedule=new int[e.numEvents()+1][e.numThreads()]; turn=new int[e.numEvents()]; //give last time an event can be scheduled - lasttime=new int[e.maxEvents()][e.numThreads()]; - - schedtime=new int[e.maxEvents()][e.numThreads()]; - lastrd=new int[e.numEvents()+1][e.numObjects()]; - lastwr=new int[e.numEvents()+1][e.numObjects()]; + lasttime=new long[e.maxEvents()][e.numThreads()]; + schedtime=new long[e.maxEvents()][e.numThreads()]; + lastrd=new long[e.numEvents()+1][e.numObjects()]; + lastwr=new long[e.numEvents()+1][e.numObjects()]; shorttesttime=time; computeFinishing(time); } - - int currbest; - int shorttesttime; + + long currbest; + long shorttesttime; int[][] schedule; int[] turn; - int[][] lasttime; - int[][] schedtime; - int[][] lastrd; - int[][] lastwr; + long[][] lasttime; + long[][] schedtime; + long[][] lastrd; + long[][] lastwr; - public int getTime() { + public long getTime() { return currbest; } - private void computeFinishing(int totaltime) { + private void computeFinishing(long totaltime) { for(int threadnum=0;threadnum=0;transnum--) { Transaction trans=thread.getTransaction(transnum); - int ltime=trans.getTime(trans.numEvents()-1); + long ltime=trans.getTime(trans.numEvents()-1); threadtime-=ltime; lasttime[transnum][threadnum]=threadtime; } @@ -53,7 +52,7 @@ public class Scheduler { //compute start time ThreadClass thread=e.getThread(iturn); int transnum=schedule[0][iturn]-schedule[step][iturn]; - int starttime=0; + long starttime=0; if (transnum>0) { starttime=schedtime[transnum-1][iturn]; Transaction prevtrans=thread.getTransaction(transnum-1); @@ -62,13 +61,14 @@ public class Scheduler { //Let's check for object conflicts that delay start time Transaction trans=thread.getTransaction(transnum); for(int ev=0;evstarttime) starttime=newstart; break; @@ -76,7 +76,7 @@ public class Scheduler { case Transaction.WRITE: { //just need to check both write and read times - int newstart=lastwr[step][evobject]-evtime; + long newstart=lastwr[step][evobject]-evtime; if (newstart>starttime) starttime=newstart; @@ -101,11 +101,11 @@ public class Scheduler { lastwr[step+1][obj]=lastwr[step][obj]; } - int finishtime=starttime+trans.getTime(trans.numEvents()-1); + long finishtime=starttime+trans.getTime(trans.numEvents()-1); //Update read and write times for(int ev=0;evmaxfinish) maxfinish=finisht; } diff --git a/Robust/TransSim/Series.java b/Robust/TransSim/Series.java index 83de6a65..9509ea05 100644 --- a/Robust/TransSim/Series.java +++ b/Robust/TransSim/Series.java @@ -6,8 +6,12 @@ public class Series { this.out=out; } - public void addPoint(int x, int y) { - addPoint(Integer.toString(x), Integer.toString(y)); + public void addPoint(long x, int y) { + addPoint(Long.toString(x), Integer.toString(y)); + } + + public void addPoint(int x, long y) { + addPoint(Integer.toString(x), Long.toString(y)); } public void addPoint(String time, String value) { diff --git a/Robust/TransSim/TEvent.java b/Robust/TransSim/TEvent.java new file mode 100644 index 00000000..fec70a98 --- /dev/null +++ b/Robust/TransSim/TEvent.java @@ -0,0 +1,27 @@ +public class TEvent { + public int type; + public int index; + public int oid; + public long time; + + public TEvent(int type, long time) { + this.time=time; + this.type=type; + this.oid=-1; + this.index=-1; + } + + public TEvent(int type, long time, int oid) { + this.time=time; + this.type=type; + this.oid=oid; + this.index=-1; + } + + public TEvent(int type, long time, int oid, int index) { + this.time=time; + this.type=type; + this.oid=oid; + this.index=index; + } +} \ No newline at end of file diff --git a/Robust/TransSim/ThreadInfo.java b/Robust/TransSim/ThreadInfo.java index c8133798..e359e5d6 100644 --- a/Robust/TransSim/ThreadInfo.java +++ b/Robust/TransSim/ThreadInfo.java @@ -7,15 +7,33 @@ public class ThreadInfo { } boolean stalled; int oid; + int index; public void setObject(int oid) { this.oid=oid; } + public void setIndex(int index) { + this.index=index; + } + public int getObject() { return oid; } + public int getIndex() { + return index; + } + + public void setObjIndex(ObjIndex oi) { + oid=oi.object; + index=oi.index; + } + + public ObjIndex getObjIndex() { + return new ObjIndex(oid, index); + } + public boolean isStalled() { return stalled; } diff --git a/Robust/TransSim/TransSim.java b/Robust/TransSim/TransSim.java index f44c6acd..ce14e5b5 100644 --- a/Robust/TransSim/TransSim.java +++ b/Robust/TransSim/TransSim.java @@ -1,6 +1,6 @@ public class TransSim { public static void main(String[] args) { - int numThreads=8; + int numThreads=20; int numTrans=4; int deltaTrans=0; int numObjects=200; @@ -23,9 +23,9 @@ public class TransSim { Plot p=new Plot("plot"); - for(int i=1;i<40;i+=1) { + for(int i=10;i<800;i+=5) { System.out.println("i="+i); - Executor e=new Executor(numThreads, numTrans, deltaTrans, numObjects, i, deltaAccesses, readPercent, delay, deltaDelay, nonTrans, deltaNonTrans, splitobjects, splitaccesses, readPercentSecond); + Executor e=new Executor(numThreads, numTrans, deltaTrans, i, numAccesses, deltaAccesses, readPercent, delay, deltaDelay, nonTrans, deltaNonTrans, splitobjects, splitaccesses, readPercentSecond); System.out.println(e.maxTime()); FlexScheduler ls=new FlexScheduler(e, FlexScheduler.LAZY, null); ls.dosim(); diff --git a/Robust/TransSim/Transaction.java b/Robust/TransSim/Transaction.java index 05f89d39..9e352f73 100644 --- a/Robust/TransSim/Transaction.java +++ b/Robust/TransSim/Transaction.java @@ -1,7 +1,8 @@ public class Transaction { int[] events; int[] objects; - int[] times; + int[] indices; + long[] times; public String toString() { String s=""; @@ -19,12 +20,20 @@ public class Transaction { public static final int READ=0; public static final int WRITE=1; + public static final int BARRIER=2; public static final int DELAY=-1; + public static Transaction getBarrier() { + Transaction t=new Transaction(1); + t.setEvent(0, BARRIER); + return t; + } + public Transaction(int size) { events=new int[size]; objects=new int[size]; - times=new int[size]; + indices=new int[size]; + times=new long[size]; } public int numEvents() { @@ -35,7 +44,7 @@ public class Transaction { return events[index]; } - public int getTime(int index) { + public long getTime(int index) { return times[index]; } @@ -43,15 +52,30 @@ public class Transaction { return objects[index]; } + public int getIndex(int index) { + return indices[index]; + } + + public ObjIndex getObjIndex(int index) { + int obj=objects[index]; + if (obj==-1) + return null; + return new ObjIndex(obj, indices[index]); + } + public void setEvent(int index, int val) { events[index]=val; } - public void setTime(int index, int val) { + public void setTime(int index, long val) { times[index]=val; } public void setObject(int index, int val) { objects[index]=val; } + + public void setIndex(int index, int val) { + indices[index]=val; + } } \ No newline at end of file -- 2.34.1