From 905f27b44e37535f39a5c968a3fda534e7b652de Mon Sep 17 00:00:00 2001 From: bdemsky Date: Tue, 15 Apr 2008 05:03:56 +0000 Subject: [PATCH] patches to: 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... --- .../Analysis/Locality/LocalityAnalysis.java | 38 ++++++++++++++++++- .../Benchmarks/Prefetch/Em3d/dsm/BiGraph.java | 10 +---- .../Benchmarks/Prefetch/Em3d/dsm/Em3d.java | 23 +++++++---- Robust/src/IR/Flat/BuildCode.java | 8 ++-- 4 files changed, 58 insertions(+), 21 deletions(-) diff --git a/Robust/src/Analysis/Locality/LocalityAnalysis.java b/Robust/src/Analysis/Locality/LocalityAnalysis.java index 3e061bdd..7cec933f 100644 --- a/Robust/src/Analysis/Locality/LocalityAnalysis.java +++ b/Robust/src/Analysis/Locality/LocalityAnalysis.java @@ -14,12 +14,14 @@ public class LocalityAnalysis { Stack lbtovisit; Hashtable discovered; Hashtable> dependence; + Hashtable> calldep; Hashtable>> temptab; Hashtable> atomictab; Hashtable>> tempstosave; Hashtable> classtolb; Hashtable> 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(); this.dependence=new Hashtable>(); + this.calldep=new Hashtable>(); this.temptab=new Hashtable>>(); this.atomictab=new Hashtable>(); this.lbtovisit=new Stack(); @@ -160,6 +163,34 @@ public class LocalityAnalysis { private void doAnalysis() { computeLocalityBindings(); computeTempstoSave(); + cleanSets(); + } + + private void cleanSets() { + HashSet lbset=new HashSet(); + Stack lbstack=new Stack(); + lbstack.add(lbmain); + lbstack.add(lbrun); + lbset.add(lbmain); + lbset.add(lbrun); + while(!lbstack.isEmpty()) { + LocalityBinding lb=lbstack.pop(); + if (calldep.containsKey(lb)) { + Set set=new HashSet(); + set.addAll(calldep.get(lb)); + set.removeAll(lbset); + lbstack.addAll(set); + lbset.addAll(set); + } + } + for(Iterator 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> temptable=new Hashtable>(); Hashtable atomictable=new Hashtable(); + 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()); dependence.get(lb).add(currlb); + + if (!calldep.containsKey(currlb)) + calldep.put(currlb, new HashSet()); + calldep.get(currlb).add(lb); } if (fc.getReturnTemp()!=null) { currtable.put(fc.getReturnTemp(), currreturnval); diff --git a/Robust/src/Benchmarks/Prefetch/Em3d/dsm/BiGraph.java b/Robust/src/Benchmarks/Prefetch/Em3d/dsm/BiGraph.java index b92fe89f..f577de74 100644 --- a/Robust/src/Benchmarks/Prefetch/Em3d/dsm/BiGraph.java +++ b/Robust/src/Benchmarks/Prefetch/Em3d/dsm/BiGraph.java @@ -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"); diff --git a/Robust/src/Benchmarks/Prefetch/Em3d/dsm/Em3d.java b/Robust/src/Benchmarks/Prefetch/Em3d/dsm/Em3d.java index 7e2e23e2..644a283d 100644 --- a/Robust/src/Benchmarks/Prefetch/Em3d/dsm/Em3d.java +++ b/Robust/src/Benchmarks/Prefetch/Em3d/dsm/Em3d.java @@ -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(); } diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java index 84565ce1..c22122c1 100644 --- a/Robust/src/IR/Flat/BuildCode.java +++ b/Robust/src/IR/Flat/BuildCode.java @@ -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); -- 2.34.1