Random r;
ThreadClass[] threads;
+ public String toString() {
+ String s="";
+ for(int i=0;i<numThreads;i++)
+ s+=threads[i].toString();
+
+ return s;
+ }
+
+
public Executor(int numThreads, int numTrans, int deltaTrans, int numObjects, int numAccesses, int deltaAccesses, int readPercent, int delay, int deltaDelay, int nonTrans, int deltaNonTrans) {
this.numThreads=numThreads;
this.numTrans=numTrans;
int accesses=getRandom(numAccesses, deltaAccesses);
Transaction t=new Transaction(accesses);
int time=0;
- for(int i=0;i<accesses; i++) {
+ for(int i=0;i<(accesses-1); i++) {
boolean isRead=r.nextInt(100)<readPercent;
time+=getRandom(delay, deltaDelay);
int object=r.nextInt(numObjects);
else
t.setEvent(i, Transaction.WRITE);
}
+ t.setEvent(accesses-1, Transaction.DELAY);
+ t.setObject(accesses-1, Transaction.DELAY);
+ time+=getRandom(delay, deltaDelay);
+ t.setTime(accesses-1, time);
+
return t;
}
int newstart=lastwr[step][evobject]-evtime;
if (newstart>starttime)
starttime=newstart;
- newstart=lastrd[step][evobject]-evtime;
+
+ newstart=lastrd[step][evobject]-trans.getTime(trans.numEvents()-1);
if (newstart>starttime)
starttime=newstart;
break;
if (!lgood||step==lastEvent) {
//go backwards
+ step--;
for(;step>=0;step--) {
//check for delay transaction...just skip them
Transaction oldtrans=e.getThread(turn[step]).getTransaction(schedule[0][turn[step]]-schedule[step][turn[step]]);
iturn=turn[step]+1;
for(;iturn<e.numThreads();iturn++) {
- if (schedule[step][iturn]>0) {
- if (step==0)
- break;
-
- int lastturn=turn[step-1];
- if (iturn<lastturn) {
- Transaction trans1=e.getThread(lastturn).getTransaction(schedule[0][iturn]-schedule[step][iturn]);
- Transaction trans2=e.getThread(iturn).getTransaction(schedule[0][lastturn]-schedule[step-1][lastturn]);
- if (checkConflicts(trans1, trans2))
- break;
- } else
- break;
- }
+ if (schedule[step][iturn]>0)
+ break;
}
if (iturn<e.numThreads()) {
//found something to iterate
public class TransSim {
public static void main(String[] args) {
- int numThreads=4;
- int numTrans=8;
+ int numThreads=32;
+ int numTrans=100;
int deltaTrans=0;
- int numObjects=10;
- int numAccesses=4;
- int deltaAccesses=2;
- int readPercent=50;
+ int numObjects=500;
+ int numAccesses=20;
+ int deltaAccesses=5;
+ int readPercent=30;
//time for operation
int delay=20;
int deltaDelay=4;
//time between transactions
int nonTrans=20;
int deltaNonTrans=4;
- Executor e=new Executor(numThreads, numTrans, deltaTrans, numObjects, numAccesses, deltaAccesses, readPercent, delay, deltaDelay, nonTrans, deltaNonTrans);
- System.out.println(e.maxTime());
- FlexScheduler ls=new FlexScheduler(e, FlexScheduler.LAZY);
- ls.dosim();
- System.out.println("Lazy Time="+ls.getTime());
- System.out.println("Aborts="+ls.getAborts()+" Commit="+ls.getCommits());
- int besttime=ls.getTime();
- //Kill others at commit
- ls=new FlexScheduler(e, FlexScheduler.COMMIT);
- ls.dosim();
- System.out.println("Fast Abort="+ls.getTime());
- System.out.println("Aborts="+ls.getAborts()+" Commit="+ls.getCommits());
- if (ls.getTime()<besttime)
- besttime=ls.getTime();
+ long tlazy=0, tcommit=0, tattack=0, tpolite=0, tkarma=0;
+ for(int i=0;i<100;i++) {
+ Executor e=new Executor(numThreads, numTrans, deltaTrans, numObjects, numAccesses, deltaAccesses, readPercent, delay, deltaDelay, nonTrans, deltaNonTrans);
+ System.out.println(e.maxTime());
+ FlexScheduler ls=new FlexScheduler(e, FlexScheduler.LAZY);
+ ls.dosim();
+ System.out.println("Lazy Time="+ls.getTime());
+ System.out.println("Aborts="+ls.getAborts()+" Commit="+ls.getCommits());
+ int besttime=ls.getTime();
+ tlazy+=ls.getTime();
- //Eager attack
- ls=new FlexScheduler(e, FlexScheduler.ATTACK);
- ls.dosim();
- System.out.println("Attack Abort="+ls.getTime());
- System.out.println("Aborts="+ls.getAborts()+" Commit="+ls.getCommits());
- if (ls.getTime()<besttime)
- besttime=ls.getTime();
+ //Kill others at commit
+ ls=new FlexScheduler(e, FlexScheduler.COMMIT);
+ ls.dosim();
+ System.out.println("Fast Abort="+ls.getTime());
+ System.out.println("Aborts="+ls.getAborts()+" Commit="+ls.getCommits());
+ if (ls.getTime()<besttime)
+ besttime=ls.getTime();
+ tcommit+=ls.getTime();
+
+ //Eager attack
+ ls=new FlexScheduler(e, FlexScheduler.ATTACK);
+ ls.dosim();
+ System.out.println("Attack Abort="+ls.getTime());
+ System.out.println("Aborts="+ls.getAborts()+" Commit="+ls.getCommits());
+ if (ls.getTime()<besttime)
+ besttime=ls.getTime();
+ tattack+=ls.getTime();
- //Eager polite
- ls=new FlexScheduler(e, FlexScheduler.POLITE);
- ls.dosim();
- System.out.println("Polite Abort="+ls.getTime());
- System.out.println("Aborts="+ls.getAborts()+" Commit="+ls.getCommits());
- if (ls.getTime()<besttime)
- besttime=ls.getTime();
-
- //Karma
- ls=new FlexScheduler(e, FlexScheduler.KARMA);
- ls.dosim();
- System.out.println("Karma Abort="+ls.getTime());
- System.out.println("Aborts="+ls.getAborts()+" Commit="+ls.getCommits());
- if (ls.getTime()<besttime)
- besttime=ls.getTime();
+ //Eager polite
+ ls=new FlexScheduler(e, FlexScheduler.POLITE);
+ ls.dosim();
+ System.out.println("Polite Abort="+ls.getTime());
+ System.out.println("Aborts="+ls.getAborts()+" Commit="+ls.getCommits());
+ if (ls.getTime()<besttime)
+ besttime=ls.getTime();
+ tpolite+=ls.getTime();
- Scheduler s=new Scheduler(e, besttime);
- s.dosim();
- System.out.println("Optimal Time="+s.getTime());
+ //Karma
+ ls=new FlexScheduler(e, FlexScheduler.KARMA);
+ ls.dosim();
+ System.out.println("Karma Abort="+ls.getTime());
+ System.out.println("Aborts="+ls.getAborts()+" Commit="+ls.getCommits());
+ if (ls.getTime()<besttime)
+ besttime=ls.getTime();
+ tkarma+=ls.getTime();
+ // Scheduler s=new Scheduler(e, besttime);
+ //s.dosim();
+ //System.out.println("Optimal Time="+s.getTime());
+ }
+ System.out.println("lazy="+tlazy);
+ System.out.println("commit="+tcommit);
+ System.out.println("attack="+tattack);
+ System.out.println("polite="+tpolite);
+ System.out.println("karma="+tkarma);
}
}
\ No newline at end of file