26 #include <tests/myratest.h> 36 myra::out() << typestring<Number>() << std::endl;
40 Number alpha = random<Number>();
41 Number beta = random<Number>();
43 auto options = Options::create().set_nthreads(4).set_blocksize(128);
47 auto C_parallel = C_serial;
48 syr2k_inplace(C_serial,
'U',A,B,
'N',alpha,beta);
49 psyr2k_inplace(C_parallel,
'U',A,B,
'N',alpha,beta,options);
50 Precision error = frobenius(C_serial-C_parallel) / frobenius(C_serial);
51 myra::out() <<
" |syr2k('U','N')-psyr2k('U','N')| = " << error << std::endl;
52 REQUIRE(error < tolerance);
57 auto C_parallel = C_serial;
58 syr2k_inplace(C_serial,
'U',A,B,
'T',alpha,beta);
59 psyr2k_inplace(C_parallel,
'U',A,B,
'T',alpha,beta,options);
60 Precision error = frobenius(C_serial-C_parallel) / frobenius(C_serial);
61 myra::out() <<
" |syr2k('U','T')-psyr2k('U','T')| = " << error << std::endl;
62 REQUIRE(error < tolerance);
67 auto C_parallel = C_serial;
68 syr2k_inplace(C_serial,
'U',A,B,
'H',alpha,beta);
69 psyr2k_inplace(C_parallel,
'U',A,B,
'H',alpha,beta,options);
70 Precision error = frobenius(C_serial-C_parallel) / frobenius(C_serial);
71 myra::out() <<
" |syr2k('U','H')-psyr2k('U','H')| = " << error << std::endl;
72 REQUIRE(error < tolerance);
77 auto C_parallel = C_serial;
78 syr2k_inplace(C_serial,
'U',A,B,
'C',alpha,beta);
79 psyr2k_inplace(C_parallel,
'U',A,B,
'C',alpha,beta,options);
80 Precision error = frobenius(C_serial-C_parallel) / frobenius(C_serial);
81 myra::out() <<
" |syr2k('U','C')-psyr2k('U','C')| = " << error << std::endl;
82 REQUIRE(error < tolerance);
87 auto C_parallel = C_serial;
88 syr2k_inplace(C_serial,
'L',A,B,
'N',alpha,beta);
89 psyr2k_inplace(C_parallel,
'L',A,B,
'N',alpha,beta,options);
90 Precision error = frobenius(C_serial-C_parallel) / frobenius(C_serial);
91 myra::out() <<
" |syr2k('L','N')-psyr2k('L','N')| = " << error << std::endl;
92 REQUIRE(error < tolerance);
97 auto C_parallel = C_serial;
98 syr2k_inplace(C_serial,
'L',A,B,
'T',alpha,beta);
99 psyr2k_inplace(C_parallel,
'L',A,B,
'T',alpha,beta,options);
100 Precision error = frobenius(C_serial-C_parallel) / frobenius(C_serial);
101 myra::out() <<
" |syr2k('L','T')-psyr2k('L','T')| = " << error << std::endl;
102 REQUIRE(error < tolerance);
107 auto C_parallel = C_serial;
108 syr2k_inplace(C_serial,
'L',A,B,
'H',alpha,beta);
109 psyr2k_inplace(C_parallel,
'L',A,B,
'H',alpha,beta,options);
110 Precision error = frobenius(C_serial-C_parallel) / frobenius(C_serial);
111 myra::out() <<
" |syr2k('L','H')-psyr2k('L','H')| = " << error << std::endl;
112 REQUIRE(error < tolerance);
117 auto C_parallel = C_serial;
118 syr2k_inplace(C_serial,
'L',A,B,
'C',alpha,beta);
119 psyr2k_inplace(C_parallel,
'L',A,B,
'C',alpha,beta,options);
120 Precision error = frobenius(C_serial-C_parallel) / frobenius(C_serial);
121 myra::out() <<
" |syr2k('L','C')-psyr2k('L','C')| = " << error << std::endl;
122 REQUIRE(error < tolerance);
128 ADD_TEST(
"psyr2k1",
"[pdense][parallel]")
132 test<NumberS>(I,J,1.0e-4f);
133 test<NumberD>(I,J,1.0e-8);
134 test<NumberC>(I,J,1.0e-4f);
135 test<NumberZ>(I,J,1.0e-8);
Interface class for representing subranges of dense Matrix's.
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
Options pack for routines in /pdense.
Definition: Options.h:24
Thread parallel version of dense/syr2k.h, symmetric rank-2k updates.
Various utility functions/classes related to scalar Number types.
Routines for symmetric rank-2k updates, a specialized form of Matrix*Matrix multiplication.
General purpose dense matrix container, O(i*j) storage.
Options pack for routines in /pdense.
Reflects Precision trait for a Number, scalar Number types should specialize it.
Definition: Number.h:33
Simplistic random number functions.
float
|syr2k('U','N')-psyr2k('U','N')| = 0
|syr2k('U','T')-psyr2k('U','T')| = 0
|syr2k('U','H')-psyr2k('U','H')| = 0
|syr2k('U','C')-psyr2k('U','C')| = 0
|syr2k('L','N')-psyr2k('L','N')| = 0
|syr2k('L','T')-psyr2k('L','T')| = 0
|syr2k('L','H')-psyr2k('L','H')| = 0
|syr2k('L','C')-psyr2k('L','C')| = 0
double
|syr2k('U','N')-psyr2k('U','N')| = 8.3411e-17
|syr2k('U','T')-psyr2k('U','T')| = 9.20089e-17
|syr2k('U','H')-psyr2k('U','H')| = 9.28165e-17
|syr2k('U','C')-psyr2k('U','C')| = 8.31664e-17
|syr2k('L','N')-psyr2k('L','N')| = 8.24957e-17
|syr2k('L','T')-psyr2k('L','T')| = 9.43654e-17
|syr2k('L','H')-psyr2k('L','H')| = 9.2076e-17
|syr2k('L','C')-psyr2k('L','C')| = 8.36162e-17
std::complex<float>
|syr2k('U','N')-psyr2k('U','N')| = 4.36527e-07
|syr2k('U','T')-psyr2k('U','T')| = 2.31796e-07
|syr2k('U','H')-psyr2k('U','H')| = 2.3324e-07
|syr2k('U','C')-psyr2k('U','C')| = 4.34767e-07
|syr2k('L','N')-psyr2k('L','N')| = 4.35292e-07
|syr2k('L','T')-psyr2k('L','T')| = 2.31858e-07
|syr2k('L','H')-psyr2k('L','H')| = 2.32433e-07
|syr2k('L','C')-psyr2k('L','C')| = 4.35492e-07
std::complex<double>
|syr2k('U','N')-psyr2k('U','N')| = 7.07725e-16
|syr2k('U','T')-psyr2k('U','T')| = 6.20944e-16
|syr2k('U','H')-psyr2k('U','H')| = 6.16655e-16
|syr2k('U','C')-psyr2k('U','C')| = 7.04595e-16
|syr2k('L','N')-psyr2k('L','N')| = 7.09921e-16
|syr2k('L','T')-psyr2k('L','T')| = 6.18105e-16
|syr2k('L','H')-psyr2k('L','H')| = 6.19239e-16
|syr2k('L','C')-psyr2k('L','C')| = 7.06222e-16