import DPJRuntime.Framework.*; import DPJRuntime.Framework.Pipeline.*; import java.lang.Math; import java.util.ArrayList; public class RadixSortPipe { public static final int MAX_RADIX = 2048; public static final int SIZE = 16; public static final int NUMREPS = 10; region ArrayRegion; region PipeRegion; private static class IntArray<region R> { public final int data[]<R> in R; IntArray() { // For now, use the same 16 "random" numbers used by the // StreamIt RadixSort benchmark (taken from Knuth). assert(SIZE <= MAX_RADIX); data = new int[SIZE]<R>; data[0] = 503; data[1] = 87; data[2] = 512; data[3] = 061; data[4] = 908; data[5] = 170; data[6] = 897; data[7] = 275; data[8] = 653; data[9] = 426; data[10] = 154; data[11] = 509; data[12] = 612; data[13] = 677; data[14] = 765; data[15] = 703; } public String toString() reads R { StringBuffer sb = new StringBuffer(); for (int d : data) { sb.append(d + " "); } return sb.toString(); } } private static final class IntSourceFilter<region FR> implements Filter<IntArray<ArrayRegion>,FR,pure> { private int rep in FR = 0; public <region R>IntArray<R> op(IntArray<R> item) reads R writes FR { if (rep++ < NUMREPS) { IntArray<R> intArray = new IntArray<R>(); return intArray; } else { // Signal end of stream return null; } } } /** * Factory for creating an IntSourceFilter */ private static final class IntSourceFactory implements Pipeline.FilterFactory<IntArray<ArrayRegion>,pure> { public <region R> Pipeline.Filter<IntArray<ArrayRegion>,R,pure> createFilter() pure { return new IntSourceFilter<R>(); } } private static class SortFilter<region FR> implements Filter<IntArray<ArrayRegion>, FR, pure> { final int radix; SortFilter(int radix) { this.radix = radix; } // Arrays to hold intermediate results of sorting; final int[]<FR> left = new int[SIZE]<FR>; final int[]<FR> right = new int[SIZE]<FR>; /** * Stable sort on radix */ public <region R>IntArray<R> op(IntArray<R> item) writes R, FR { // Copy 0 and 1 items into two temporary arrays left and // right, maintaining the original order in each group int leftSize = 0, rightSize = 0; for (int i : item.data) { if ((i & radix) == 0) { left[leftSize++] = i; } else { right[rightSize++] = i; } } // Copy back all left items, followed by all right items int idx = 0; for (int i = 0; i < leftSize; ++i) { item.data[idx++] = left[i]; } for (int i = 0; i < rightSize; ++i) { item.data[idx++] = right[i]; } return item; } } private static final class SortFilterFactory implements Pipeline.FilterFactory<IntArray<ArrayRegion>, pure> { final int radix; SortFilterFactory(int radix) { this.radix = radix; } public <region R>Pipeline.Filter<IntArray<ArrayRegion>, R, pure> createFilter() pure { return new SortFilter<R>(radix); } } public static void addSortStages(Pipeline<IntArray<ArrayRegion>, PipeRegion, pure> pipeline) { for (int radix=1; radix < MAX_RADIX; radix <<= 1) pipeline.appendStageWithFilter(new SortFilterFactory(radix)); } private static synchronized void print(String s) pure { System.out.println(s); } public static void main() { // Create the pipeline and populate it with the source stage // and log_2(MAX_RADIX) stages Pipeline<IntArray<ArrayRegion>, PipeRegion, pure> pipeline = new Pipeline<IntArray<ArrayRegion>, PipeRegion, pure>(); pipeline.appendStageWithFilter(new IntSourceFactory()); RadixSortPipe.addSortStages(pipeline); // Process the data pipeline.launchAllStages(); } }