27 #include <tests/myratest.h>    35 template<
class Precision> 
void test(
int I, 
int J, Precision tolerance)
    37   typedef std::complex<Precision> Number;
    38   myra::out() << typestring<Number>() << std::endl;
    41   Precision alpha = random<Precision>();
    42   Precision beta = random<Precision>();
    44   auto options = Options::create().set_nthreads(4).set_blocksize(128);
    48     C_serial = C_serial + hermitian(C_serial);
    49     auto C_parallel = C_serial;
    50     herk_inplace(C_serial,
'U',A,
'N',alpha,beta);
    51     pherk_inplace(C_parallel,
'U',A,
'N',alpha,beta,options);
    52     Precision error = frobenius(C_serial-C_parallel) / frobenius(C_serial);
    53     myra::out() << 
"  |herk('U','N')-pherk('U','N')| = " << error << std::endl;
    54     REQUIRE(error < tolerance);
    59     C_serial = C_serial + hermitian(C_serial);
    60     auto C_parallel = C_serial;
    61     herk_inplace(C_serial,
'U',A,
'T',alpha,beta);
    62     pherk_inplace(C_parallel,
'U',A,
'T',alpha,beta,options);
    63     Precision error = frobenius(C_serial-C_parallel) / frobenius(C_serial);
    64     myra::out() << 
"  |herk('U','T')-pherk('U','T')| = " << error << std::endl;
    65     REQUIRE(error < tolerance);
    70     C_serial = C_serial + hermitian(C_serial);
    71     auto C_parallel = C_serial;
    72     herk_inplace(C_serial,
'U',A,
'H',alpha,beta);
    73     pherk_inplace(C_parallel,
'U',A,
'H',alpha,beta,options);
    74     Precision error = frobenius(C_serial-C_parallel) / frobenius(C_serial);
    75     myra::out() << 
"  |herk('U','H')-pherk('U','H')| = " << error << std::endl;
    76     REQUIRE(error < tolerance);
    81     C_serial = C_serial + hermitian(C_serial);
    82     auto C_parallel = C_serial;
    83     herk_inplace(C_serial,
'U',A,
'C',alpha,beta);
    84     pherk_inplace(C_parallel,
'U',A,
'C',alpha,beta,options);
    85     Precision error = frobenius(C_serial-C_parallel) / frobenius(C_serial);
    86     myra::out() << 
"  |herk('U','C')-pherk('U','C')| = " << error << std::endl;
    87     REQUIRE(error < tolerance);
    92     C_serial = C_serial + hermitian(C_serial);
    93     auto C_parallel = C_serial;
    94     herk_inplace(C_serial,
'L',A,
'N',alpha,beta);
    95     pherk_inplace(C_parallel,
'L',A,
'N',alpha,beta);
    96     Precision error = frobenius(C_serial-C_parallel) / frobenius(C_serial);
    97     myra::out() << 
"  |herk('L','N')-pherk('L','N')| = " << error << std::endl;
    98     REQUIRE(error < tolerance);
   103     C_serial = C_serial + hermitian(C_serial);
   104     auto C_parallel = C_serial;
   105     herk_inplace(C_serial,
'L',A,
'T',alpha,beta);
   106     pherk_inplace(C_parallel,
'L',A,
'T',alpha,beta);
   107     Precision error = frobenius(C_serial-C_parallel) / frobenius(C_serial);
   108     myra::out() << 
"  |herk('L','T')-pherk('L','T')| = " << error << std::endl;
   109     REQUIRE(error < tolerance);
   114     C_serial = C_serial + hermitian(C_serial);
   115     auto C_parallel = C_serial;
   116     herk_inplace(C_serial,
'L',A,
'H',alpha,beta);
   117     pherk_inplace(C_parallel,
'L',A,
'H',alpha,beta);
   118     Precision error = frobenius(C_serial-C_parallel) / frobenius(C_serial);
   119     myra::out() << 
"  |herk('L','H')-pherk('L','H')| = " << error << std::endl;
   120     REQUIRE(error < tolerance);
   125     C_serial = C_serial + hermitian(C_serial);
   126     auto C_parallel = C_serial;
   127     herk_inplace(C_serial,
'L',A,
'C',alpha,beta);
   128     pherk_inplace(C_parallel,
'L',A,
'C',alpha,beta);
   129     Precision error = frobenius(C_serial-C_parallel) / frobenius(C_serial);
   130     myra::out() << 
"  |herk('L','C')-pherk('L','C')| = " << error << std::endl;
   131     REQUIRE(error < tolerance);
   137 ADD_TEST(
"pherk1",
"[pdense][parallel]")
   141   test<float > (I,J,1.0e-4f);
   142   test<double> (I,J,1.0e-8);
 Interface class for representing subranges of dense Matrix's. 
Routines for hermitian rank-k updates, a specialized form of Matrix*Matrix multiplication. 
Routines for computing Frobenius norms of various algebraic containers. 
Thread parallel version of dense/herk.h, hermitian rank-k updates. 
static Matrix< Number > random(int I, int J)
Generates a random Matrix of specified size. 
Definition: Matrix.cpp:353
Options pack for routines in /pdense. 
Definition: Options.h:24
Various utility functions/classes related to scalar Number types. 
General purpose dense matrix container, O(i*j) storage. 
Options pack for routines in /pdense. 
Returns a hermitian copy of a Matrix. The inplace version only works on a square operand. 
Simplistic random number functions. 
std::complex<float>
  |herk('U','N')-pherk('U','N')| = 0
  |herk('U','T')-pherk('U','T')| = 0
  |herk('U','H')-pherk('U','H')| = 0
  |herk('U','C')-pherk('U','C')| = 0
  |herk('L','N')-pherk('L','N')| = 0
  |herk('L','T')-pherk('L','T')| = 0
  |herk('L','H')-pherk('L','H')| = 0
  |herk('L','C')-pherk('L','C')| = 0
std::complex<double>
  |herk('U','N')-pherk('U','N')| = 0
  |herk('U','T')-pherk('U','T')| = 0
  |herk('U','H')-pherk('U','H')| = 0
  |herk('U','C')-pherk('U','C')| = 0
  |herk('L','N')-pherk('L','N')| = 0
  |herk('L','T')-pherk('L','T')| = 0
  |herk('L','H')-pherk('L','H')| = 0
  |herk('L','C')-pherk('L','C')| = 0