Esempio n. 1
0
        public static int CeilingLog2(uint v)
        {
            int r = Bithacks.FloorLog2(v);

            if (r < 0)
            {
                return(r);
            }
            if (v != (uint)Bithacks.Power2((uint)r))
            {
                return(r + 1);
            }
            else
            {
                return(r);
            }
        }
Esempio n. 2
0
        public static void BitonicSort2(int[] a)
        {
            Parallel.Sticky(a);
            uint N     = (uint)a.Length;
            int  log2n = Bithacks.FloorLog2(N);

            for (int k = 0; k < log2n; ++k)
            {
                uint n2   = N / 2;
                int  twok = Bithacks.Power2(k);
                Campy.Parallel.For((int)n2, i =>
                {
                    int imp2   = i % twok;
                    int cross  = imp2 + 2 * twok * (int)(i / twok);
                    int paired = -1 - imp2 + 2 * twok * (int)((i + twok) / twok);
                    if (a[cross] > a[paired])
                    {
                        int t     = a[cross];
                        a[cross]  = a[paired];
                        a[paired] = t;
                    }
                });
                for (int j = k - 1; j >= 0; --j)
                {
                    int twoj = Bithacks.Power2(j);
                    Campy.Parallel.For((int)n2, i =>
                    {
                        int imp2   = i % twoj;
                        int cross  = imp2 + 2 * twoj * (int)(i / twoj);
                        int paired = cross + twoj;
                        if (a[cross] > a[paired])
                        {
                            int t     = a[cross];
                            a[cross]  = a[paired];
                            a[paired] = t;
                        }
                    });
                }
            }
            Parallel.Sync();
        }
Esempio n. 3
0
        public static void SeqBitonicSort2(int[] a)
        {
            uint N     = (uint)a.Length;
            int  log2n = Bithacks.FloorLog2(N);

            for (int k = 0; k < log2n; ++k)
            {
                uint n2   = N / 2;
                int  twok = Bithacks.Power2(k);
                for (int i = 0; i < n2; ++i)
                {
                    int imp2   = i % twok;
                    int cross  = imp2 + 2 * twok * (int)(i / twok);
                    int paired = -1 - imp2 + 2 * twok * (int)((i + twok) / twok);
                    if (a[cross] > a[paired])
                    {
                        int t = a[cross];
                        a[cross]  = a[paired];
                        a[paired] = t;
                    }
                }
                for (int j = k - 1; j >= 0; --j)
                {
                    int twoj = Bithacks.Power2(j);
                    for (int i = 0; i < n2; ++i)
                    {
                        int imp2   = i % twoj;
                        int cross  = imp2 + 2 * twoj * (int)(i / twoj);
                        int paired = cross + twoj;
                        if (a[cross] > a[paired])
                        {
                            int t = a[cross];
                            a[cross]  = a[paired];
                            a[paired] = t;
                        }
                    }
                }
            }
        }