Example #1
0
        public unsafe void CouldCallHiLevelSgemm()
        {
            var mnk = 2;
            var x   = new float[mnk * mnk];

            for (int i = 0; i < mnk * mnk; i++)
            {
                x[i] = (i + 1);
            }

            var h  = x.AsMemory().Pin();
            var c  = new float[mnk * mnk];
            var hc = c.AsMemory().Pin();

            CBLAS.Sgemm(LAYOUT.RowMajor, TRANSPOSE.NoTrans, TRANSPOSE.NoTrans,
                        mnk, mnk, mnk, alpha: 1f, (float *)h.Pointer, mnk, (float *)h.Pointer, mnk, beta: 0, (float *)hc.Pointer, mnk);
        }
Example #2
0
        public static unsafe void Sample()
        {
            BlasNumThreads = 1;

            var mnk = 2;
            var x   = new float[mnk * mnk];
            var c   = new float[mnk * mnk];

            for (int i = 0; i < mnk * mnk; i++)
            {
                x[i] = (i + 1);
            }

            fixed(float *xP = &x[0])
            fixed(float *cP = &c[0])
            {
                CBLAS.Sgemm(LAYOUT.RowMajor, TRANSPOSE.NoTrans, TRANSPOSE.NoTrans,
                            mnk, mnk, mnk, alpha: 1f, xP, mnk, xP, mnk, beta: 0, cP, mnk);
            }
        }
        public static MemoryAlignedMatrix Power(this MemoryAlignedMatrix a, int n)
        {
            MemoryAlignedMatrix z      = null;
            MemoryAlignedMatrix result = null;
            MemoryAlignedMatrix output = new MemoryAlignedMatrix(a.Size);

            while (n > 0)
            {
                if (z == null)
                {
                    z = a.Copy();
                }
                else
                {
                    CBLAS.Square(z, output);
                    Swap(ref z, ref output);
                }

                int bit = n % 2;
                n /= 2;

                if (bit == 1)
                {
                    if (result == null)
                    {
                        result = z.Copy();
                    }
                    else
                    {
                        CBLAS.Multiply(result, z, output);
                        Swap(ref result, ref output);
                    }
                }
            }

            return(result);
        }
Example #4
0
        public void Test_cblasSgemm()
        {
            /* Data initialization */
            int Order  = CBLAS.ORDER.ColMajor;
            int TransA = CBLAS.TRANSPOSE.NoTrans;
            int TransB = CBLAS.TRANSPOSE.NoTrans;

            Random rand   = new Random();
            int    rows_a = rand.Next(2, 10);
            int    cols_a = rand.Next(2, 10);

            int rows_b = cols_a;
            int cols_b = rand.Next(2, 10);

            int rows_c = rows_a;
            int cols_c = cols_b;

            float[] A = new float[rows_a * cols_a];
            float[] B = new float[rows_b * cols_b];
            float[] C = new float[rows_c * cols_c];

            for (int i = 0; i < A.Length; i++)
            {
                A[i] = Convert.ToSingle(rand.Next(0, 10));
            }

            for (int i = 0; i < B.Length; i++)
            {
                B[i] = Convert.ToSingle(rand.Next(0, 10));
            }

            for (int i = 0; i < C.Length; i++)
            {
                C[i] = Convert.ToSingle(rand.Next(0, 10));
            }

            var alpha = Convert.ToSingle(rand.Next(0, 10));
            var beta  = Convert.ToSingle(rand.Next(0, 10));

            var mA = Matrix <float> .Build.Dense(rows_a, cols_a, A);

            var mB = Matrix <float> .Build.Dense(rows_b, cols_b, B);

            var mC = Matrix <float> .Build.Dense(rows_c, cols_c, C).Clone();

            Console.WriteLine("MKL cblas_sgemm example");
            Console.WriteLine();
            /* Print initial data */
            Console.WriteLine("alpha=" + alpha);
            Console.WriteLine("beta=" + beta);
            Console.WriteLine("Matrix A");
            Console.WriteLine(mA.ToString());
            Console.WriteLine("Matrix B");
            Console.WriteLine(mB.ToString());
            Console.WriteLine("Initial C");
            Console.WriteLine(mC.ToString());

            /* Computation */
            CBLAS.sgemm(Order, TransA, TransB, rows_a, cols_b, cols_a, alpha, A, rows_a, B, rows_b, beta, ref C, rows_c);

            mC = alpha * mA * mB + beta * mC;      //sgemm
            var expected = mC.ToColumnWiseArray(); //reference result by Math.Net

            for (int i = 0; i < C.Length; i++)
            {
                Assert.AreEqual(expected[i], C[i]);
            }

            /* Print the result */
            var mCResult = Matrix <float> .Build.Dense(rows_c, cols_c, C);

            Console.WriteLine("expected");
            Console.WriteLine(mC.ToString());
            Console.WriteLine("Result");
            Console.WriteLine(mCResult.ToString());
            Console.WriteLine("TEST PASSED");
            Console.WriteLine();
        }
