public static float[] RunOddEvenSort2(float[] a) { int N = a.Length; bool evenArr = (N % 2) == 0 ? true : false; //Create context and accelerator var gpu = new CudaAccelerator(new Context()); //Create typed launcher var oddEvenKernel = gpu.LoadAutoGroupedStreamKernel < Index1, ArrayView <float>, VariableView <byte>, int, bool>(OddEvenSort2); //Allocate memory MemoryBuffer <float> d_a = gpu.Allocate <float>(N); MemoryBuffer <byte> d_stopFlag = gpu.AllocateZero <byte>(1); d_a.CopyFrom(a, 0, Index1.Zero, N); //Run kernel oddEvenKernel(N / 2, d_a, d_stopFlag.View.GetVariableView(0), N, evenArr); gpu.Synchronize(); return(d_a.GetAsArray()); }
public static float[] RunOddEvenSort(float[] a, ref Stopwatch sw) { int N = a.Length; bool evenArr = (N % 2) == 0 ? true : false; bool stopFlag = false; bool iterationEven = true; //Create context and accelerator var gpu = new CudaAccelerator(new Context()); //Create typed launcher var oddEvenKernel = gpu.LoadAutoGroupedStreamKernel < Index1, ArrayView <float>, VariableView <byte>, bool, int, bool>(OddEvenSort); //Allocate memory MemoryBuffer <float> d_a = gpu.Allocate <float>(N); MemoryBuffer <byte> d_stopFlag = gpu.AllocateZero <byte>(1); d_a.CopyFrom(a, 0, Index1.Zero, N); sw.Restart(); //Run kernel byte[] zero_val = new byte[1]; zero_val[0] = 0; while (true) { if (stopFlag) { break; } stopFlag = true; d_stopFlag.CopyFrom(zero_val, 0, 0, 1); oddEvenKernel(N / 2, d_a, d_stopFlag.View.GetVariableView(), iterationEven, N, evenArr); gpu.Synchronize(); if (d_stopFlag.GetAsArray()[0] > 0) { stopFlag = false; } iterationEven = !iterationEven; } sw.Stop(); return(d_a.GetAsArray()); }