Example #1
0
        public void BlockCount()
        {
            Claim.eq(1, Span128.WholeBlocks <sbyte>(16));
            Claim.eq(1, Span128.WholeBlocks <byte>(16));

            Claim.eq(1, Span128.WholeBlocks <short>(8));
            Claim.eq(1, Span128.WholeBlocks <ushort>(8));

            Claim.eq(1, Span128.WholeBlocks <int>(4));
            Claim.eq(1, Span128.WholeBlocks <uint>(4));
            Claim.eq(1, Span128.WholeBlocks <float>(4));

            Claim.eq(1, Span128.WholeBlocks <long>(2));
            Claim.eq(1, Span128.WholeBlocks <ulong>(2));
            Claim.eq(1, Span128.WholeBlocks <double>(2));

            Claim.eq(1, Span256.WholeBlocks <sbyte>(32));
            Claim.eq(1, Span256.WholeBlocks <byte>(32));

            Claim.eq(1, Span256.WholeBlocks <short>(16));
            Claim.eq(1, Span256.WholeBlocks <ushort>(16));

            Claim.eq(1, Span256.WholeBlocks <int>(8));
            Claim.eq(1, Span256.WholeBlocks <uint>(8));
            Claim.eq(1, Span256.WholeBlocks <float>(8));

            Claim.eq(1, Span256.WholeBlocks <long>(4));
            Claim.eq(1, Span256.WholeBlocks <ulong>(4));
            Claim.eq(1, Span256.WholeBlocks <double>(4));
        }
Example #2
0
        public void max256_i32()
        {
            var blocklen = Span256 <int> .BlockLength;
            var lhs      = Random.ReadOnlySpan256 <int>(SampleSize);
            var rhs      = Random.ReadOnlySpan256 <int>(SampleSize);
            var expect   = Span256.AllocBlocks <int>(SampleSize);
            var actual   = Span256.AllocBlocks <int>(SampleSize);

            for (var block = 0; block < SampleSize; block++)
            {
                var offset = block * blocklen;

                Span <int> tmp = stackalloc int[blocklen];
                for (var i = 0; i < blocklen; i++)
                {
                    tmp[i] = gmath.max(lhs[offset + i], rhs[offset + i]);
                }
                var vExpect = Vec256.LoadVector(ref tmp[0]);

                var vX      = lhs.LoadVec256(block);
                var vY      = rhs.LoadVec256(block);
                var vActual = ginx.max <int>(vX, vY);

                Claim.eq(vExpect, vActual);

                vstore(vExpect, ref expect.Block(block));
                vstore(vActual, ref actual.Block(block));
            }
            Claim.eq(expect, actual);
        }
Example #3
0
        public void BlockLength()
        {
            Claim.eq(4, Span128 <int> .BlockLength);
            Claim.eq(16, Span128.BlockLength <sbyte>());
            Claim.eq(16, Span128.BlockLength <byte>());
            Claim.eq(8, Span128.BlockLength <short>());
            Claim.eq(8, Span128.BlockLength <ushort>());
            Claim.eq(4, Span128.BlockLength <int>());
            Claim.eq(4, Span128.BlockLength <uint>());
            Claim.eq(2, Span128.BlockLength <long>());
            Claim.eq(2, Span128.BlockLength <ulong>());
            Claim.eq(4, Span128.BlockLength <float>());
            Claim.eq(2, Span128.BlockLength <double>());
            Claim.eq(8, Span128.BlockLength <int>(2));
            Claim.eq(4, Span128.BlockLength <long>(2));
            Claim.eq(32, Span128.BlockLength <byte>(2));


            Claim.eq(8, Span256 <int> .BlockLength);
            Claim.eq(32, Span256.BlockLength <sbyte>());
            Claim.eq(32, Span256.BlockLength <byte>());
            Claim.eq(16, Span256.BlockLength <short>());
            Claim.eq(16, Span256.BlockLength <ushort>());
            Claim.eq(8, Span256.BlockLength <int>());
            Claim.eq(8, Span256.BlockLength <uint>());
            Claim.eq(4, Span256.BlockLength <long>());
            Claim.eq(4, Span256.BlockLength <ulong>());
            Claim.eq(8, Span256.BlockLength <float>());
            Claim.eq(4, Span256.BlockLength <double>());
        }
Example #4
0
        public void CellSize()
        {
            Claim.eq(4, Span128 <int> .CellSize);
            Claim.eq(1, Span128.CellSize <sbyte>());
            Claim.eq(1, Span128.CellSize <byte>());
            Claim.eq(2, Span128.CellSize <short>());
            Claim.eq(4, Span128.CellSize <int>());
            Claim.eq(4, Span128.CellSize <uint>());
            Claim.eq(4, Span128.CellSize <float>());
            Claim.eq(8, Span128.CellSize <ulong>());
            Claim.eq(8, Span128.CellSize <double>());
            Claim.eq(8, Span128.CellSize <long>());


            Claim.eq(4, Span256 <int> .CellSize);
            Claim.eq(1, Span256.CellSize <sbyte>());
            Claim.eq(1, Span256.CellSize <byte>());
            Claim.eq(2, Span256.CellSize <short>());
            Claim.eq(4, Span256.CellSize <int>());
            Claim.eq(4, Span256.CellSize <uint>());
            Claim.eq(4, Span256.CellSize <float>());
            Claim.eq(8, Span256.CellSize <ulong>());
            Claim.eq(8, Span256.CellSize <double>());
            Claim.eq(8, Span256.CellSize <long>());
        }