Example #5
0
        public void CouldUseSMFormulaCorrectly()
        {
            BLAS.BlasNumThreads = 1;
            // Calculate (X'X)^-1 for M and M-1

            var dataSpan = new Span <double>(Data, Columns * Rows);

            var rounds = 3;
            var count  = 20;

            var rows       = new[] { 2, 4, 6, 8, 10, 15, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500 };
            var columns    = new[] { 2, 4, 6, 8, 10, 15, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500 };
            var syrkVsGemm = new bool[rows.Length, columns.Length];

            Console.Write($"     ");
            foreach (var co in columns)
            {
                Console.Write($"{co} ");
            }
            Console.WriteLine();

            foreach (var ro in rows)
            {
                Console.Write($"{ro}: ");
                foreach (var co in columns)
                {
                    Rows    = ro;
                    Columns = co;
                    Marshal.FreeHGlobal((IntPtr)Data);
                    SetUp();
                    var xxN  = (double *)Marshal.AllocHGlobal(Columns * Columns * 8);
                    var xxN1 = (double *)Marshal.AllocHGlobal(Columns * Columns * 8);

                    var xxNSpan  = new Span <double>(xxN, Columns * Columns);
                    var xxN1Span = new Span <double>(xxN1, Columns * Columns);

                    var flopsMult = 1L * Columns * Columns * Rows * 2;

                    for (int r = 0; r < rounds; r++)
                    {
                        var statGemm = Benchmark.Run($"Dgemm_{ro}x{co}", count * flopsMult, silent: true);
                        {
                            for (int i = 0; i < count; i++)
                            {
                                var data = Data;
                                CBLAS.Dgemm(LAYOUT.RowMajor, TRANSPOSE.Trans, TRANSPOSE.NoTrans, Columns, Columns, Rows, alpha: 1.0,
                                            data, Columns,
                                            data, Columns,
                                            beta: 0.0,
                                            xxN, Columns);
                            }
                        }
                        statGemm.Dispose();

                        var starSyrk = Benchmark.Run($"Dsyrk_{ro}x{co}", count * flopsMult, silent: true);
                        {
                            for (int i = 0; i < count; i++)
                            {
                                var data = Data;
                                CBLAS.Dsyrk(LAYOUT.RowMajor, UPLO.Upper, TRANSPOSE.Trans, Columns, Rows, 1.0,
                                            data, Columns, 0.0, xxN, Columns);
                            }
                        }
                        starSyrk.Dispose();

                        if (r == rounds - 1)
                        {
                            // Console.WriteLine($"starSyrk.MOPS {starSyrk.MOPS} - starGemm.MOPS {statGemm.MOPS}");
                            if (starSyrk.MOPS > statGemm.MOPS)
                            {
                                // syrkVsGemm[ro, co] = true;
                                Console.Write(1 + " ");
                            }
                            else
                            {
                                Console.Write(0 + " ");
                            }
                        }
                    }
                }

                Console.WriteLine();
            }

            // Benchmark.Dump();

            // CBLAS.Dsyrk(LAYOUT.RowMajor, UPLO.Lower, TRANSPOSE.Trans, Columns, Rows - 1, 1.0, Data, Rows, 0.0, xxN1, Columns);
        }
Example #6
0
 private void Form1_Load(object sender, EventArgs e)
 {
     CBLAS.detectCBLAS();
     prependLine("OpenBLAS: " + (CBLAS.openbAvailable ? "" : "not ") + "available");
     prependLine("Intel MKL: " + (CBLAS.imklAvailable ? "" : "not ") + "available");
 }