]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/numeric/ublas/benchmarks/reference/outer_prod.cpp
2 // Copyright (c) 2018 Stefan Seefeld
3 // All rights reserved.
5 // This file is part of Boost.uBLAS. It is made available under the
6 // Boost Software License, Version 1.0.
7 // (Consult LICENSE or http://www.boost.org/LICENSE_1_0.txt)
9 #include <boost/numeric/ublas/vector.hpp>
10 #include <boost/program_options.hpp>
11 #include "../init.hpp"
12 #include "../benchmark.hpp"
16 namespace boost
{ namespace numeric
{ namespace ublas
{ namespace benchmark
{
18 template <typename S
> class outer_prod
;
20 template <typename R
, typename V1
, typename V2
>
21 class outer_prod
<R(V1
, V2
)> : public benchmark
24 outer_prod(std::string
const &name
) : benchmark(name
) {}
25 virtual void setup(long l
)
30 virtual void operation(long l
)
32 for (int i
= 0; i
< l
; ++i
)
33 for (int j
= 0; j
< l
; ++j
)
34 c(i
,j
) = - a(i
) * b(j
);
44 namespace po
= boost::program_options
;
45 namespace ublas
= boost::numeric::ublas
;
46 namespace bm
= boost::numeric::ublas::benchmark
;
49 void benchmark(std::string
const &type
)
51 using vector
= ublas::vector
<T
>;
52 using matrix
= ublas::matrix
<T
>;
53 bm::outer_prod
<matrix(vector
, vector
)> p("ref::outer_prod(vector<" + type
+ ">)");
54 p
.run(std::vector
<long>({1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096}));
57 int main(int argc
, char **argv
)
62 po::options_description
desc("Outer product (reference implementation)\n"
64 desc
.add_options()("help,h", "produce help message");
65 desc
.add_options()("type,t", po::value
<std::string
>(), "select value-type (float, double, fcomplex, dcomplex)");
67 po::store(po::parse_command_line(argc
, argv
, desc
), vm
);
72 std::cout
<< desc
<< std::endl
;
76 catch(std::exception
&e
)
78 std::cerr
<< "error: " << e
.what() << std::endl
;
81 std::string type
= vm
.count("type") ? vm
["type"].as
<std::string
>() : "float";
83 benchmark
<float>("float");
84 else if (type
== "double")
85 benchmark
<double>("double");
86 else if (type
== "fcomplex")
87 benchmark
<std::complex<float>>("std::complex<float>");
88 else if (type
== "dcomplex")
89 benchmark
<std::complex<double>>("std::complex<double>");
91 std::cerr
<< "unsupported value-type \"" << vm
["type"].as
<std::string
>() << '\"' << std::endl
;