changes.
authoryeom <yeom>
Mon, 26 Jul 2010 22:55:37 +0000 (22:55 +0000)
committeryeom <yeom>
Mon, 26 Jul 2010 22:55:37 +0000 (22:55 +0000)
Robust/src/Benchmarks/oooJava/mergesort/BMergeSort4.java
Robust/src/Benchmarks/oooJava/mergesort/MergeSort.java

index ae7f5c351c7561372c8197ac372116bb40826bf6..74983e95723efbbf8829afe69f7779bf6f0d3095 100644 (file)
@@ -5,18 +5,18 @@
 public class MergeSort4 extends MergeSort {\r
 \r
   public static void main(String[] args) {\r
-    int problemSize= 1048576;\r
-    if(args.length>0){\r
-      problemSize=Integer.parseInt(args[0]);\r
+    int problemSize = 4194304;\r
+    if (args.length > 0) {\r
+      problemSize = Integer.parseInt(args[0]);\r
     }\r
     MergeSort4 sort = new MergeSort4();\r
     sort.run(problemSize);\r
   }\r
-  \r
-  public MergeSort4(){\r
+\r
+  public MergeSort4() {\r
     super();\r
   }\r
-  \r
+\r
   public void runWorkAndTest() {\r
     sese run{\r
       int output[]=sort(input, 0, input.length);\r
@@ -26,165 +26,174 @@ public class MergeSort4 extends MergeSort {
     }\r
   }\r
 \r
-\r
   public int[] serializedSort(int A[], int low, int high) {\r
-    if(A.length<=SERIALIZED_CUT_OFF){\r
-      return serializedSort(A, low, high);\r
-    }else{\r
-      if (A.length <= QUICK_SIZE) {\r
-       int[] R=new int[high-low];\r
-       int max=R.length;\r
-       int j=low;\r
-       for(int i=0;i<max;i++) {\r
-         R[i]=A[j++];\r
-       }\r
-       quickSort(R, 0, R.length);\r
-       return R;\r
-      } else {\r
-       int q = A.length / 4;\r
-  \r
-        int idxs0 = q;\r
-        int idxs1 = 2 * q;\r
-        int idxs2 = 3 * q;\r
-       \r
-       int[] A_quarters0 = serializedSort(A, 0, idxs0);\r
-       int[] A_quarters1 = serializedSort(A, idxs0, idxs1);\r
-       int[] A_quarters2 = serializedSort(A, idxs1, idxs2);\r
-        int[] A_quarters3 = serializedSort(A, idxs2, A.length);\r
-\r
-       int[] R=new int[high-low];\r
-\r
-       merge(A_quarters0, A_quarters1, A_quarters2, A_quartes3, R);\r
-       return R;\r
+\r
+    int length = high - low;\r
+\r
+    if (length <= QUICK_SIZE) {\r
+      int[] R = new int[length];\r
+      int max = R.length;\r
+      int j = low;\r
+      for (int i = 0; i < max; i++) {\r
+        R[i] = A[j++];\r
       }\r
+      quickSort(R, 0, R.length - 1);\r
+      return R;\r
+    } else {\r
+\r
+      int q = length / 4;\r
+      int idxs0 = q + low;\r
+      int idxs1 = (2 * q) + low;\r
+      int idxs2 = (3 * q) + low;\r
+\r
+      int[] A_quarters0 = serializedSort(A, low, idxs0);\r
+      int[] A_quarters1 = serializedSort(A, idxs0, idxs1);\r
+      int[] A_quarters2 = serializedSort(A, idxs1, idxs2);\r
+      int[] A_quarters3 = serializedSort(A, idxs2, idxs2 + q);\r
+\r
+      int[] R = new int[high - low];\r
+\r
+      merge(A_quarters0, A_quarters1, A_quarters2, A_quarters3, R);\r
+      return R;\r
     }\r
   }\r
 \r
   public int[] sort(int A[], int low, int high) {\r
-    if(A.length<=SERIALIZED_CUT_OFF){\r
+    \r
+    int length=high-low;\r
+    \r
+    if (length <= SERIALIZED_CUT_OFF) {\r
       return serializedSort(A, low, high);\r
-    }else{\r
-      if (A.length <= QUICK_SIZE) {\r
-       int[] R=new int[high-low];\r
-       int max=R.length;\r
-       int j=low;\r
-       for(int i=0;i<max;i++) {\r
-         R[i]=A[j++];\r
-       }\r
-       quickSort(R, 0, R.length);\r
-       return R;\r
+    } else {\r
+      if (length <= QUICK_SIZE) {\r
+        int[] R = new int[length];\r
+        int max = R.length;\r
+        int j = low;\r
+        for (int i = 0; i < max; i++) {\r
+          R[i] = A[j++];\r
+        }\r
+        quickSort(R, 0, R.length-1);\r
+        return R;\r
       } else {\r
-       int q = A.length / 4;\r
-  \r
-        int idxs0 = q;\r
-        int idxs1 = 2 * q;\r
-        int idxs2 = 3 * q;\r
-       \r
+        \r
+        int q=length/4;\r
+        int idxs0 = q+low;\r
+        int idxs1 = (2 * q)+low;\r
+        int idxs2 = (3 * q)+low;\r
+\r
         sese p1{\r
-         int[] A_quarters0 = sort(A, 0, idxs0);\r
+          int[] A_quarters0 = sort(A, low, idxs0);\r
         }\r
         sese p2{\r
-         int[] A_quarters1 = sort(A, idxs0, idxs1);\r
+          int[] A_quarters1 = sort(A, idxs0, idxs1);\r
         }\r
         sese p3{\r
-         int[] A_quarters2 = sort(A, idxs1, idxs2);\r
+          int[] A_quarters2 = sort(A, idxs1, idxs2);\r
         }\r
-       //don't spawn off sese for last one...\r
-        int[] A_quarters3 = sort(A, idxs2, A.length);\r
+        // don't spawn off sese for last one...\r
+        int[] A_quarters3 = sort(A, idxs2, idxs2+q);\r
 \r
-       int[] R=new int[high-low];\r
+        int[] R = new int[high - low];\r
 \r
-       merge(A_quarters0, A_quarters1, A_quarters2, A_quartes3, R);\r
-       return R;\r
+        merge(A_quarters0, A_quarters1, A_quarters2, A_quarters3, R);\r
+        return R;\r
       }\r
     }\r
   }\r
 \r
-  public static void merge(int []a1, int []a2, int []a3, int[] a4, int[] a) {\r
-    int i1=0;\r
-    int i2=0;\r
-    int i3=0;\r
-    int i4=0;\r
-    int alength=a.length;\r
-    int v1=a1[0];\r
-    int v2=a2[0];\r
-    int v3=a3[0];\r
-    int v4=a4[0];\r
-    int v1m=a1.length;\r
-    int v2m=a2.length;\r
-    int v3m=a3.length;\r
-    int v4m=a4.length;\r
-    for(int i=0;i<alength;i++) {\r
-      if (v1<v2) {\r
-       if (v1<v3) {\r
-         if (v1<v4) {\r
-           a[i]=v1;\r
-           //v1 smallest\r
-           if (i1<v1m) {\r
-             v1=a1[i1++];\r
-           } else {\r
-             v1=2147483647;\r
-           }\r
-         } else {\r
-           //v4 smalles\r
-           if (i4<v4m) {\r
-             v4=a4[i4++];\r
-           } else {\r
-             v4=2147483647;\r
-           }\r
-         }\r
-       } else {\r
-         if (v3<v4) {\r
-           //v3 smallest\r
-           if (i3<v3m) {\r
-             v3=a3[i3++];\r
-           } else {\r
-             v3=2147483647;\r
-           }\r
-         } else {\r
-           //v4 smallest\r
-           if (i4<v4m) {\r
-             v4=a4[i4++];\r
-           } else {\r
-             v4=2147483647;\r
-           }\r
-         }\r
-       }\r
+  public static void merge(int[] a1, int[] a2, int[] a3, int[] a4, int[] a) {\r
+    int i1 = 0;\r
+    int i2 = 0;\r
+    int i3 = 0;\r
+    int i4 = 0;\r
+    int alength = a.length;\r
+    int v1 = a1[0];\r
+    int v2 = a2[0];\r
+    int v3 = a3[0];\r
+    int v4 = a4[0];\r
+    int v1m = a1.length;\r
+    int v2m = a2.length;\r
+    int v3m = a3.length;\r
+    int v4m = a4.length;\r
+    for (int i = 0; i < alength; i++) {\r
+      if (v1 < v2) {\r
+        if (v1 < v3) {\r
+          if (v1 < v4) {\r
+            a[i] = v1;\r
+            // v1 smallest\r
+            if (i1 < v1m) {\r
+              v1 = a1[i1++];\r
+            } else {\r
+              v1 = 2147483647;\r
+            }\r
+          } else {\r
+            a[i] = v4;\r
+            // v4 smalles\r
+            if (i4 < v4m) {\r
+              v4 = a4[i4++];\r
+            } else {\r
+              v4 = 2147483647;\r
+            }\r
+          }\r
+        } else {\r
+          if (v3 < v4) {\r
+            a[i] = v3;\r
+            // v3 smallest\r
+            if (i3 < v3m) {\r
+              v3 = a3[i3++];\r
+            } else {\r
+              v3 = 2147483647;\r
+            }\r
+          } else {\r
+            a[i] = v4;\r
+            // v4 smallest\r
+            if (i4 < v4m) {\r
+              v4 = a4[i4++];\r
+            } else {\r
+              v4 = 2147483647;\r
+            }\r
+          }\r
+        }\r
       } else {\r
-       if (v2<v3) {\r
-         if (v2<v4) {\r
-           //v2 smallest\r
-           if (i2<v2m) {\r
-             v2=a2[i2++];\r
-           } else {\r
-             v2=2147483647;\r
-           }\r
-         } else {\r
-           //v4 smallest\r
-           if (i4<v4m) {\r
-             v4=a4[i4++];\r
-           } else {\r
-             v4=2147483647;\r
-           }\r
-         }\r
-       } else {\r
-         if (v3<v4) {\r
-           //v3 smallest\r
-           if (i3<v3m) {\r
-             v3=a3[i3++];\r
-           } else {\r
-             v3=2147483647;\r
-           }\r
-         } else {\r
-           //v4 smallest\r
-           if (i4<v4m) {\r
-             v4=a4[i4++];\r
-           } else {\r
-             v4=2147483647;\r
-           }\r
-         }\r
-       }\r
+        if (v2 < v3) {\r
+          if (v2 < v4) {\r
+            a[i] = v2;\r
+            // v2 smallest\r
+            if (i2 < v2m) {\r
+              v2 = a2[i2++];\r
+            } else {\r
+              v2 = 2147483647;\r
+            }\r
+          } else {\r
+            a[i] = v4;\r
+            // v4 smallest\r
+            if (i4 < v4m) {\r
+              v4 = a4[i4++];\r
+            } else {\r
+              v4 = 2147483647;\r
+            }\r
+          }\r
+        } else {\r
+          if (v3 < v4) {\r
+            a[i] = v3;\r
+            // v3 smallest\r
+            if (i3 < v3m) {\r
+              v3 = a3[i3++];\r
+            } else {\r
+              v3 = 2147483647;\r
+            }\r
+          } else {\r
+            a[i] = v4;\r
+            // v4 smallest\r
+            if (i4 < v4m) {\r
+              v4 = a4[i4++];\r
+            } else {\r
+              v4 = 2147483647;\r
+            }\r
+          }\r
+        }\r
       }\r
     }\r
   }\r
+\r
 }\r
index 8cf566f64bc75ef1a77a34cecb7f7952839fc9a2..755cfbfd4290fe84b358abb57432422a68ca34f4 100644 (file)
@@ -14,26 +14,25 @@ public class MergeSort {
   /* Threshold values */\r
 \r
   // Cutoff for when to do sequential versus parallel merges\r
-  public static  int MERGE_SIZE;\r
+  public static int MERGE_SIZE;\r
 \r
   // Cutoff for when to do sequential quicksort versus parallel mergesort\r
-  public static  int QUICK_SIZE;\r
+  public static int QUICK_SIZE;\r
 \r
   // Cutoff for when to use insertion-sort instead of quicksort\r
-  public static  int INSERTION_SIZE;\r
-  \r
-  public static  int SERIALIZED_CUT_OFF;\r
+  public static int INSERTION_SIZE;\r
 \r
+  public static int SERIALIZED_CUT_OFF;\r
 \r
   protected int[] input;\r
   protected int[] result;\r
   protected int size;\r
 \r
   public void run(int size) {\r
-    this.size=size;\r
-    long startT=System.currentTimeMillis();\r
+    this.size = size;\r
+    long startT = System.currentTimeMillis();\r
     initialize();\r
-    System.out.println("init time="+(System.currentTimeMillis()-startT));\r
+    System.out.println("init time=" + (System.currentTimeMillis() - startT));\r
     runWorkAndTest();\r
   }\r
 \r
@@ -44,9 +43,9 @@ public class MergeSort {
   }\r
 \r
   public void initialize() {\r
-    \r
-    SERIALIZED_CUT_OFF=size/16;\r
-      \r
+\r
+    SERIALIZED_CUT_OFF = size / 32;\r
+\r
     input = new int[size];\r
     result = new int[size];\r
 \r
@@ -65,12 +64,12 @@ public class MergeSort {
     sese run{\r
       sort(input);\r
     }\r
-    sese test{\r
-      checkSorted(input);\r
-    }\r
+//    sese test{\r
+//      checkSorted(input);\r
+//    }\r
   }\r
-  \r
-  public void sort(int A[]){\r
+\r
+  public void sort(int A[]) {\r
   }\r
 \r
   protected void checkSorted(int[] array) {\r
@@ -86,46 +85,50 @@ public class MergeSort {
 \r
   protected void merge(int A[], int B[], int out[]) {\r
 \r
-    if (A.length <= MERGE_SIZE) {\r
+    if (A.length <= SERIALIZED_CUT_OFF) {\r
       sequentialMerge(A, B, out);\r
     } else {\r
-      int aHalf = A.length >>> 1; /* l33t shifting h4x!!! */\r
-      int bSplit = findSplit(A[aHalf], B);\r
+      if (A.length <= MERGE_SIZE) {\r
+        sequentialMerge(A, B, out);\r
+      } else {\r
+        int aHalf = A.length >>> 1; /* l33t shifting h4x!!! */\r
+        int bSplit = findSplit(A[aHalf], B);\r
+\r
+        int[] A_split0 = new int[aHalf];\r
+        int[] A_split1 = new int[A.length - aHalf];\r
+        for (int i = 0; i < aHalf; i++) {\r
+          A_split0[i] = A[i];\r
+        }\r
+        for (int i = aHalf; i < A.length; i++) {\r
+          A_split1[i - aHalf] = A[i];\r
+        }\r
 \r
-      int[] A_split0 = new int[aHalf];\r
-      int[] A_split1 = new int[A.length - aHalf];\r
-      for (int i = 0; i < aHalf; i++) {\r
-        A_split0[i] = A[i];\r
-      }\r
-      for (int i = aHalf; i < A.length; i++) {\r
-        A_split1[i - aHalf] = A[i];\r
-      }\r
+        int[] B_split0 = new int[bSplit];\r
+        int[] B_split1 = new int[B.length - bSplit];\r
+        for (int i = 0; i < bSplit; i++) {\r
+          B_split0[i] = B[i];\r
+        }\r
+        for (int i = bSplit; i < B.length; i++) {\r
+          B_split1[i - bSplit] = B[i];\r
+        }\r
 \r
-      int[] B_split0 = new int[bSplit];\r
-      int[] B_split1 = new int[B.length - bSplit];\r
-      for (int i = 0; i < bSplit; i++) {\r
-        B_split0[i] = B[i];\r
-      }\r
-      for (int i = bSplit; i < B.length; i++) {\r
-        B_split1[i - bSplit] = B[i];\r
-      }\r
+        int outSplit = aHalf + bSplit;\r
+        int[] out_split0 = new int[outSplit];\r
+        int[] out_split1 = new int[out.length - outSplit];\r
 \r
-      int outSplit = aHalf + bSplit;\r
-      int[] out_split0 = new int[outSplit];\r
-      int[] out_split1 = new int[out.length - outSplit];\r
+        merge(A_split0, B_split0, out_split0);\r
+        merge(A_split1, B_split1, out_split1);\r
+\r
+        for (int i = 0; i < outSplit; i++) {\r
+          out[i] = out_split0[i];\r
+        }\r
+        for (int i = outSplit; i < out.length; i++) {\r
+          out[i] = out_split1[i - outSplit];\r
+        }\r
 \r
-      merge(A_split0, B_split0, out_split0);\r
-      merge(A_split1, B_split1, out_split1);\r
-      \r
-      for (int i = 0; i < outSplit; i++) {\r
-        out[i]=out_split0[i]; \r
-      }\r
-      for (int i = outSplit; i < out.length; i++) {\r
-        out[i]=out_split1[i - outSplit];\r
       }\r
-      \r
     }\r
-    \r
+\r
   }\r
 \r
   /** A standard sequential merge **/\r
@@ -164,8 +167,8 @@ public class MergeSort {
 \r
   /** A standard sequential quicksort **/\r
   protected void quickSort(int array[], int lo, int hi) {\r
-//    int lo = 0;\r
-//    int hi = array.length - 1;\r
+    // int lo = 0;\r
+    // int hi = array.length - 1;\r
     // If under threshold, use insertion sort\r
     int[] arr = array;\r
     if (hi - lo + 1l <= INSERTION_SIZE) {\r
@@ -210,7 +213,7 @@ public class MergeSort {
 \r
     int partition = arr[mid];\r
 \r
-    while(true){\r
+    while (true) {\r
 \r
       while (arr[right] > partition)\r
         --right;\r
@@ -228,8 +231,8 @@ public class MergeSort {
 \r
     }\r
 \r
-    quickSort(arr,lo,left+1);\r
-    quickSort(arr,left+1,hi);\r
+    quickSort(arr, lo, left + 1);\r
+    quickSort(arr, left + 1, hi);\r
 \r
   }\r
 \r