patches to:
authorbdemsky <bdemsky>
Tue, 15 Apr 2008 05:03:56 +0000 (05:03 +0000)
committerbdemsky <bdemsky>
Tue, 15 Apr 2008 05:03:56 +0000 (05:03 +0000)
1) fix locality analysis bug
2) remove work around from em3d
3) rewrite em3d parsing
4) generate syntactically good code for native method calls inside atomic regions...no guarantees about whether the code is safe...

Robust/src/Analysis/Locality/LocalityAnalysis.java
Robust/src/Benchmarks/Prefetch/Em3d/dsm/BiGraph.java
Robust/src/Benchmarks/Prefetch/Em3d/dsm/Em3d.java
Robust/src/IR/Flat/BuildCode.java

index 3e061bddd4d7def79f70256475e2e3d68b1ab8e7..7cec933f555f9c5611daa3a1be68771d1214a5f6 100644 (file)
@@ -14,12 +14,14 @@ public class LocalityAnalysis {
     Stack lbtovisit;
     Hashtable<LocalityBinding,LocalityBinding> discovered;
     Hashtable<LocalityBinding, Set<LocalityBinding>> dependence;
+    Hashtable<LocalityBinding, Set<LocalityBinding>> calldep;
     Hashtable<LocalityBinding, Hashtable<FlatNode,Hashtable<TempDescriptor, Integer>>> temptab;
     Hashtable<LocalityBinding, Hashtable<FlatNode, Integer>> atomictab;
     Hashtable<LocalityBinding, Hashtable<FlatAtomicEnterNode, Set<TempDescriptor>>> tempstosave;
     Hashtable<ClassDescriptor, Set<LocalityBinding>> classtolb;
     Hashtable<MethodDescriptor, Set<LocalityBinding>> methodtolb;
     private LocalityBinding lbmain;
+    private LocalityBinding lbrun;
 
     CallGraph callgraph;
     TypeUtil typeutil;
@@ -33,6 +35,7 @@ public class LocalityAnalysis {
        this.state=state;
        this.discovered=new Hashtable<LocalityBinding,LocalityBinding>();
        this.dependence=new Hashtable<LocalityBinding, Set<LocalityBinding>>();
+       this.calldep=new Hashtable<LocalityBinding, Set<LocalityBinding>>();
        this.temptab=new Hashtable<LocalityBinding, Hashtable<FlatNode,Hashtable<TempDescriptor, Integer>>>();
        this.atomictab=new Hashtable<LocalityBinding, Hashtable<FlatNode, Integer>>();
        this.lbtovisit=new Stack();
@@ -160,6 +163,34 @@ public class LocalityAnalysis {
     private void doAnalysis() {
        computeLocalityBindings();
        computeTempstoSave();
+       cleanSets();
+    }
+
+    private void cleanSets() {
+       HashSet<LocalityBinding> lbset=new HashSet<LocalityBinding>();
+       Stack<LocalityBinding> lbstack=new Stack<LocalityBinding>();
+       lbstack.add(lbmain);
+       lbstack.add(lbrun);
+       lbset.add(lbmain);
+       lbset.add(lbrun);
+       while(!lbstack.isEmpty()) {
+           LocalityBinding lb=lbstack.pop();
+           if (calldep.containsKey(lb)) {
+               Set<LocalityBinding> set=new HashSet<LocalityBinding>();
+               set.addAll(calldep.get(lb));
+               set.removeAll(lbset);
+               lbstack.addAll(set);
+               lbset.addAll(set);
+           }
+       }
+       for(Iterator<LocalityBinding> lbit=discovered.keySet().iterator();lbit.hasNext();) {
+           LocalityBinding lb=lbit.next();
+           if (!lbset.contains(lb)) {
+               lbit.remove();
+               classtolb.get(lb.getMethod().getClassDesc()).remove(lb);
+               methodtolb.get(lb.getMethod()).remove(lb);
+           }
+       }
     }
     
     private void computeLocalityBindings() {
@@ -177,7 +208,7 @@ public class LocalityAnalysis {
        methodtolb.get(lbmain.getMethod()).add(lbmain);
 
        //Do this to force a virtual table number for the run method
-       LocalityBinding lbrun=new LocalityBinding(typeutil.getRun(), false);
+       lbrun=new LocalityBinding(typeutil.getRun(), false);
        lbrun.setGlobalReturn(EITHER);
        lbrun.setGlobalThis(GLOBAL);
        lbtovisit.add(lbrun);
@@ -196,6 +227,7 @@ public class LocalityAnalysis {
            MethodDescriptor md=lb.getMethod();
            Hashtable<FlatNode,Hashtable<TempDescriptor, Integer>> temptable=new Hashtable<FlatNode,Hashtable<TempDescriptor, Integer>>();
            Hashtable<FlatNode, Integer> atomictable=new Hashtable<FlatNode, Integer>();
+           calldep.remove(lb);
            try {
                computeCallsFlags(md, lb, temptable, atomictable);
            } catch (Error e) {
@@ -427,6 +459,10 @@ public class LocalityAnalysis {
            if (!dependence.containsKey(lb))
                dependence.put(lb, new HashSet<LocalityBinding>());
            dependence.get(lb).add(currlb);
+
+           if (!calldep.containsKey(currlb))
+               calldep.put(currlb, new HashSet<LocalityBinding>());
+           calldep.get(currlb).add(lb);
        }
        if (fc.getReturnTemp()!=null) {
            currtable.put(fc.getReturnTemp(), currreturnval);
index b92fe89f7f5e86d5e8e78314ecec716ac0171855..f577de74bb7a86b14fe35efbcc01f1d9ed6beeeb 100644 (file)
@@ -41,14 +41,8 @@ public class BiGraph
 
     // making nodes (we create a table)
     //if (verbose) System.printString("making nodes (tables in orig. version)");
-    Node[] hTable = global new Node[1];
-
-    Node[] eTable = global new Node[1];
-
-    if (true) {
-       eTable=Node.fillTable(numNodes, numDegree, r);
-       hTable=Node.fillTable(numNodes, numDegree, r);
-    }
+    Node [] eTable=Node.fillTable(numNodes, numDegree, r);
+    Node [] hTable=Node.fillTable(numNodes, numDegree, r);
 
     // making neighbors
     //if (verbose) System.printString("updating from and coeffs");
index 7e2e23e2758e48bb2c2b8d020d668100c6d60ca5..644a283dd7e33296fc3eb64f2f570ea39ea691e9 100644 (file)
@@ -116,9 +116,10 @@ public class Em3d extends Thread
   {
     Em3d em;
     atomic {
-      em = global new Em3d();
-      em.parseCmdLine(args, em);
+       em = global new Em3d();
     }
+    Em3d.parseCmdLine(args, em);
+    
     boolean printMsgs, printResult;
     int numIter;
     atomic {
@@ -200,7 +201,7 @@ public class Em3d extends Thread
    * @param args the command line options.
    **/
 
-  public void parseCmdLine(String args[], Em3d em)
+  public static void parseCmdLine(String args[], Em3d em)
   {
     int i = 0;
     String arg;
@@ -211,11 +212,15 @@ public class Em3d extends Thread
       // check for options that require arguments
       if (arg.equals("-n")) {
         if (i < args.length) {
-          em.numNodes = new Integer(args[i++]).intValue();
+           atomic {
+               em.numNodes = new Integer(args[i++]).intValue();
+           }
         }
       } else if (arg.equals("-d")) {
         if (i < args.length) {
-          em.numDegree = new Integer(args[i++]).intValue();
+           atomic {
+               em.numDegree = new Integer(args[i++]).intValue();
+           }
         }
       } else if (arg.equals("-i")) {
         if (i < args.length) {
@@ -224,9 +229,13 @@ public class Em3d extends Thread
           }
         }
       } else if (arg.equals("-p")) {
-        em.printResult = true;
+         atomic {
+             em.printResult = true;
+         }
       } else if (arg.equals("-m")) {
-        em.printMsgs = true;
+         atomic {
+             em.printMsgs = true;
+         }
       } else if (arg.equals("-h")) {
         //em.usage();
       }
index 84565ce1cae57b9d24e6533e3bcdffce3e913014..c22122c1e1b121f4cf2ed562565e6759730ae638 100644 (file)
@@ -1114,7 +1114,7 @@ public class BuildCode {
            printcomma=true;
        }
        
-       if (state.DSM&&lb.isAtomic()) {
+       if (state.DSM&&lb.isAtomic()&&!md.getModifiers().isNative()) {
            if (printcomma)
                headersout.print(", ");
            headersout.print("transrecord_t * trans");
@@ -1781,7 +1781,7 @@ public class BuildCode {
            needcomma=true;
        }
 
-       if (state.DSM&&locality.getBinding(lb,fc).isAtomic()) {
+       if (state.DSM&&locality.getBinding(lb,fc).isAtomic()&&!fc.getMethod().getModifiers().isNative()) {
            if (needcomma)
                output.print(",");
            output.print("trans");
@@ -2016,9 +2016,7 @@ public class BuildCode {
                output.println(dst+"->"+nextobjstr+"="+revertptr+";");
                output.println("trans->revertlist=(struct ___Object___ *)"+dst+";");
                output.println("}");
-           } else {
-               throw new Error("Unknown array type in"+fsen+" in " + fm+"\n"+(lb!=null?(lb+" "+lb.getExplanation()):""));
-           }
+           } else throw new Error("Unknown array type");
            if (srcglobal) {
                output.println("{");
                String src=generateTemp(fm, fsen.getSrc(), lb);