perf_random_number_engine.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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://boostorg.github.com/compute for more information.
  9. //---------------------------------------------------------------------------//
  10. #include <iostream>
  11. #include <vector>
  12. #include <boost/program_options.hpp>
  13. #include <boost/compute/container/vector.hpp>
  14. #include <boost/compute/core.hpp>
  15. #include <boost/compute/random.hpp>
  16. #include "perf.hpp"
  17. namespace compute = boost::compute;
  18. namespace po = boost::program_options;
  19. template<class Engine>
  20. void perf_random_number_engine(const size_t size,
  21. const size_t trials,
  22. compute::command_queue& queue)
  23. {
  24. typedef typename Engine::result_type T;
  25. // create random number engine
  26. Engine engine(queue);
  27. // create vector on the device
  28. std::cout << "size = " << size << std::endl;
  29. compute::vector<T> vector(size, queue.get_context());
  30. // generate random numbers
  31. perf_timer t;
  32. for(size_t i = 0; i < trials; i++){
  33. t.start();
  34. engine.generate(vector.begin(), vector.end(), queue);
  35. queue.finish();
  36. t.stop();
  37. }
  38. // print result
  39. std::cout << "time: " << t.min_time() / 1e6 << " ms" << std::endl;
  40. std::cout << "rate: " << perf_rate<T>(size, t.min_time()) << " MB/s" << std::endl;
  41. }
  42. int main(int argc, char *argv[])
  43. {
  44. // setup and parse command line options
  45. po::options_description options("options");
  46. options.add_options()
  47. ("help", "show usage instructions")
  48. ("size", po::value<size_t>()->default_value(8192), "number of values")
  49. ("trials", po::value<size_t>()->default_value(3), "number of trials")
  50. ("engine", po::value<std::string>()->default_value("default_random_engine"), "random number engine")
  51. ;
  52. po::variables_map vm;
  53. po::store(po::parse_command_line(argc, argv, options), vm);
  54. po::notify(vm);
  55. if(vm.count("help")) {
  56. std::cout << options << std::endl;
  57. return 0;
  58. }
  59. // setup context and queue for the default device
  60. compute::device device = compute::system::default_device();
  61. compute::context context(device);
  62. compute::command_queue queue(context, device);
  63. // get command line options
  64. const size_t size = vm["size"].as<size_t>();
  65. const size_t trials = vm["trials"].as<size_t>();
  66. const std::string& engine = vm["engine"].as<std::string>();
  67. // run benchmark
  68. if(engine == "default_random_engine"){
  69. perf_random_number_engine<compute::default_random_engine>(size, trials, queue);
  70. }
  71. else if(engine == "mersenne_twister_engine"){
  72. perf_random_number_engine<compute::mt19937>(size, trials, queue);
  73. }
  74. else if(engine == "linear_congruential_engine"){
  75. perf_random_number_engine<compute::linear_congruential_engine<> >(size, trials, queue);
  76. }
  77. else if(engine == "threefry_engine"){
  78. perf_random_number_engine<compute::threefry_engine<> >(size, trials, queue);
  79. }
  80. else {
  81. std::cerr << "error: unknown random number engine '" << engine << "'" << std::endl;
  82. return -1;
  83. }
  84. return 0;
  85. }