Example #1
0
        public unsafe Tuple <int, int> MinMaxSse()
        {
            var vmin    = Vector128.Create(int.MaxValue);
            var vmax    = Vector128.Create(int.MinValue);
            int vecSize = Vector128 <int> .Count;

            fixed(int *pNumbers = numbers)
            {
                int i;

                for (i = 0; i < numbers.Length; i += vecSize)
                {
                    var d = Sse42.LoadVector128(pNumbers + i);
                    vmin = Sse42.Min(vmin, d);
                    vmax = Sse42.Max(vmax, d);
                }

                // tail is pretty much irrelevant
                int tailLen = (numbers.Length % vecSize);

                for (i = 0; i < tailLen; ++i)
                {
                    var d = Sse42.LoadScalarVector128(pNumbers + numbers.Length - i - 1);
                    vmin = Sse42.Min(vmin, d);
                    vmax = Sse42.Max(vmax, d);
                }
            }

            int min = int.MaxValue, max = int.MinValue;

            for (int i = 0; i < vecSize; ++i)
            {
                min = Math.Min(min, vmin.GetElement(i));
                max = Math.Max(max, vmax.GetElement(i));
            }

            return(new Tuple <int, int>(min, max));
        }