generate stats in runtime. Use -stmstats option for compiling
authoradash <adash>
Sat, 25 Apr 2009 01:51:45 +0000 (01:51 +0000)
committeradash <adash>
Sat, 25 Apr 2009 01:51:45 +0000 (01:51 +0000)
Robust/src/Benchmarks/Prefetch/ManualPrefetch/2DConv/ConvolutionSizeC.java
Robust/src/Benchmarks/Prefetch/ManualPrefetch/2DFFT/fft2d.java
Robust/src/Benchmarks/SingleTM/KMeans/makefile
Robust/src/IR/Flat/BuildCode.java
Robust/src/Runtime/STM/stm.c
Robust/src/Runtime/STM/tm.h
Robust/src/Runtime/runtime.c
Robust/src/buildscript

index 089bb89e4fbb6ee5afc3f170c1599b983501feb9..64ecea458129285069a68c9bf360cd8dbb3d0031 100644 (file)
@@ -66,7 +66,7 @@ public class Convolution extends Thread {
 
       int l=14;
       for(int i=x0;i<x1;i++,l++){
-        if((l&31) == 0) {  //prefetch every 16th iteration
+        if((l&31) == 0) {  //prefetch every 32th iteration
           //Prefetch this.img.inputImage[] 
           offsets2[0] = (short) (l+x0);
           offsets2[1] = (short) 31;
index b4505f2f1ab5a4cafb30d24c1835f34f4a97a22d..45b11c339ed84a2e2626d2dbe4090e1f8f0020b6 100644 (file)
@@ -117,7 +117,7 @@ public class fft2d extends Thread {
       transtempIm = data1.dataIm;
       int l=8;
       for (int j = start; j < end; j++,l++) {
-         if ((l&15)==0) {
+         if ((l&15)==0) {  //prefetch every 16th iteration
              offsets1[0]=(short) (l+start);
              if ((start+l+16)>=end) {
                  int t=end-start-l-1;
index d831827ff42866231b4324baa9e42f1f91fa5d0c..ea240770ea2e0b2602da6fca49aaa545a0dd3dad 100644 (file)
@@ -6,7 +6,8 @@ SRC=${MAINCLASS}.java \
     Common.java \
     GlobalArgs.java \
     ../../../ClassLibrary/JavaSTM/Barrier.java
-FLAGS=-mainclass ${MAINCLASS} -singleTM -optimize -debug -dcopts -transstats -profile -joptimize -profile
+FLAGS=-mainclass ${MAINCLASS} -singleTM -optimize -debug -dcopts -transstats -joptimize -stmdebug -stmstats
+
 default:
        ../../../buildscript ${FLAGS} -o ${MAINCLASS} ${SRC}
 
index e3791fe66ef94a12351c78b6aeb27d9706df06ac..86a790b158356d0fd6239c2d7b371a7a4fb019eb 100644 (file)
@@ -241,6 +241,11 @@ public class BuildCode {
     }
     if (state.THREAD||state.DSM||state.SINGLETM) {
       outmethod.println("initializethreads();");
+      outmethod.println("#ifdef STMSTATS \n");
+      outmethod.println(" for(i=0; i<TOTALNUMCLASSANDARRAY; i++) {\n");
+      outmethod.println("   typesCausingAbort[i] = 0;\n");
+      outmethod.println(" }\n");
+      outmethod.println("#endif\n");
     }
     if (state.DSM) {
       outmethod.println("if (dstmStartup(argv[1])) {");
@@ -322,6 +327,10 @@ public class BuildCode {
       } else if (state.SINGLETM) {
          outmethod.println("printf(\"nSoftAbortAbort= %d\\n\", nSoftAbortAbort);");
          outmethod.println("printf(\"nSoftAbortCommit= %d\\n\", nSoftAbortCommit);");
+      outmethod.println("for(i=0; i<TOTALNUMCLASSANDARRAY; i++) {\n");
+      outmethod.println("  printf(\"typesCausingAbort[%d]= %d\\n\", i, typesCausingAbort[i]);\n");
+      outmethod.println("}\n");
+      outmethod.println("fflush(stdout);");
       }
       outmethod.println("#endif\n");
     }
@@ -476,6 +485,8 @@ public class BuildCode {
                        (state.getArrayNumber((new TypeDescriptor(TypeDescriptor.BYTE)).makeArray(state).makeArray(state))+state.numClasses()));
 
     outstructs.println("#define NUMCLASSES "+state.numClasses());
+    int totalClassSize = state.numClasses() + state.numArrays();
+    outstructs.println("#define TOTALNUMCLASSANDARRAY "+ totalClassSize);
     if (state.TASK) {
       outstructs.println("#define STARTUPTYPE "+typeutil.getClass(TypeUtil.StartupClass).getId());
       outstructs.println("#define TAGTYPE "+typeutil.getClass(TypeUtil.TagClass).getId());
@@ -823,6 +834,7 @@ public class BuildCode {
     } else if (state.SINGLETM) {
        outclassdefs.println("extern int nSoftAbortAbort;");
        outclassdefs.println("extern int nSoftAbortCommit;");
+       outclassdefs.println("extern int typesCausingAbort[];");
     }
     outclassdefs.print("#endif\n");
     outclassdefs.print("int numprefetchsites = " + pa.prefetchsiteid + ";\n");
@@ -841,6 +853,7 @@ public class BuildCode {
       outclassdefs.print("sizeof(struct "+cdarray[i].getSafeSymbol()+")");
       needcomma=true;
     }
+    
 
     arraytable=new TypeDescriptor[state.numArrays()];
 
index b00c3602599703789baa47713ec33041845c0690..2d92cbd2bb5dbfc9245d5f84c5a4e62a19359b71 100644 (file)
@@ -23,6 +23,17 @@ int numTransAbort = 0;
 int nSoftAbort = 0;
 int nSoftAbortCommit = 0;
 int nSoftAbortAbort = 0;
+int typesCausingAbort[TOTALNUMCLASSANDARRAY];
+#endif
+
+#ifdef STMSTATS
+/******Keep track of objects and types causing aborts******/
+#define DEBUGSTMSTAT(args...) { \
+  printf(args); \
+  fflush(stdout); \
+}
+#else
+#define DEBUGSTMSTAT(args...)
 #endif
 
 #ifdef STMDEBUG
@@ -193,6 +204,9 @@ __attribute__((pure)) void *transRead(void * oid) {
   size += sizeof(objheader_t);
   objcopy = (objheader_t *) objstrAlloc(size);
   memcpy(objcopy, header, size);
+#ifdef STMSTATS
+  header->accessCount++;
+#endif
   /* Insert into cache's lookup table */
   STATUS(objcopy)=0;
   t_chashInsert(oid, &objcopy[1]);
@@ -322,7 +336,12 @@ int traverseCache() {
          } else { 
            oidwrlocked[numoidwrlocked++] = OID(header);
            transAbortProcess(oidwrlocked, numoidwrlocked);
+#ifdef STMSTATS
+        header->abortCount++;
+        (typesCausingAbort[TYPE(header)])++;
+#endif
            DEBUGSTM("WR Abort: rd: %u wr: %u tot: %u type: %u ver: %u\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version);
+        DEBUGSTMSTAT("WR Abort: Access Count: %u AbortCount: %u type: %u ver: %u \n", header->accessCount, header->abortCount, TYPE(header), header->version);
            if (c_numelements>=200) {
              free(oidrdlocked);
              free(oidrdversion);
@@ -331,12 +350,17 @@ int traverseCache() {
            return TRANS_ABORT;
          }
        } else { /* cannot aquire lock */
+#ifdef STMSTATS
+        header->abortCount++;
+        (typesCausingAbort[TYPE(header)])++;
+#endif
          if(version == header->version) {
            /* versions match */
            softabort=1;
          } else {
            transAbortProcess(oidwrlocked, numoidwrlocked);
            DEBUGSTM("WR Abort: rd: %u wr: %u tot: %u type: %u ver: %u\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version);
+        DEBUGSTMSTAT("WR Abort: Access Count: %u AbortCount: %u type: %u ver: %u \n", header->accessCount, header->abortCount, TYPE(header), header->version);
            if (c_numelements>=200) {
              free(oidrdlocked);
              free(oidrdversion);
@@ -363,7 +387,12 @@ int traverseCache() {
       if(version != header->version) {/* versions do not match */
        oidrdlocked[numoidrdlocked++] = OID(header);
        transAbortProcess(oidwrlocked, numoidwrlocked);
+#ifdef STMSTATS
+        header->abortCount++;
+        (typesCausingAbort[TYPE(header)])++;
+#endif
        DEBUGSTM("RD Abort: rd: %u wr: %u tot: %u type: %u ver: %u\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version);
+    DEBUGSTMSTAT("RD Abort: Access Count: %u AbortCount: %u type: %u ver: %u \n", header->accessCount, header->abortCount, TYPE(header), header->version);
        if (c_numelements>=200) {
          free(oidrdlocked);
          free(oidrdversion);
@@ -372,12 +401,17 @@ int traverseCache() {
        return TRANS_ABORT;
       }
     } else { /* cannot aquire lock */
+#ifdef STMSTATS
+        header->abortCount++;
+        (typesCausingAbort[TYPE(header)])++;
+#endif
       //do increment as we didn't get lock
       if(version == header->version) {
        softabort=1;
       } else {
        transAbortProcess(oidwrlocked, numoidwrlocked);
        DEBUGSTM("RD Abort: rd: %u wr: %u tot: %u type: %u ver: %u\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version);
+    DEBUGSTMSTAT("RD Abort: Access Count: %u AbortCount: %u type: %u ver: %u \n", header->accessCount, header->abortCount, TYPE(header), header->version);
        if (c_numelements>=200) {
          free(oidrdlocked);
          free(oidrdversion);
@@ -411,7 +445,7 @@ int traverseCache() {
 }
 
 /* ==================================================
- * traverseCache
+ * alttraverseCache
  * - goes through the transaction cache and
  * - decides if a transaction should commit or abort
  * ==================================================
@@ -455,7 +489,12 @@ int alttraverseCache() {
        } else { 
          oidwrlocked[numoidwrlocked++] = OID(header);
          transAbortProcess(oidwrlocked, numoidwrlocked);
+#ifdef STMSTATS
+        header->abortCount++;
+        (typesCausingAbort[TYPE(header)])++;
+#endif
          DEBUGSTM("WR Abort: rd: %u wr: %u tot: %u type: %u ver: %u\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version);
+      DEBUGSTMSTAT("WR Abort: Access Count: %u AbortCount: %u type: %u ver: %u \n", header->accessCount, header->abortCount, TYPE(header), header->version);
          if (c_numelements>=200) {
            free(oidrdlocked);
            free(oidrdversion);
@@ -469,7 +508,12 @@ int alttraverseCache() {
          softabort=1;
        } else {
          transAbortProcess(oidwrlocked, numoidwrlocked);
+#ifdef STMSTATS
+        header->abortCount++;
+        (typesCausingAbort[TYPE(header)])++;
+#endif
          DEBUGSTM("WR Abort: rd: %u wr: %u tot: %u type: %u ver: %u\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version);
+      DEBUGSTMSTAT("WR Abort: Access Count: %u AbortCount: %u type: %u ver: %u \n", header->accessCount, header->abortCount, TYPE(header), header->version);
          if (c_numelements>=200) {
            free(oidrdlocked);
            free(oidrdversion);
@@ -492,7 +536,12 @@ int alttraverseCache() {
     if(header->lock>=0) {
       if(version != header->version) {
        transAbortProcess(oidwrlocked, numoidwrlocked);
+#ifdef STMSTATS
+        header->abortCount++;
+        (typesCausingAbort[TYPE(header)])++;
+#endif
        DEBUGSTM("RD Abort: rd: %u wr: %u tot: %u type: %u ver: %u\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version);
+    DEBUGSTMSTAT("RD Abort: Access Count: %u AbortCount: %u type: %u ver: %u \n", header->accessCount, header->abortCount, TYPE(header), header->version);
        if (c_numelements>=200) {
          free(oidrdlocked);
          free(oidrdversion);
@@ -501,11 +550,16 @@ int alttraverseCache() {
        return TRANS_ABORT;
       }
     } else { /* cannot aquire lock */
+#ifdef STMSTATS
+        header->abortCount++;
+        (typesCausingAbort[TYPE(header)])++;
+#endif
       if(version == header->version) {
        softabort=1;
       } else {
        transAbortProcess(oidwrlocked, numoidwrlocked);
        DEBUGSTM("RD Abort: rd: %u wr: %u tot: %u type: %u ver: %u\n", numoidrdlocked, numoidwrlocked, c_numelements, TYPE(header), header->version);
+    DEBUGSTMSTAT("RD Abort: Access Count: %u AbortCount: %u type: %u ver: %u \n", header->accessCount, header->abortCount, TYPE(header), header->version);
        if (c_numelements>=200) {
          free(oidrdlocked);
          free(oidrdversion);
index c51ab03d33ffad5f160de5950bf7f80d32ab5679..8579375e11c7b436a59ccfce4d065692df0cffdf 100644 (file)
@@ -43,6 +43,8 @@
 typedef struct objheader {
   unsigned int version;
   unsigned int lock;
+  int abortCount;
+  int accessCount;
 } objheader_t;
 
 #define OID(x) \
@@ -129,6 +131,7 @@ extern int numTransAbort;
 extern int nSoftAbort;
 extern int nSoftAbortAbort;
 extern int nSoftAbortCommit;
+extern int typesCausingAbort[];
 #endif
 
 /* ================================
index f4188ac464aa82340265cb971a4fedf5f8b349c9..abbac360de0ab4cf569ef9d0d8d10436720a7c06 100644 (file)
@@ -113,6 +113,10 @@ void CALL11(___System______exit____I,int ___status___, int ___status___) {
 #ifdef STM
   printf("nSoftAbortCommit = %d\n", nSoftAbortCommit);
   printf("nSoftAbortAbort = %d\n", nSoftAbortAbort);
+  int i;
+  for(i=0; i<TOTALNUMCLASSANDARRAY; i++) {
+    printf("typesCausingAbort[%d]= %d\n", i, typesCausingAbort[i]);
+  }
 #endif
 #endif
   exit(___status___);
index 8242ff842825c5e5aec06fe7ce5f36ad99735580..60545a12b166ab16c1f81d18b1ddc2a7bd7498bb 100755 (executable)
@@ -159,6 +159,9 @@ SINGLETM=true
 elif [[ $1 = '-stmdebug' ]]
 then
 EXTRAOPTIONS="$EXTRAOPTIONS -DSTMDEBUG"
+elif [[ $1 = '-stmstats' ]]
+then
+EXTRAOPTIONS="$EXTRAOPTIONS -DSTMSTATS"
 elif [[ $1 = '-prefetch' ]]
 then
 JAVAOPTS="$JAVAOPTS -prefetch"