Example #5
0
    public static Span256 <T> convert <S, T>(Span256 <S> src)
        where T : struct
        where S : struct
    {
        var dst = Span256.Alloc <T>(src.Length);

        for (var i = 0; i < src.Length; i++)
        {
            dst[i] = convert <S, T>(src[i]);
        }
        return(dst);
    }
Example #6
0
        void sub256_batch_check <T>()
            where T : unmanaged
        {
            TypeCaseStart <T>();
            var lhs  = Random.Span256 <T>(SampleSize).ReadOnly();
            var rhs  = Random.Span256 <T>(SampleSize).ReadOnly();
            var dstA = ginx.sub(lhs, rhs, lhs.Replicate());
            var dstB = Span256.AllocBlocks <T>(lhs.BlockCount);

            for (var i = 0; i < dstA.Length; i++)
            {
                dstB[i] = gmath.sub(lhs[i], rhs[i]);
            }
            Claim.yea(dstA.Identical(dstB));
            TypeCaseEnd <T>();
        }
Example #7
0
        static Vec256 <T> BlendAltMask <T>()
            where T : unmanaged
        {
            Span256 <T> mask = Span256.Alloc <T>(1);
            var         no   = PrimalInfo.Get <T>().MaxVal;
            var         yes  = PrimalInfo.Get <T>().Zero;

            for (byte i = 0; i < mask.Length; i++)
            {
                if (i % 2 == 0)
                {
                    mask[i] = yes;
                }
                else
                {
                    mask[i] = no;
                }
            }
            return(Vec256.Load(mask));
        }
Example #8
0
        static Vec256 <byte> ShuffleIdentityMask()
        {
            Span256 <byte> mask = Span256.Alloc <byte>(1);

            //For the first 128-bit lane
            var half = mask.Length / 2;

            for (byte i = 0; i < half; i++)
            {
                mask[i] = i;
            }

            //For the second 128-bit lane
            for (byte i = 0; i < half; i++)
            {
                mask[i + half] = i;
            }

            return(Vec256.Load(mask));
        }
Example #9
0
        public void BlockSize()
        {
            Claim.eq(16, Span128 <int> .BlockSize);
            Claim.eq(16, Span128.BlockSize <sbyte>());
            Claim.eq(16, Span128.BlockSize <byte>());
            Claim.eq(16, Span128.BlockSize <short>());
            Claim.eq(16, Span128.BlockSize <int>());
            Claim.eq(16, Span128.BlockSize <float>());
            Claim.eq(16, Span128.BlockSize <double>());
            Claim.eq(16, Span128.BlockSize <long>());

            Claim.eq(32, Span256 <int> .BlockSize);
            Claim.eq(32, Span256.BlockSize <sbyte>());
            Claim.eq(32, Span256.BlockSize <byte>());
            Claim.eq(32, Span256.BlockSize <short>());
            Claim.eq(32, Span256.BlockSize <int>());
            Claim.eq(32, Span256.BlockSize <float>());
            Claim.eq(32, Span256.BlockSize <double>());
            Claim.eq(32, Span256.BlockSize <long>());
        }
Example #10
0
        // Truncates alternating source vector components
        static Vec256 <T> ShuffleTruncateMask <T>()
            where T : unmanaged

        {
            var mask = Span256.Alloc <T>(1);
            var chop = PrimalInfo.Get <T>().MaxVal;

            //For the first 128-bit lane
            var half = mask.Length / 2;

            for (byte i = 0; i < half; i++)
            {
                if (i % 2 != 0)
                {
                    mask[i] = chop;
                }
                else
                {
                    mask[i] = convert <byte, T>(i);
                }
            }

            //For the second 128-bit lane
            for (byte i = 0; i < half; i++)
            {
                if (i % 2 != 0)
                {
                    mask[i + half] = chop;
                }
                else
                {
                    mask[i + half] = convert <byte, T>(i);
                }
            }

            return(Vec256.Load(mask));
        }
Example #11
0
        public void blend_256_u8()
        {
            void Test1()
            {
                var v0   = Random.CpuVec256 <byte>();
                var v1   = Random.CpuVec256 <byte>();
                var bits = Random.BitString <N32>();
                var mask = Vec256.Load(bits.Map(x => x ? (byte)0xFF : (byte)0));
                var v3   = dinx.blendv(v0, v1, mask);

                var selection = Span256.AllocBlocks <byte>(1);

                for (var i = 0; i < selection.Length; i++)
                {
                    selection[i] = bits[i] ? v1[i] : v0[i];
                }
                var v4 = selection.ToCpuVec256();

                Claim.eq(v3, v4);
            }

            Verify(Test1);

            var v1      = Vec256.Fill <byte>(3);
            var v2      = Vec256.Fill <byte>(4);
            var control = Vec256Pattern.Alternate <byte>(0, 0xFF);
            var v3      = dinx.blendv(v1, v2, control);
            var block   = Span256.AllocBlocks <byte>(1);

            for (var i = 0; i < 32; i++)
            {
                block[i] = (byte)(even(i) ? 3 : 4);
            }
            var v4 = block.ToCpuVec256();

            Claim.eq(v3, v4);
        }
Example #12
0
 public static EigenResult <N, T> Define <N, T>(Span <N, Complex <T> > values, Span256 <T> lv = default, Span256 <T> rv = default)
     where N : ITypeNat, new()
     where T : struct
 => new EigenResult <N, T>(values, lv, rv);