public void HillisSteeleSumScanTest() { uint[] array = new uint[ARRAY_COUNT]; uint[] scannedArray = new uint[ARRAY_COUNT]; for (int i = 0; i < ARRAY_COUNT; i++) { array[i] = GenerateRandomUInt(); } ComputeBuffer cb_in = new ComputeBuffer(ARRAY_COUNT, StrideSize.s_uint); ComputeShaderUtil.InitKernels(); HillisSteeleSumScan.InitKernels(); cb_in.SetData(array); HillisSteeleSumScan hillisSteeleSumScan = new HillisSteeleSumScan(ARRAY_COUNT); hillisSteeleSumScan.Scan(ref cb_in); cb_in.GetData(scannedArray); // using serial inclusive sum scan method to make sure that the parallel method works uint sum = 0; for (int i = 0; i < ARRAY_COUNT; i++) { sum += array[i]; Assert.AreEqual(sum, scannedArray[i], i.ToString()); } cb_in.Dispose(); hillisSteeleSumScan.Dispose(); }
public void HillisSteeleFloat3MaxScanTest() { float3[] array = new float3[ARRAY_COUNT]; float3[] scannedArray = new float3[ARRAY_COUNT]; for (int i = 0; i < ARRAY_COUNT; i++) { array[i] = GenerateRandomFloat3(); } ComputeBuffer cb_in = new ComputeBuffer(ARRAY_COUNT, StrideSize.s_float3); ComputeShaderUtil.InitKernels(); HillisSteeleFloat3MaxScan.InitKernels(); cb_in.SetData(array); HillisSteeleFloat3MaxScan hillisSteeleFloat3MaxScan = new HillisSteeleFloat3MaxScan(ARRAY_COUNT); hillisSteeleFloat3MaxScan.Scan(ref cb_in); cb_in.GetData(scannedArray); // using serial inclusive min scan method to make sure that the parallel method works float3 float3Max = array[0]; for (int i = 0; i < ARRAY_COUNT; i++) { float3Max = math.max(float3Max, array[i]); Assert.AreEqual(float3Max, scannedArray[i]); } cb_in.Dispose(); hillisSteeleFloat3MaxScan.Dispose(); }
public void RadixSortTest() { uint[] array = new uint[ARRAY_COUNT]; uint[] sortedArray = new uint[ARRAY_COUNT]; int[] indices = MathUtil.GenerateSeqArray(ARRAY_COUNT); for (uint i = 0; i < ARRAY_COUNT; i++) { array[i] = GenerateRandomUInt(); } ComputeBuffer cb_sort = new ComputeBuffer(ARRAY_COUNT, StrideSize.s_uint); ComputeBuffer cb_indices = new ComputeBuffer(ARRAY_COUNT, StrideSize.s_int); ComputeShaderUtil.InitKernels(); RadixSort.InitKernels(); cb_sort.SetData(array); cb_indices.SetData(indices); RadixSort radixSort = new RadixSort(ARRAY_COUNT); radixSort.Setup(ref cb_sort, ref cb_indices); radixSort.Sort(); cb_sort.GetData(sortedArray); cb_indices.GetData(indices); // check if sorting works for (int i = 0; i < ARRAY_COUNT - 1; i++) { Assert.GreaterOrEqual(sortedArray[i + 1], sortedArray[i]); } // check if indices are sorted properly for (int i = 0; i < ARRAY_COUNT; i++) { Assert.AreEqual(array[indices[i]], sortedArray[i]); } cb_sort.Dispose(); cb_indices.Dispose(); radixSort.Dispose(); }
public void BlellochSumScanTest() { uint[] array = new uint[ARRAY_COUNT]; uint[] scannedArray = new uint[ARRAY_COUNT]; for (int i = 0; i < ARRAY_COUNT; i++) { array[i] = GenerateRandomUInt(); } ComputeBuffer cb_in = new ComputeBuffer(ARRAY_COUNT, StrideSize.s_uint); ComputeBuffer cb_out = new ComputeBuffer(ARRAY_COUNT, StrideSize.s_uint); ComputeShaderUtil.InitKernels(); BlellochSumScan.InitKernels(); cb_in.SetData(array); ComputeShaderUtil.ZeroOut(ref cb_out, ARRAY_COUNT); BlellochSumScan blellochSumScan = new BlellochSumScan(ARRAY_COUNT); blellochSumScan.Scan(ref cb_in, ref cb_out, ARRAY_COUNT); cb_out.GetData(scannedArray); // using serial exclusive sum scan method to make sure that the parallel method works uint sum = 0; for (int i = 0; i < ARRAY_COUNT; i++) { Assert.AreEqual(sum, scannedArray[i]); sum += array[i]; } cb_in.Dispose(); cb_out.Dispose(); blellochSumScan.Dispose(); }