MyraMath
psyrk2


Source: tests/pdense/psyrk2.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/syrk.h>
22 
23 // Parallel algorithms.
24 #include <myramath/pdense/psyrk.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.
40  auto A = Matrix<Number>::random(I,J);
41  Number alpha = random<Number>();
42  Number beta = random<Number>();
43  // Initialize options.
44  auto options = Options::create().set_nthreads(4).set_blocksize(128);
45  // Check syrk('N')
46  {
47  auto C_serial = LowerMatrix<Number>::random(I);
48  auto C_parallel = C_serial;
49  syrk_inplace(C_serial,A,'N',alpha,beta);
50  psyrk_inplace(C_parallel,A,'N',alpha,beta,options);
51  Precision error = frobenius(C_serial-C_parallel) / frobenius(C_serial);
52  myra::out() << " |syrk('N')-psyrk('N')| = " << error << std::endl;
53  REQUIRE(error < tolerance);
54  }
55  // Check syrk('T')
56  {
57  auto C_serial = LowerMatrix<Number>::random(J);
58  auto C_parallel = C_serial;
59  syrk_inplace(C_serial,A,'T',alpha,beta);
60  psyrk_inplace(C_parallel,A,'T',alpha,beta,options);
61  Precision error = frobenius(C_serial-C_parallel) / frobenius(C_serial);
62  myra::out() << " |syrk('T')-psyrk('T')| = " << error << std::endl;
63  REQUIRE(error < tolerance);
64  }
65  // Check syrk('H')
66  {
67  auto C_serial = LowerMatrix<Number>::random(J);
68  auto C_parallel = C_serial;
69  syrk_inplace(C_serial,A,'H',alpha,beta);
70  psyrk_inplace(C_parallel,A,'H',alpha,beta,options);
71  Precision error = frobenius(C_serial-C_parallel) / frobenius(C_serial);
72  myra::out() << " |syrk('H')-psyrk('H')| = " << error << std::endl;
73  REQUIRE(error < tolerance);
74  }
75  // Check syrk('C')
76  {
77  auto C_serial = LowerMatrix<Number>::random(I);
78  auto C_parallel = C_serial;
79  syrk_inplace(C_serial,A,'C',alpha,beta);
80  psyrk_inplace(C_parallel,A,'C',alpha,beta,options);
81  Precision error = frobenius(C_serial-C_parallel) / frobenius(C_serial);
82  myra::out() << " |syrk('C')-psyrk('C')| = " << error << std::endl;
83  REQUIRE(error < tolerance);
84  }
85  }
86 
87 } // namespace
88 
89 ADD_TEST("psyrk2","[pdense][parallel]")
90  {
91  int I = 512;
92  int J = 256;
93  test<NumberS>(I,J,1.0e-4f);
94  test<NumberD>(I,J,1.0e-8);
95  test<NumberC>(I,J,1.0e-4f);
96  test<NumberZ>(I,J,1.0e-8);
97  }
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
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.
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.
Routines for symmetric rank-k updates, a specialized form of Matrix*Matrix multiplication.
Thread parallel version of dense/syrk.h, symmetric rank-k updates.
static LowerMatrix< Number > random(int N)
Generates a random LowerMatrix of specified size.
Definition: LowerMatrix.cpp:249


Results: [PASS]

float
|syrk('N')-psyrk('N')| = 0
|syrk('T')-psyrk('T')| = 0
|syrk('H')-psyrk('H')| = 0
|syrk('C')-psyrk('C')| = 0
double
|syrk('N')-psyrk('N')| = 0
|syrk('T')-psyrk('T')| = 0
|syrk('H')-psyrk('H')| = 0
|syrk('C')-psyrk('C')| = 0
std::complex<float>
|syrk('N')-psyrk('N')| = 0
|syrk('T')-psyrk('T')| = 0
|syrk('H')-psyrk('H')| = 0
|syrk('C')-psyrk('C')| = 0
std::complex<double>
|syrk('N')-psyrk('N')| = 0
|syrk('T')-psyrk('T')| = 0
|syrk('H')-psyrk('H')| = 0
|syrk('C')-psyrk('C')| = 0


Go back to Summary of /test programs.