small changes and bug fix for getting stats
authoradash <adash>
Tue, 11 Aug 2009 00:14:58 +0000 (00:14 +0000)
committeradash <adash>
Tue, 11 Aug 2009 00:14:58 +0000 (00:14 +0000)
Robust/src/Benchmarks/SingleTM/MicroBenchmarks/SingleObjectMod.java
Robust/src/Benchmarks/SingleTM/MicroBenchmarks/data.plt
Robust/src/Benchmarks/SingleTM/MicroBenchmarks/run.sh
Robust/src/Runtime/DSTM/interface/trans.c
Robust/src/Runtime/STM/stm.c
Robust/src/Runtime/STM/tm.h
Robust/src/Runtime/thread.c

index 7cac863a66731c835d016d16414e1650ef6fd07b..775d0fe31a9e83fd77240998c876f2c5c301d5ca 100644 (file)
@@ -74,7 +74,7 @@ public class SingleObjectMod extends Thread {
         index = (int)(rand.random_generate() % arrysize);
         // Do computation 1
         for(int j = 0; j<lsize1; j++) {
-          count += j*j;
+          count+=j*j;
         }
         // Only read values from an object
         val = mainobj[index];
index cb1d1407c1d9c9423174111a8c62ac2a7dee4e86..452a396d0e8344e94cf8f45c1dfa3f18a1fcd829 100644 (file)
@@ -1,28 +1,47 @@
 set terminal postscript enhanced eps color
 
 set style data linespoints
-set style fill solid border -1
-set ylabel 'Time in secs'
+set style fill solid
 set grid ytics
-set xrange [0:10]
 
 
 ##### Plot Execution time for 4 threads ########
-set xtics ("5" 0, "100" 1, "360" 2, "560" 3, "760" 4, "7600" 5 , "66000" 6, "76000" 7, "660000" 8, "760000" 9)
-#set title "Execution times for Microbenchmark"
-#set output "ExecTime.eps"
-#set ylabel 'Time in secs'
-#set xlabel 'Desired abort rate for benchmark in %'
-#plot 0.82 title 'No-lock base time', \
-#    "data1.file" using 2 title 'exec time'
+set title "Execution times for Microbenchmark numthreads= 4"
+set output "ExecTime4.eps"
+set ylabel 'Time in secs'
+set xlabel 'Desired abort rate for benchmark in %'
+set yrange [0.43:0.47]
+set style line 1 lt 2 lw 2 pt 3 ps 0.5
+plot 0.46 title 'No-lock base time' linewidth 2, \
+    "run4.data" using 1:2 title 'exec time' linetype 3 linewidth 2
 
+#pause -1
 ##### Plot Target abort rate vs observed rate for 4 threads ########
-set title "Abort Rates for Microbenchmark"
-set output "AbortRate.eps"
+set title "Abort Rates for Microbenchmark(fudge factor= 3, numthreads= 4)"
+set output "AbortRate4.eps"
 set ylabel 'Observed Abort rate in %(numabort+numsoftabort)/numcommit'
 set xlabel 'Desired abort rate for benchmark in %'
-plot 13.172 title 'Base abort rate', \
-    "data1.file" using 3 title 'abort rate'
+plot "run4.txt" using 1:2 with impulse title 'Base abort rate' linewidth 2, \
+    "run4.data" using 1:3 title 'abort rate' linetype 3 linewidth 2
        
+#pause -1
+##### Plot Execution time for 8 threads ########
+set title "Execution times for Microbenchmark numthreads= 8"
+set output "ExecTime8.eps"
+set ylabel 'Time in secs'
+set xlabel 'Desired abort rate for benchmark in %'
+set yrange [1.28:1.38]
+set style line 1 lt 2 lw 2 pt 3 ps 0.5
+plot 1.35 title 'No-lock base time' linewidth 2, \
+    "run8.data" using 1:2 title 'exec time' linetype 3 linewidth 2
 
 #pause -1
+##### Plot Target abort rate vs observed rate for 8 threads ########
+set title "Abort Rates for Microbenchmark(fudge factor= 3, numthreads= 8)"
+set output "AbortRate8.eps"
+set ylabel 'Observed Abort rate in %(numabort+numsoftabort)/numcommit'
+set xlabel 'Desired abort rate for benchmark in %'
+plot "run8.txt" using 1:2 with impulse title 'Base abort rate' linewidth 2, \
+    "run8.data" using 1:3 title 'abort rate' linetype 3 linewidth 2
+#pause -1
index fe27d7f28d851a7323485bda4b14041230518688..8929ef7da6417d1668b20e2cdb112be950cd80b4 100755 (executable)
@@ -1,13 +1,15 @@
 #!/bin/sh
 
-ARGS4="-t 4 -size 4 -l 700000"
-ARGS8="-t 8 -size 4 -l 700000"
+#high contention 4 threads
+ARGS4="-t 4 -size 5 -l 10000 -l1 100 -l2 50000"
+#high contention 8 threads
+ARGS8="-t 8 -size 10 -l 100000 -l1 100 -l2 50000"
 for file in `ls STATS*`
 do
   num=`echo $file | tr -d ".bin" | tr -d "STATSSingleObjectMod"`
   echo $num
-   /usr/bin/time -f "%e" -o /tmp/time ./$file $ARGS4 -o > /tmp/out
-#  /usr/bin/time -f "%e" -o /tmp/time ./$file $ARGS8 -o > /tmp/out
+#  /usr/bin/time -f "%e" -o /tmp/time ./$file $ARGS4 -o > /tmp/out
+  /usr/bin/time -f "%e" -o /tmp/time ./$file $ARGS8 -o > /tmp/out
   t=`cat /tmp/time`
   nTcommit=`grep TransCommit /tmp/out | awk '{print $3}'`
   nTabort=`grep TransAbort /tmp/out | awk '{print $3}'`
index 8e2ba01c518f9ef13931ac1d3b96b8318e9ebd8f..d59cb23aad3f38c826f4c065071e5b1190fa7e83 100644 (file)
@@ -657,7 +657,6 @@ plistnode_t *createPiles() {
 int transCommit() {
   unsigned int tot_bytes_mod, *listmid;
   plistnode_t *pile, *pile_ptr;
-  int trecvcount;
   char treplyretry; /* keeps track of the common response that needs to be sent */
   int firsttime=1;
   trans_commit_data_t transinfo; /* keeps track of objs locked during transaction */
@@ -678,7 +677,6 @@ int transCommit() {
 
 
   do {
-    trecvcount = 0;
     treplyretry = 0;
 
     /* Look through all the objects in the transaction record and make piles
index efc591ddba852ab8c1799286a6ec264fa3050439..f5c9fcc84294a65db2b86269cebbeb3ce7d9012d 100644 (file)
@@ -59,8 +59,10 @@ objtypestat_t typesCausingAbort[TOTALNUMCLASSANDARRAY];
  **/
 INLINE void getTransSize(objheader_t *header , int *isObjTypeTraverse) {
   (typesCausingAbort[TYPE(header)]).numabort++;
-  if(isObjTypeTraverse[TYPE(header)] != 1)
+  if(isObjTypeTraverse[TYPE(header)] != 1) {
     (typesCausingAbort[TYPE(header)]).numaccess+=c_numelements;
+    (typesCausingAbort[TYPE(header)]).numtrans+=1; //should this count be kept per object
+  }
   isObjTypeTraverse[TYPE(header)]=1;
 }
 #define DEBUGSTMSTAT(args...)
@@ -114,11 +116,13 @@ objlockstate_t *objlockscope;
  * Increments the abort count for each object
  **/
 void ABORTCOUNT(objheader_t * x) {
-  float transAbortProb = (PERCENT_ALLOWED_ABORT*FACTOR)/(float)typesCausingAbort[TYPE(x)].numaccess;
+  int avgTransSize = typesCausingAbort[TYPE(x)].numaccess / typesCausingAbort[TYPE(x)].numtrans; 
+  float transAbortProbForObj = (PERCENT_ALLOWED_ABORT*FACTOR)/(float) avgTransSize;
   float ObjAbortProb = x->abortCount/(float) (x->accessCount);
-  DEBUGSTM("ABORTSTATS: oid= %x, transAbortProb= %3.2f, ObjAbortProb= %3.2f, numaccess= %3d, type= %2d, abortCount= %3d, accessCount= %3d\n", OID(x), transAbortProb, ObjAbortProb, typesCausingAbort[TYPE(x)].numaccess, TYPE(x), x->abortCount, x->accessCount);
+  DEBUGSTM("ABORTSTATS: oid= %x, type= %2d, transAbortProb= %2.2f, ObjAbortProb= %2.2f, Typenumaccess= %3d, avgtranssize = %2d, ObjabortCount= %2d, ObjaccessCount= %3d\n", OID(x), TYPE(x), transAbortProbForObj, ObjAbortProb, typesCausingAbort[TYPE(x)].numaccess, avgTransSize, x->abortCount, x->accessCount);
   /* Condition for locking objects */
-  if ((ObjAbortProb > transAbortProb) && (x->riskyflag != 1)) {         
+  if (((ObjAbortProb*100) >= transAbortProbForObj) && (x->riskyflag != 1)) {    
+    DEBUGSTM("AFTER LOCK ABORTSTATS: oid= %x, type= %2d, transAbortProb= %2.2f, ObjAbortProb= %2.2f, Typenumaccess= %3d, avgtranssize = %2d, ObjabortCount= %2d, ObjaccessCount= %3d\n", OID(x), TYPE(x), transAbortProbForObj, ObjAbortProb, typesCausingAbort[TYPE(x)].numaccess, avgTransSize, x->abortCount, x->accessCount);
     //makes riskflag sticky
     pthread_mutex_lock(&lockedobjstore); 
     if (objlockscope->offset<MAXOBJLIST) { 
@@ -579,6 +583,7 @@ int traverseCache() {
         ObjSeqId = headeraddr->accessCount;
            (typesCausingAbort[TYPE(header)]).numabort++;
            (typesCausingAbort[TYPE(header)]).numaccess+=c_numelements;
+        (typesCausingAbort[TYPE(header)]).numtrans+=1; 
         objtypetraverse[TYPE(header)]=1;
         getTotalAbortCount(i+1, size, (void *)(curr->next), numoidrdlocked, oidrdlocked, oidrdversion, oidrdage, ObjSeqId, header, objtypetraverse);
 #endif
@@ -601,6 +606,7 @@ int traverseCache() {
       ObjSeqId = headeraddr->accessCount;
       (typesCausingAbort[TYPE(header)]).numabort++;
       (typesCausingAbort[TYPE(header)]).numaccess+=c_numelements;
+      (typesCausingAbort[TYPE(header)]).numtrans+=1; 
       objtypetraverse[TYPE(header)]=1;
          //(typesCausingAbort[TYPE(header)])++;
 #endif
@@ -666,6 +672,7 @@ int traverseCache() {
       header->abortCount++;
       (typesCausingAbort[TYPE(header)]).numabort++;
       (typesCausingAbort[TYPE(header)]).numaccess+=c_numelements;
+      (typesCausingAbort[TYPE(header)]).numtrans+=1; 
       objtypetraverse[TYPE(header)]=1;
 #endif
 #if defined(STMSTATS)||defined(SOFTABORT)
@@ -704,10 +711,11 @@ int traverseCache() {
     header->abortCount++;
     (typesCausingAbort[TYPE(header)]).numabort++;
     (typesCausingAbort[TYPE(header)]).numaccess+=c_numelements;
+    (typesCausingAbort[TYPE(header)]).numtrans+=1; 
     objtypetraverse[TYPE(header)]=1;
        getReadAbortCount(i+1, numoidrdlocked, oidrdlocked, oidrdversion, oidrdage, ObjSeqId, header, objtypetraverse);
 #endif
-       DEBUGSTM("RD Abort: rd: %u wr: %u tot: %u type: %u ver: %u\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version);
+       DEBUGSTM("RD Abort: rd: %u wr: %u tot: %u type: %u ver: %u oid: %x\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version, OID(header));
        DEBUGSTMSTAT("RD Abort: Access Count: %u AbortCount: %u type: %u ver: %u \n", header->accessCount, header->abortCount, TYPE(header), header->version);
        freearrays;
        return TRANS_ABORT;
@@ -723,10 +731,11 @@ int traverseCache() {
     header->abortCount++;
     (typesCausingAbort[TYPE(header)]).numabort++;
     (typesCausingAbort[TYPE(header)]).numaccess+=c_numelements;
+    (typesCausingAbort[TYPE(header)]).numtrans+=1; 
     objtypetraverse[TYPE(header)]=1;
        getReadAbortCount(i+1, numoidrdlocked, oidrdlocked, oidrdversion, oidrdage, ObjSeqId, header, objtypetraverse);
 #endif
-       DEBUGSTM("RD Abort: rd: %u wr: %u tot: %u type: %u ver: %u\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version);
+       DEBUGSTM("RD Abort: rd: %u wr: %u tot: %u type: %u ver: %u, oid: %x\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version, OID(header));
        DEBUGSTMSTAT("RD Abort: Access Count: %u AbortCount: %u type: %u ver: %u \n", header->accessCount, header->abortCount, TYPE(header), header->version);
        freearrays;
        return TRANS_ABORT;
@@ -747,13 +756,14 @@ int traverseCache() {
       header->abortCount++;
       (typesCausingAbort[TYPE(header)]).numabort++;
       (typesCausingAbort[TYPE(header)]).numaccess+=c_numelements;
+      (typesCausingAbort[TYPE(header)]).numtrans+=1; 
       objtypetraverse[TYPE(header)]=1;
 #endif
 #if defined(STMSTATS)||defined(SOFTABORT)
       if(getReadAbortCount(i+1, numoidrdlocked, oidrdlocked, oidrdversion, oidrdage, ObjSeqId, header, objtypetraverse))
        softabort=0;
 #endif
-      DEBUGSTM("RD Abort: rd: %u wr: %u tot: %u type: %u ver: %u\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version);
+      DEBUGSTM("RD Abort: rd: %u wr: %u tot: %u type: %u ver: %u oid: %x\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version, OID(header));
       DEBUGSTMSTAT("RD Abort: Access Count: %u AbortCount: %u type: %u ver: %u \n", header->accessCount, header->abortCount, TYPE(header), header->version);
       freearrays;
       if (softabort)
@@ -787,7 +797,7 @@ int traverseCache() {
        //if(getTotalAbortCount2((void *) curr->next, numoidrdlocked, oidrdlocked, oidrdversion))
        //  softabort=0;
 #endif
-       DEBUGSTM("WR Abort: rd: %u wr: %u tot: %u type: %u ver: %u\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version);
+       DEBUGSTM("WR Abort: rd: %u wr: %u tot: %u type: %u ver: %u oid: %x\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version, OID(header));
        DEBUGSTMSTAT("WR Abort: Access Count: %u AbortCount: %u type: %u ver: %u \n", header->accessCount, header->abortCount, TYPE(header), header->version);
        freearrays;
        if (softabort)
@@ -839,7 +849,7 @@ int traverseCache() {
       //if(getTotalAbortCount2((void *) curr->next, numoidrdlocked, oidrdlocked, oidrdversion))
        //softabort=0;
 #endif
-      DEBUGSTM("WR Abort: rd: %u wr: %u tot: %u type: %u ver: %u\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version);
+      DEBUGSTM("WR Abort: rd: %u wr: %u tot: %u type: %u ver: %u oid: %x\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version, OID(header));
       DEBUGSTMSTAT("WR Abort: Access Count: %u AbortCount: %u type: %u ver: %u \n", header->accessCount, header->abortCount, TYPE(header), header->version);
       freearrays;
       if (softabort)
@@ -916,10 +926,11 @@ int alttraverseCache() {
       ObjSeqId = headeraddr->accessCount; 
       (typesCausingAbort[TYPE(header)]).numabort++;
       (typesCausingAbort[TYPE(header)]).numaccess+=c_numelements;
+      (typesCausingAbort[TYPE(header)]).numtrans+=1; 
       objtypetraverse[TYPE(header)]=1;
       getTotalAbortCount2((void *) curr->next, numoidrdlocked, oidrdlocked, oidrdversion, oidrdage, ObjSeqId, header, objtypetraverse);
 #endif
-         DEBUGSTM("WR Abort: rd: %u wr: %u tot: %u type: %u ver: %u\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version);
+         DEBUGSTM("WR Abort: rd: %u wr: %u tot: %u type: %u ver: %u oid: %x\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version, OID(header));
          DEBUGSTMSTAT("WR Abort: Access Count: %u AbortCount: %u type: %u ver: %u \n", header->accessCount, header->abortCount, TYPE(header), header->version);
          freearrays;
          return TRANS_ABORT;
@@ -935,13 +946,14 @@ int alttraverseCache() {
     ObjSeqId = headeraddr->accessCount; 
     (typesCausingAbort[TYPE(header)]).numabort++;
     (typesCausingAbort[TYPE(header)]).numaccess+=c_numelements;
+    (typesCausingAbort[TYPE(header)]).numtrans+=1; 
     objtypetraverse[TYPE(header)]=1;
 #endif
 #if defined(STMSTATS)||defined(SOFTABORT)
     if(getTotalAbortCount2((void *) curr->next, numoidrdlocked, oidrdlocked, oidrdversion, oidrdage, ObjSeqId, header, objtypetraverse))
          softabort=0;
 #endif
-       DEBUGSTM("WR Abort: rd: %u wr: %u tot: %u type: %u ver: %u\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version);
+       DEBUGSTM("WR Abort: rd: %u wr: %u tot: %u type: %u ver: %u oid: %x\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version, OID(header));
        DEBUGSTMSTAT("WR Abort: Access Count: %u AbortCount: %u type: %u ver: %u \n", header->accessCount, header->abortCount, TYPE(header), header->version);
        freearrays;
        if (softabort)
@@ -990,13 +1002,14 @@ int alttraverseCache() {
       ObjSeqId = headeraddr->accessCount; 
       (typesCausingAbort[TYPE(header)]).numabort++;
       (typesCausingAbort[TYPE(header)]).numaccess+=c_numelements;
+      (typesCausingAbort[TYPE(header)]).numtrans+=1; 
       objtypetraverse[TYPE(header)]=1;
 #endif
 #if defined(STMSTATS)||defined(SOFTABORT)
       if(getTotalAbortCount2((void *) curr->next, numoidrdlocked, oidrdlocked, oidrdversion, oidrdage, ObjSeqId, header, objtypetraverse))
        softabort=0;
 #endif
-      DEBUGSTM("WR Abort: rd: %u wr: %u tot: %u type: %u ver: %u\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version);
+      DEBUGSTM("WR Abort: rd: %u wr: %u tot: %u type: %u ver: %u oid: %x\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version, OID(header));
       DEBUGSTMSTAT("WR Abort: Access Count: %u AbortCount: %u type: %u ver: %u \n", header->accessCount, header->abortCount, TYPE(header), header->version);
       freearrays;
       if (softabort)
@@ -1027,10 +1040,11 @@ int alttraverseCache() {
     header->abortCount++;
     (typesCausingAbort[TYPE(header)]).numabort++;
     (typesCausingAbort[TYPE(header)]).numaccess+=c_numelements;
+    (typesCausingAbort[TYPE(header)]).numtrans+=1; 
     objtypetraverse[TYPE(header)]=1;
        getReadAbortCount(i+1, numoidrdlocked, oidrdlocked, oidrdversion, oidrdage, ObjSeqId, header, objtypetraverse);
 #endif
-       DEBUGSTM("RD Abort: rd: %u wr: %u tot: %u type: %u ver: %u\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version);
+       DEBUGSTM("RD Abort: rd: %u wr: %u tot: %u type: %u ver: %u oid: %x\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version, OID(header));
        DEBUGSTMSTAT("RD Abort: Access Count: %u AbortCount: %u type: %u ver: %u \n", header->accessCount, header->abortCount, TYPE(header), header->version);
        freearrays;
        return TRANS_ABORT;
@@ -1046,7 +1060,7 @@ int alttraverseCache() {
     header->abortCount++;
        getReadAbortCount(i+1, numoidrdlocked, oidrdlocked, oidrdversion, oidrdage, ObjSeqId, header, objtypetraverse);
 #endif
-       DEBUGSTM("RD Abort: rd: %u wr: %u tot: %u type: %u ver: %u\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version);
+       DEBUGSTM("RD Abort: rd: %u wr: %u tot: %u type: %u ver: %u oid: %x\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version, OID(header));
        DEBUGSTMSTAT("RD Abort: Access Count: %u AbortCount: %u type: %u ver: %u \n", header->accessCount, header->abortCount, TYPE(header), header->version);
        freearrays;
        return TRANS_ABORT;
@@ -1066,6 +1080,7 @@ int alttraverseCache() {
       header->abortCount++;
       (typesCausingAbort[TYPE(header)]).numabort++;
       (typesCausingAbort[TYPE(header)]).numaccess+=c_numelements;
+      (typesCausingAbort[TYPE(header)]).numtrans+=1; 
       objtypetraverse[TYPE(header)]=1;
 #endif
 #if defined(STMSTATS)||defined(SOFTABORT)
index 269fc561e4c2622c9230b50abebe39c174d758f8..8e82527c1cc1eaf9071cdc51bc6834ecbf088ffc 100644 (file)
@@ -152,13 +152,14 @@ extern objlockstate_t *objlockscope;
 pthread_mutex_t lockedobjstore;
 
 typedef struct objtypestat {
-  int numabort;
+  int numabort;         
   int numaccess;
+  int numtrans;    //num of transactions that accessed this object type and aborted
 } objtypestat_t;
 
 /* Variables for probability model */
-#define PERCENT_ALLOWED_ABORT 10
-#define FACTOR 1
+#define PERCENT_ALLOWED_ABORT 60
+#define FACTOR 3
 #endif
 
 
index f851fd1e8fa992ff9f409ee33b3ab19818e33552..b82a6349d877fa866c36b5918543429f0b86a19c 100644 (file)
@@ -200,6 +200,7 @@ void initializethreads() {
     for(i=0; i<TOTALNUMCLASSANDARRAY; i++) {
       typesCausingAbort[i].numabort = 0;
       typesCausingAbort[i].numaccess = 0;
+      typesCausingAbort[i].numtrans = 0;
     }
   }
 #endif