コード例 #1
0
        public static Vector128 <int>[,] Procedure(int[,] A, int[,] B, int a, Vector128 <int> x, Vector128 <int> y)
        {
            unsafe
            {
                int length  = A.GetLength(0);
                int length2 = B.GetLength(1);
                int length3 = 0;
                int length4 = 0;
                try
                {
                    length3 = length;
                    length4 = length2 / 4;
                }
                catch (Exception e)
                {
                    Console.WriteLine("Error");
                }
                Vector128 <int>[,] MatrixA = new Vector128 <int> [length3, length4];
                Vector128 <int>[,] MatrixB = new Vector128 <int> [length3, length4];
                Vector128 <int>[,] Matrix  = new Vector128 <int> [length3, length4];

                int c = 0;


                fixed(int *ptr = A)
                {
                    fixed(int *ptr2 = B)
                    {
                        for (int i = 0; i < length3; i++)
                        {
                            for (int j = 0; j < length4; j++)
                            {
                                var v  = Sse41.LoadVector128(ptr + c);
                                var v2 = Sse41.LoadVector128(ptr2 + c);
                                c            += 4;
                                MatrixA[i, j] = Sse41.MultiplyLow(v, x);
                                MatrixA[i, j] = Sse41.MultiplyLow(MatrixA[i, j], Vector128.Create(a));
                                MatrixB[i, j] = Sse41.MultiplyLow(v2, y);
                                Matrix[i, j]  = Sse41.Add(MatrixA[i, j], MatrixB[i, j]);
                            }
                        }
                    }
                }

                return(Matrix);
            }
        }
コード例 #2
0
        public static Vector128 <int>[,] MultiplyMatrixSSE(int[,] a, int[,] b)
        {
            unsafe
            {
                int length  = a.GetLength(0);
                int length2 = a.GetLength(1);
                int length3 = 0;
                int length4 = 0;
                try
                {
                    length3 = length;
                    length4 = length2 / 4;
                }
                catch (Exception e)
                {
                    Console.WriteLine("Error");
                }

                Vector128 <int>[,] A = new Vector128 <int> [length3, length4];

                int c = 0;


                fixed(int *ptr = a)
                {
                    fixed(int *ptr2 = b)
                    {
                        for (int i = 0; i < length3; i++)
                        {
                            for (int j = 0; j < length4; j++)
                            {
                                var v  = Sse41.LoadVector128(ptr + c);
                                var v2 = Sse41.LoadVector128(ptr2 + c);
                                c      += 4;
                                A[i, j] = Sse41.MultiplyLow(v, v2);
                            }
                        }
                    }
                }

                return(A);
            }
        }
コード例 #3
0
        private static unsafe void FillRow3(ushort *previousRow, int length)
        {
            ushort *bytes   = stackalloc ushort[] { 1, 2, 3, 4, 5, 6, 7, 8 };
            var     counter = Sse41.LoadVector128(bytes);
            var     step    = Vector128.Create((ushort)8);

            int i = 0;

            for (; i < (length & 7); i += 8)
            {
                Sse42.Store(previousRow + i, counter);
                counter = Sse42.AddSaturate(counter, step);
            }
            //step = Sse42.ShiftRightArithmetic
            step = Vector128.Create((ushort)1);
            for (; i < length; ++i)
            {
                previousRow[i] = counter.GetElement(0);
                counter        = Sse42.AddSaturate(counter, step);
            }
        }
コード例 #4
0
        private static unsafe void FillRowSSeVector2(int *previousRow, int length)
        {
            const int LENGHT = 4;

            int i = 0;

            //int initialCount = Math.Min(count, previousRow.Length);
            for (i = 0; i < 2 * LENGHT;)
            {
                previousRow[i] = ++i;
            }

            var counter1 = Sse41.LoadVector128(previousRow);
            var counter2 = Sse41.LoadVector128(previousRow + LENGHT);
            var step     = Vector128.Create(i);

            int *pDest = previousRow + i;

            for (; i < (length - (2 * LENGHT - 1)); i += 2 * LENGHT)
            {
                counter1 = Sse42.Add(counter1, step);
                counter2 = Sse42.Add(counter2, step);

                Sse42.Store(pDest, counter1);
                Sse42.Store(pDest + LENGHT, counter2);
                pDest += 2 * LENGHT;
            }

            if (i < (length - (LENGHT - 1)))
            {
                counter1 = Sse42.Add(counter1, step);
                Sse42.Store(previousRow + i, counter1);
                i += LENGHT;
            }

            for (; i < length;)
            {
                previousRow[i] = ++i;
            }
        }
コード例 #5
0
        public unsafe int FastMax(Span <int> span)
        {
            int max        = span[0];
            int i          = 0;
            int vectorSize = 4;

            if (span.Length >= (vectorSize * 2))
            {
                fixed(int *ptr = &span[0])
                {
                    var maxVector = Sse41.LoadVector128(ptr + i);

                    for (i = vectorSize; i < span.Length - vectorSize; i += vectorSize)
                    {
                        var current = Sse41.LoadVector128(ptr + i);
                        maxVector = Sse41.Max(maxVector, current);
                    }

                    Span <int> buffer = stackalloc int[vectorSize];

                    maxVector.AsVector().CopyTo(buffer);
                    for (int k = 0; k < buffer.Length; k++)
                    {
                        if (buffer[k] > max)
                        {
                            max = buffer[k];
                        }
                    }
                }
            }

            for (; i < span.Length; i++)
            {
                if (span[i] > max)
                {
                    max = span[i];
                }
            }
            return(max);
        }