Skip to content

Commit fca8fcf

Browse files
committed
Merge pull request #436 from kylelutz/perf-random-number-engine
Add perf_random_number_engine benchmark
2 parents cc65c5b + a3cbcc8 commit fca8fcf

File tree

5 files changed

+109
-98
lines changed

5 files changed

+109
-98
lines changed

perf/CMakeLists.txt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,8 @@ set(BENCHMARKS
3030
inner_product
3131
is_permutation
3232
is_sorted
33-
linear_congruential_engine
3433
max_element
3534
merge
36-
mersenne_twister
3735
next_permutation
3836
nth_element
3937
partial_sum
@@ -45,6 +43,7 @@ set(BENCHMARKS
4543
rotate
4644
rotate_copy
4745
host_sort
46+
random_number_engine
4847
saxpy
4948
search
5049
search_n

perf/perf.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,4 +95,14 @@ class perf_timer
9595
std::vector<boost::timer::nanosecond_type> times;
9696
};
9797

98+
// returns the rate (in MB/s) for processing 'count' items of type 'T'
99+
// in 'time' nanoseconds
100+
template<class T>
101+
double perf_rate(const size_t count, perf_timer::nanosecond_type time)
102+
{
103+
const size_t byte_count = count * sizeof(T);
104+
105+
return (double(byte_count) / 1024 / 1024) / (time / 1e9);
106+
}
107+
98108
#endif // PERF_HPP

perf/perf_linear_congruential_engine.cpp

Lines changed: 0 additions & 48 deletions
This file was deleted.

perf/perf_mersenne_twister.cpp

Lines changed: 0 additions & 48 deletions
This file was deleted.

perf/perf_random_number_engine.cpp

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
//---------------------------------------------------------------------------//
2+
// Copyright (c) 2013-2015 Kyle Lutz <kyle.r.lutz@gmail.com>
3+
//
4+
// Distributed under the Boost Software License, Version 1.0
5+
// See accompanying file LICENSE_1_0.txt or copy at
6+
// http://www.boost.org/LICENSE_1_0.txt
7+
//
8+
// See http://kylelutz.github.com/compute for more information.
9+
//---------------------------------------------------------------------------//
10+
11+
#include <iostream>
12+
#include <vector>
13+
14+
#include <boost/program_options.hpp>
15+
16+
#include <boost/compute/container/vector.hpp>
17+
#include <boost/compute/core.hpp>
18+
#include <boost/compute/random.hpp>
19+
20+
#include "perf.hpp"
21+
22+
namespace compute = boost::compute;
23+
namespace po = boost::program_options;
24+
25+
template<class Engine>
26+
void perf_random_number_engine(const size_t size,
27+
const size_t trials,
28+
compute::command_queue& queue)
29+
{
30+
typedef typename Engine::result_type T;
31+
32+
// create random number engine
33+
Engine engine(queue);
34+
35+
// create vector on the device
36+
std::cout << "size = " << size << std::endl;
37+
compute::vector<T> vector(size, queue.get_context());
38+
39+
// generate random numbers
40+
perf_timer t;
41+
for(size_t i = 0; i < trials; i++){
42+
t.start();
43+
engine.generate(vector.begin(), vector.end(), queue);
44+
queue.finish();
45+
t.stop();
46+
}
47+
48+
// print result
49+
std::cout << "time: " << t.min_time() / 1e6 << " ms" << std::endl;
50+
std::cout << "rate: " << perf_rate<T>(size, t.min_time()) << " MB/s" << std::endl;
51+
}
52+
53+
int main(int argc, char *argv[])
54+
{
55+
// setup and parse command line options
56+
po::options_description options("options");
57+
options.add_options()
58+
("help", "show usage instructions")
59+
("size", po::value<size_t>()->default_value(8192), "number of values")
60+
("trials", po::value<size_t>()->default_value(3), "number of trials")
61+
("engine", po::value<std::string>()->default_value("default_random_engine"), "random number engine")
62+
;
63+
po::variables_map vm;
64+
po::store(po::parse_command_line(argc, argv, options), vm);
65+
po::notify(vm);
66+
67+
if(vm.count("help")) {
68+
std::cout << options << std::endl;
69+
return 0;
70+
}
71+
72+
// setup context and queue for the default device
73+
compute::device device = compute::system::default_device();
74+
compute::context context(device);
75+
compute::command_queue queue(context, device);
76+
77+
// get command line options
78+
const size_t size = vm["size"].as<size_t>();
79+
const size_t trials = vm["trials"].as<size_t>();
80+
const std::string& engine = vm["engine"].as<std::string>();
81+
82+
// run benchmark
83+
if(engine == "default_random_engine"){
84+
perf_random_number_engine<compute::default_random_engine>(size, trials, queue);
85+
}
86+
else if(engine == "mersenne_twister_engine"){
87+
perf_random_number_engine<compute::mt19937>(size, trials, queue);
88+
}
89+
else if(engine == "linear_congruential_engine"){
90+
perf_random_number_engine<compute::linear_congruential_engine<> >(size, trials, queue);
91+
}
92+
else {
93+
std::cerr << "error: unknown random number engine '" << engine << "'" << std::endl;
94+
return -1;
95+
}
96+
97+
return 0;
98+
}

0 commit comments

Comments
 (0)