示例#1
0
        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());
        }
示例#2
0
        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());
        }