private static void TestMatMul() { int testCount = 10000; Stopwatch sw = new Stopwatch(); Rational[,] matData = new Rational[3, 3]; matData.AssignAll(ind => new Rational(ind[0] * matData.GetLength(0) + ind[1])); Matrix <Rational> mat1 = new Matrix <Rational>(matData); Matrix <Rational> mat2 = new Matrix <Rational>(mat1.Transposition); Console.WriteLine("Multiplying matrices:"); Console.WriteLine(mat1); Console.WriteLine("And:"); Console.WriteLine(mat2); Console.WriteLine("For " + testCount + " times..."); sw.Start(); Matrix <Rational> res = null; for (int i = 0; i < testCount; i++) { res = mat1 * mat2; } sw.Stop(); Console.WriteLine(res); Console.WriteLine("Measured time: " + sw.Elapsed.TotalMilliseconds + "ms"); Console.WriteLine("Average time per operation: " + sw.Elapsed.TotalMilliseconds / testCount + "ms"); Console.WriteLine(); Console.WriteLine("Now testing with ParallelMultiply:"); sw.Restart(); for (int i = 0; i < testCount; i++) { res = MatrixMultiplication.CpuParallelMultiply(mat1, mat2); } sw.Stop(); Console.WriteLine(res); Console.WriteLine("Measured time: " + sw.Elapsed.TotalMilliseconds + "ms"); Console.WriteLine("Average time per operation: " + sw.Elapsed.TotalMilliseconds / testCount + "ms"); Console.WriteLine(); MatrixMultiplication.GpuMultiply <Rational, GpuRational>(mat1, mat2); // 'Warmup' the gpu Console.WriteLine("Now testing with GPUMultiply:"); sw.Restart(); for (int i = 0; i < testCount; i++) { res = MatrixMultiplication.GpuMultiply <Rational, GpuRational>(mat1, mat2); } sw.Stop(); Console.WriteLine(res); Console.WriteLine("Measured time: " + sw.Elapsed.TotalMilliseconds + "ms"); Console.WriteLine("Average time per operation: " + sw.Elapsed.TotalMilliseconds / testCount + "ms"); Console.WriteLine(); }