• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 //          Copyright Oliver Kowalke 2015.
3 // Distributed under the Boost Software License, Version 1.0.
4 //    (See accompanying file LICENSE_1_0.txt or copy at
5 //          http://www.boost.org/LICENSE_1_0.txt)
6 
7 // based on https://github.com/atemerev/skynet from Alexander Temerev
8 
9 #include <algorithm>
10 #include <cassert>
11 #include <chrono>
12 #include <condition_variable>
13 #include <cstddef>
14 #include <cstdint>
15 #include <cstdlib>
16 #include <queue>
17 #include <future>
18 #include <iostream>
19 #include <memory>
20 #include <mutex>
21 #include <numeric>
22 #include <random>
23 #include <sstream>
24 #include <vector>
25 
26 #include "buffered_channel.hpp"
27 
28 using channel_type = buffered_channel< std::uint64_t >;
29 using clock_type = std::chrono::steady_clock;
30 using duration_type = clock_type::duration;
31 using time_point_type = clock_type::time_point;
32 
33 // microbenchmark
skynet(std::uint64_t num,std::uint64_t size,std::uint64_t div)34 std::uint64_t skynet( std::uint64_t num, std::uint64_t size, std::uint64_t div)
35 {
36     if ( size != 1){
37         size /= div;
38 
39         std::vector<std::future<std::uint64_t> > results;
40         results.reserve( div);
41 
42         for ( std::uint64_t i = 0; i != div; ++i) {
43             std::uint64_t sub_num = num + i * size;
44             results.emplace_back(
45                 std::async( skynet, sub_num, size, div) );
46         }
47 
48         std::uint64_t sum = 0;
49         for ( auto& f : results)
50             sum += f.get();
51 
52         return sum;
53     }
54 
55     return num;
56 }
57 
main()58 int main() {
59     try {
60         std::size_t size{ 10000 };
61         std::size_t div{ 10 };
62         std::uint64_t result{ 0 };
63         duration_type duration{ duration_type::zero() };
64         time_point_type start{ clock_type::now() };
65         result = skynet( 0, size, div);
66         duration = clock_type::now() - start;
67         std::cout << "Result: " << result << " in " << duration.count() / 1000000 << " ms" << std::endl;
68         std::cout << "done." << std::endl;
69         return EXIT_SUCCESS;
70     } catch ( std::exception const& e) {
71         std::cerr << "exception: " << e.what() << std::endl;
72     } catch (...) {
73         std::cerr << "unhandled exception" << std::endl;
74     }
75 	return EXIT_FAILURE;
76 }
77