MyraMath
psyr2k2


Source: tests/pdense/psyr2k2.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>
17 
18 // Serial algorithms.
20 #include <myramath/dense/syr2k.h>
22 
23 // Parallel algorithms.
24 #include <myramath/pdense/psyr2k.h>
26 
27 // Reporting.
28 #include <tests/myratest.h>
29 
30 using namespace myra;
31 typedef pdense::Options Options;
32 
33 namespace {
34 
35 template<class Number> void test(int I, int J, typename ReflectPrecision<Number>::type tolerance)
36  {
37  typedef typename ReflectPrecision<Number>::type Precision;
38  myra::out() << typestring<Number>() << std::endl;
39  // Generate random matrix A and B
40  auto A = Matrix<Number>::random(I,J);
41  auto B = Matrix<Number>::random(I,J);
42  Number alpha = random<Number>();
43  Number beta = random<Number>();
44  // Initialize options.
45  auto options = Options::create().set_nthreads(4).set_blocksize(128);
46  // Check syr2k('N')
47  {
48  auto C_serial = LowerMatrix<Number>::random(I);
49  auto C_parallel = C_serial;
50  syr2k_inplace(C_serial,A,B,'N',alpha,beta);
51  psyr2k_inplace(C_parallel,A,B,'N',alpha,beta,options);
52  Precision error = frobenius(C_serial-C_parallel) / frobenius(C_serial);
53  myra::out() << " |syr2k('N')-psyr2k('N')| = " << error << std::endl;
54  REQUIRE(error < tolerance);
55  }
56  // Check syr2k('T')
57  {
58  auto C_serial = LowerMatrix<Number>::random(J);
59  auto C_parallel = C_serial;
60  syr2k_inplace(C_serial,A,B,'T',alpha,beta);
61  psyr2k_inplace(C_parallel,A,B,'T',alpha,beta,options);
62  Precision error = frobenius(C_serial-C_parallel) / frobenius(C_serial);
63  myra::out() << " |syr2k('T')-psyr2k('T')| = " << error << std::endl;
64  REQUIRE(error < tolerance);
65  }
66  // Check syr2k('H')
67  {
68  auto C_serial = LowerMatrix<Number>::random(J);
69  auto C_parallel = C_serial;
70  syr2k_inplace(C_serial,A,B,'H',alpha,beta);
71  psyr2k_inplace(C_parallel,A,B,'H',alpha,beta,options);
72  Precision error = frobenius(C_serial-C_parallel) / frobenius(C_serial);
73  myra::out() << " |syr2k('H')-psyr2k('H')| = " << error << std::endl;
74  REQUIRE(error < tolerance);
75  }
76  // Check syr2k('C')
77  {
78  auto C_serial = LowerMatrix<Number>::random(I);
79  auto C_parallel = C_serial;
80  syr2k_inplace(C_serial,A,B,'C',alpha,beta);
81  psyr2k_inplace(C_parallel,A,B,'C',alpha,beta,options);
82  Precision error = frobenius(C_serial-C_parallel) / frobenius(C_serial);
83  myra::out() << " |syr2k('C')-psyr2k('C')| = " << error << std::endl;
84  REQUIRE(error < tolerance);
85  }
86  }
87 
88 } // namespace
89 
90 ADD_TEST("psyr2k2","[pdense][parallel]")
91  {
92  int I = 512;
93  int J = 256;
94  test<NumberS>(I,J,1.0e-4f);
95  test<NumberD>(I,J,1.0e-8);
96  test<NumberC>(I,J,1.0e-4f);
97  test<NumberZ>(I,J,1.0e-8);
98  }
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.
Range construct for a lower triangular matrix stored in rectangular packed format.
Definition: syntax.dox:1
Specialized container for a lower triangular matrix, O(N^2/2) storage. Used by symmetry exploiting ma...
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.
static LowerMatrix< Number > random(int N)
Generates a random LowerMatrix of specified size.
Definition: LowerMatrix.cpp:249


Results: [PASS]

float
|syr2k('N')-psyr2k('N')| = 3.14223e-08
|syr2k('T')-psyr2k('T')| = 4.96732e-08
|syr2k('H')-psyr2k('H')| = 4.96986e-08
|syr2k('C')-psyr2k('C')| = 3.10077e-08
double
|syr2k('N')-psyr2k('N')| = 9.72618e-17
|syr2k('T')-psyr2k('T')| = 1.22686e-16
|syr2k('H')-psyr2k('H')| = 1.22986e-16
|syr2k('C')-psyr2k('C')| = 9.79165e-17
std::complex<float>
|syr2k('N')-psyr2k('N')| = 2.66147e-07
|syr2k('T')-psyr2k('T')| = 1.43922e-07
|syr2k('H')-psyr2k('H')| = 1.4367e-07
|syr2k('C')-psyr2k('C')| = 2.68008e-07
std::complex<double>
|syr2k('N')-psyr2k('N')| = 4.68449e-16
|syr2k('T')-psyr2k('T')| = 4.45496e-16
|syr2k('H')-psyr2k('H')| = 4.47783e-16
|syr2k('C')-psyr2k('C')| = 4.60465e-16


Go back to Summary of /test programs.