int main() { try { boost::fibers::use_scheduling_algorithm< boost::fibers::algo::shared_work >(); unsigned int n = std::thread::hardware_concurrency(); barrier b( n); boost::fibers::numa::pin_thread( n - 1); std::size_t size{ 1000000 }; std::size_t div{ 10 }; std::vector< std::thread > threads; for ( unsigned int i = 1; i < n; ++i) { threads.emplace_back( thread, i - 1, & b); }; // Windows 10 and FreeBSD require a fiber stack of 8kb // otherwise the stack gets exhausted // stack requirements must be checked for other OS too #if BOOST_OS_WINDOWS || BOOST_OS_BSD allocator_type salloc{ 2*allocator_type::traits_type::page_size() }; #else allocator_type salloc{ allocator_type::traits_type::page_size() }; #endif std::uint64_t result{ 0 }; channel_type rc{ 2 }; b.wait(); time_point_type start{ clock_type::now() }; skynet( salloc, rc, 0, size, div); result = rc.value_pop(); if ( 499999500000 != result) { throw std::runtime_error("invalid result"); } auto duration = clock_type::now() - start; lock_type lk( mtx); done = true; lk.unlock(); cnd.notify_all(); for ( std::thread & t : threads) { t.join(); } std::cout << "duration: " << duration.count() / 1000000 << " ms" << std::endl; return EXIT_SUCCESS; } catch ( std::exception const& e) { std::cerr << "exception: " << e.what() << std::endl; } catch (...) { std::cerr << "unhandled exception" << std::endl; } return EXIT_FAILURE; }
int main() { try { boost::fibers::use_scheduling_algorithm< boost::fibers::algo::shared_work >(); unsigned int n = std::thread::hardware_concurrency(); barrier b( n); bind_to_processor( n - 1); std::size_t size{ 1000000 }; std::size_t div{ 10 }; std::vector< std::thread > threads; for ( unsigned int i = 1; i < n; ++i) { threads.push_back( std::thread( thread, i - 1, & b) ); }; allocator_type salloc{ allocator_type::traits_type::page_size() }; std::uint64_t result{ 0 }; duration_type duration{ duration_type::zero() }; channel_type rc{ 2 }; b.wait(); time_point_type start{ clock_type::now() }; skynet( salloc, rc, 0, size, div); result = rc.value_pop(); duration = clock_type::now() - start; std::cout << "Result: " << result << " in " << duration.count() / 1000000 << " ms" << std::endl; lock_type lk( mtx); done = true; lk.unlock(); cnd.notify_all(); for ( std::thread & t : threads) { t.join(); } std::cout << "done." << std::endl; return EXIT_SUCCESS; } catch ( std::exception const& e) { std::cerr << "exception: " << e.what() << std::endl; } catch (...) { std::cerr << "unhandled exception" << std::endl; } return EXIT_FAILURE; }
void notify_all_fn( boost::fibers::condition_variable_any & cond) { cond.notify_all(); }