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); }
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); }
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(); }
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); }
private void Form1_Load(object sender, EventArgs e) { CBLAS.detectCBLAS(); prependLine("OpenBLAS: " + (CBLAS.openbAvailable ? "" : "not ") + "available"); prependLine("Intel MKL: " + (CBLAS.imklAvailable ? "" : "not ") + "available"); }