MyraMath
psyr2k1


Source: tests/pdense/psyr2k1.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>
15 
16 // Serial algorithms.
18 #include <myramath/dense/syr2k.h>
20 
21 // Parallel algorithms.
22 #include <myramath/pdense/psyr2k.h>
24 
25 // Reporting.
26 #include <tests/myratest.h>
27 
28 using namespace myra;
29 typedef pdense::Options Options;
30 
31 namespace {
32 
33 template<class Number> void test(int I, int J, typename ReflectPrecision<Number>::type tolerance)
34  {
35  typedef typename ReflectPrecision<Number>::type Precision;
36  myra::out() << typestring<Number>() << std::endl;
37  // Generate random matrix A and B.
38  auto A = Matrix<Number>::random(I,J);
39  auto B = Matrix<Number>::random(I,J);
40  Number alpha = random<Number>();
41  Number beta = random<Number>();
42  // Initialize options.
43  auto options = Options::create().set_nthreads(4).set_blocksize(128);
44  // Check syr2k('U','N')
45  {
46  auto C_serial = Matrix<Number>::random(I,I);
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);
53  }
54  // Check syr2k('U','T')
55  {
56  auto C_serial = Matrix<Number>::random(J,J);
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);
63  }
64  // Check syr2k('U','H')
65  {
66  auto C_serial = Matrix<Number>::random(J,J);
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);
73  }
74  // Check syr2k('U','C')
75  {
76  auto C_serial = Matrix<Number>::random(I,I);
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);
83  }
84  // Check syr2k('L','N')
85  {
86  auto C_serial = Matrix<Number>::random(I,I);
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);
93  }
94  // Check syr2k('L','T')
95  {
96  auto C_serial = Matrix<Number>::random(J,J);
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);
103  }
104  // Check syr2k('L','H')
105  {
106  auto C_serial = Matrix<Number>::random(J,J);
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);
113  }
114  // Check syr2k('L','C')
115  {
116  auto C_serial = Matrix<Number>::random(I,I);
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);
123  }
124  }
125 
126 } // namespace
127 
128 ADD_TEST("psyr2k1","[pdense][parallel]")
129  {
130  int I = 512;
131  int J = 256;
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);
136  }
Interface class for representing subranges of dense Matrix&#39;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.
Definition: syntax.dox:1
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.


Results: [PASS]

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


Go back to Summary of /test programs.