package org.trifort.rootbeer.sort; import org.trifort.rootbeer.runtime.Kernel; import org.trifort.rootbeer.runtime.RootbeerGpu; public class GPUSortKernel implements Kernel { private int[][] arrays; public GPUSortKernel(int[][] arrays){ this.arrays = arrays; } @Override public void gpuMethod(){ int[] array = arrays[RootbeerGpu.getBlockIdxx()]; int index1a = RootbeerGpu.getThreadIdxx() << 1; int index1b = index1a + 1; int index2a = index1a - 1; int index2b = index1a; int index1a_shared = index1a << 2; int index1b_shared = index1b << 2; int index2a_shared = index2a << 2; int index2b_shared = index2b << 2; RootbeerGpu.setSharedInteger(index1a_shared, array[index1a]); RootbeerGpu.setSharedInteger(index1b_shared, array[index1b]); //outer pass int arrayLength = array.length >> 1; for(int i = 0; i < arrayLength; ++i){ int value1 = RootbeerGpu.getSharedInteger(index1a_shared); int value2 = RootbeerGpu.getSharedInteger(index1b_shared); int shared_value = value1; if(value2 < value1){ shared_value = value2; RootbeerGpu.setSharedInteger(index1a_shared, value2); RootbeerGpu.setSharedInteger(index1b_shared, value1); } RootbeerGpu.syncthreads(); if(index2a >= 0){ value1 = RootbeerGpu.getSharedInteger(index2a_shared); //value2 = RootbeerGpu.getSharedInteger(index2b_shared); value2 = shared_value; if(value2 < value1){ RootbeerGpu.setSharedInteger(index2a_shared, value2); RootbeerGpu.setSharedInteger(index2b_shared, value1); } } RootbeerGpu.syncthreads(); } array[index1a] = RootbeerGpu.getSharedInteger(index1a_shared); array[index1b] = RootbeerGpu.getSharedInteger(index1b_shared); } }