MyraMath
cgemmC


Source: tests/dense/gemm.cpp

1 // ========================================================================= //
2 // This file is part of MyraMath, copyright (c) 2014-2019 by Ryan A Chilton //
3 // and distributed by MyraCore, LLC. See LICENSE.txt for license terms. //
4 // ========================================================================= //
5 
11 // Containers.
13 #include <myramath/dense/Matrix.h>
14 
15 // Algorithms.
17 #include <myramath/dense/gemm.h>
22 
23 // Reporting.
24 #include <tests/myratest.h>
25 
26 using namespace myra;
27 
28 namespace {
29 
30 // Note that the native BLAS does not support just 'C'onjugating a complex argument,
31 // so we have a few tests for it. There's currently no other tests for GEMM, since
32 // it's so well covered by other tests.
33 template<class Precision> void test(int I, int J, int K, Precision tolerance)
34  {
35  typedef std::complex<Precision> Number;
36  myra::out() << typestring<Number>() << std::endl;
37 
38  Number alpha = random<Number>();
39  Number beta = random<Number>();
40 
41  // Test gemm('C','N')
42  {
43  auto C = Matrix<Number>::random(I,J);
44  auto A = Matrix<Number>::random(I,K);
45  auto B = Matrix<Number>::random(K,J);
46  Matrix<Number> D = C;
47  gemm_inplace(D,A,'C',B,'N',alpha,beta);
48  Precision error = frobenius(beta*C+alpha*conjugate(A)*B-D);
49  myra::out() << " |gemm('C','N')| = " << error << std::endl;
50  REQUIRE(error < tolerance);
51  }
52 
53  // Test gemm('C','T')
54  {
55  auto C = Matrix<Number>::random(I,J);
56  auto A = Matrix<Number>::random(I,K);
57  auto B = Matrix<Number>::random(J,K);
58  Matrix<Number> D = C;
59  gemm_inplace(D,A,'C',B,'T',alpha,beta);
60  Precision error = frobenius(beta*C+alpha*conjugate(A)*transpose(B)-D);
61  myra::out() << " |gemm('C','T')| = " << error << std::endl;
62  REQUIRE(error < tolerance);
63  }
64 
65  // Test gemm('C','H')
66  {
67  auto C = Matrix<Number>::random(I,J);
68  auto A = Matrix<Number>::random(I,K);
69  auto B = Matrix<Number>::random(J,K);
70  Matrix<Number> D = C;
71  gemm_inplace(D,A,'C',B,'H',alpha,beta);
72  Precision error = frobenius(beta*C+alpha*conjugate(A)*hermitian(B)-D);
73  myra::out() << " |gemm('C','H')| = " << error << std::endl;
74  REQUIRE(error < tolerance);
75  }
76 
77  // Test gemm('N','C')
78  {
79  auto C = Matrix<Number>::random(I,J);
80  auto A = Matrix<Number>::random(I,K);
81  auto B = Matrix<Number>::random(K,J);
82  Matrix<Number> D = C;
83  gemm_inplace(D,A,'N',B,'C',alpha,beta);
84  Precision error = frobenius(beta*C+alpha*A*conjugate(B)-D);
85  myra::out() << " |gemm('N','C')| = " << error << std::endl;
86  REQUIRE(error < tolerance);
87  }
88 
89  // Test gemm('T','C')
90  {
91  auto C = Matrix<Number>::random(I,J);
92  auto A = Matrix<Number>::random(K,I);
93  auto B = Matrix<Number>::random(K,J);
94  Matrix<Number> D = C;
95  gemm_inplace(D,A,'T',B,'C',alpha,beta);
96  Precision error = frobenius(beta*C+alpha*transpose(A)*conjugate(B)-D);
97  myra::out() << " |gemm('T','C')| = " << error << std::endl;
98  REQUIRE(error < tolerance);
99  }
100 
101  // Test gemm('H','C')
102  {
103  auto C = Matrix<Number>::random(I,J);
104  auto A = Matrix<Number>::random(K,I);
105  auto B = Matrix<Number>::random(K,J);
106  Matrix<Number> D = C;
107  gemm_inplace(D,A,'H',B,'C',alpha,beta);
108  Precision error = frobenius(beta*C+alpha*hermitian(A)*conjugate(B)-D);
109  myra::out() << " |gemm('H','C')| = " << error << std::endl;
110  REQUIRE(error < tolerance);
111  }
112 
113  // Test gemm('C','C')
114  {
115  auto C = Matrix<Number>::random(I,J);
116  auto A = Matrix<Number>::random(I,K);
117  auto B = Matrix<Number>::random(K,J);
118  Matrix<Number> D = C;
119  gemm_inplace(D,A,'C',B,'C',alpha,beta);
120  Precision error = frobenius(beta*C+alpha*conjugate(A)*conjugate(B)-D);
121  myra::out() << " |gemm('C','C')| = " << error << std::endl;
122  REQUIRE(error < tolerance);
123  }
124 
125  }
126 
127 } // namespace
128 
129 ADD_TEST("cgemmC","[dense][blas]")
130  { test<NumberS> (20,12,17,1.0e-4f); }
131 
132 ADD_TEST("zgemmC","[dense][blas]")
133  { test<NumberD> (20,12,17,1.0e-10); }
134 
Returns a conjugated copy of a Matrix or Vector. Or, conjugate one inplace.
Tabulates an IxJ matrix. Allows random access, has column major layout to be compatible with BLAS/LAP...
Definition: bdsqr.h:20
Routines for computing Frobenius norms of various algebraic containers.
static Matrix< Number > random(int I, int J)
Generates a random Matrix of specified size.
Definition: Matrix.cpp:353
Definition: syntax.dox:1
Returns a transposed copy of a Matrix. The inplace version only works on a square operand...
Various utility functions/classes related to scalar Number types.
General purpose dense matrix container, O(i*j) storage.
Returns a hermitian copy of a Matrix. The inplace version only works on a square operand.
Simplistic random number functions.
Variety of routines all for dense Matrix*Matrix multiplies. Delegates to the BLAS.


Results: [PASS]

std::complex<float>
|gemm('C','N')| = 5.28042e-06
|gemm('C','T')| = 2.97628e-06
|gemm('C','H')| = 3.02914e-06
|gemm('N','C')| = 5.20144e-06
|gemm('T','C')| = 2.79814e-06
|gemm('H','C')| = 2.62966e-06
|gemm('C','C')| = 2.94807e-06


Go back to Summary of /test programs.