21 #define BOOST_TEST_MODULE libjmmcg_tests
22 #include <boost/test/included/unit_test.hpp>
24 #include <boost/mpl/list.hpp>
26 #include "core/thread_pool_sequential.hpp"
27 #include "core/thread_pool_workers.hpp"
29 #include <boost/graph/graphviz.hpp>
34 using namespace libjmmcg;
40 struct erew_normal_fifo_t {
64 struct erew_normal_lifo_t {
88 struct erew_priority_queue_t {
214 typedef boost::mpl::list<
215 crew_normal_fifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
216 crew_normal_fifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 1>,
218 crew_normal_fifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 2>,
219 crew_normal_fifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 4>,
220 crew_normal_fifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 8>,
221 crew_normal_fifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 12>
222 > finite_fifo_test_types;
224 typedef boost::mpl::list<
225 crew_normal_lifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
226 crew_normal_lifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 1>,
227 crew_normal_lifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 2>,
228 crew_normal_lifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 4>,
229 crew_normal_lifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 8>,
230 crew_normal_lifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 12>
233 > finite_lifo_test_types;
236 auto const &bt=api_threading_traits<platform_api, sequential_mode>::gen_backtrace();
237 std::cerr<<bt.begin()<<std::endl;
250 BOOST_AUTO_TEST_SUITE(thread_pool_tests)
252 BOOST_AUTO_TEST_SUITE(joinable_dataflow)
254 BOOST_AUTO_TEST_SUITE(finite)
256 BOOST_AUTO_TEST_SUITE(n_elements)
278 BOOST_AUTO_TEST_CASE_TEMPLATE(accumulate, T, finite_lifo_test_types) {
279 typedef typename T::vtr_colln_t vtr_colln_t;
280 typedef typename T::pool_type pool_type;
282 #ifdef JMMCG_PERFORMANCE_TESTS
283 const unsigned long test_size=2<<10;
284 const unsigned long num_reps=10000000;
286 const unsigned long test_size=2<<3;
287 const unsigned long num_reps=2;
290 pool_type pool(T::pool_size);
291 std::cout<<
"Pool="<<pool.pool_size()<<
std::flush;
293 v.reserve(test_size);
294 std::mt19937_64 gen(42);
295 std::uniform_int_distribution<
typename vtr_colln_t::value_type> distribution(0,
std::numeric_limits<
typename vtr_colln_t::value_type>::max()/(test_size+1));
296 std::generate_n(
std::back_inserter(v.colln()), test_size,
std::bind(distribution, gen));
298 const typename vtr_colln_t::value_type res_chk=
std::accumulate(v.colln().begin(), v.colln().end(),
typename vtr_colln_t::value_type());
299 std::cout<<
", items="<<v.size()<<
std::flush;
300 const std::pair<timed_results_t,
bool> timed_results(compute_average_deviation<timed_results_t::value_type>(
303 [&pool, res_chk, &v]() {
304 typedef typename pool_type::joinable joinable;
306 typename vtr_colln_t::value_type res;
307 const auto t1=std::chrono::high_resolution_clock::now();
308 auto const &context=pool<<joinable()<<pool.accumulate(v,
typename vtr_colln_t::value_type());
310 const auto t2=std::chrono::high_resolution_clock::now();
311 BOOST_CHECK_EQUAL(res, res_chk);
312 return timed_results_t::value_type(std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count())/1000000;
315 std::cout<<
", time taken: "<<timed_results.first<<
" sec."<<std::endl;
316 std::cout<<pool.statistics()<<
std::endl;
317 std::ofstream ofs(
"accumulate.dot");
318 pool.cfg().write_graphviz(ofs);
319 #ifdef JMMCG_PERFORMANCE_TESTS
337 BOOST_AUTO_TEST_CASE_TEMPLATE(merge, T, finite_lifo_test_types) {
338 typedef typename T::vtr_colln_t vtr_colln_t;
339 typedef typename T::pool_type pool_type;
341 #ifdef JMMCG_PERFORMANCE_TESTS
342 const unsigned long test_size=2<<25;
343 const unsigned long num_reps=2000;
345 const unsigned long test_size=2<<3;
346 const unsigned long num_reps=2;
348 pool_type pool(T::pool_size);
349 std::cout<<
"Pool="<<pool.pool_size()<<
std::flush;
351 v.reserve(test_size);
352 v1.reserve(test_size);
353 std::mt19937_64 gen(42);
354 std::uniform_int_distribution<
typename vtr_colln_t::value_type> distribution(0,
std::numeric_limits<
typename vtr_colln_t::value_type>::max()/test_size);
355 std::generate_n(
std::back_inserter(v.colln()), test_size,
std::bind(distribution, gen));
357 std::sort(v.colln().begin(), v.colln().end());
358 std::generate_n(
std::back_inserter(v1.colln()), test_size,
std::bind(distribution, gen));
360 std::sort(v1.colln().begin(), v1.colln().end());
363 v_out.colln().reserve(v.size()+v1.size());
364 v_out.resize_noinit_nolk(v.size()+v1.size());
366 v_chk.colln().reserve(v.size()+v1.size());
367 std::merge(v.colln().begin(), v.colln().end(), v1.colln().begin(), v1.colln().end(),
std::back_inserter(v_chk.colln()));
369 std::cout<<
", items="<<(v.size()+v1.size())<<
std::flush;
370 const std::pair<timed_results_t,
bool> timed_results(compute_average_deviation<timed_results_t::value_type>(
373 [&pool, &v_chk, &v, &v1, &v_out]() {
374 typedef typename pool_type::joinable joinable;
376 const auto t1=std::chrono::high_resolution_clock::now();
377 auto const &context=pool<<joinable()<<pool.merge(v, v1, v_out);
379 const auto t2=std::chrono::high_resolution_clock::now();
380 BOOST_CHECK_EQUAL(v_out.size(), v_chk.size());
381 BOOST_CHECK(v_out==v_chk);
382 return timed_results_t::value_type(std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count())/1000000;
385 std::cout<<
", time taken: "<<timed_results.first<<
" sec."<<std::endl;
386 std::cout<<pool.statistics()<<
std::endl;
387 std::ofstream ofs(
"merge.dot");
388 pool.cfg().write_graphviz(ofs);
389 #ifdef JMMCG_PERFORMANCE_TESTS
390 BOOST_CHECK(!timed_results.second);
407 BOOST_AUTO_TEST_CASE_TEMPLATE(sort_unsorted, T, finite_lifo_test_types) {
408 typedef typename T::vtr_colln_t vtr_colln_t;
409 typedef typename T::pool_type pool_type;
411 #ifdef JMMCG_PERFORMANCE_TESTS
412 const unsigned long test_size=2<<25;
413 const unsigned long num_reps=2000;
415 const unsigned long test_size=2<<3;
416 const unsigned long num_reps=2;
418 pool_type pool(T::pool_size);
419 std::cout<<
"Pool="<<pool.pool_size()<<
std::flush;
421 v.reserve(test_size);
422 std::mt19937_64 gen(42);
423 std::uniform_int_distribution<
typename vtr_colln_t::value_type> distribution(0,
std::numeric_limits<
typename vtr_colln_t::value_type>::max()/test_size);
424 std::generate_n(
std::back_inserter(v.colln()), test_size,
std::bind(distribution, gen));
425 vtr_colln_t v_chk(v);
428 std::sort(v_chk.colln().begin(), v_chk.colln().end());
429 std::cout<<
", items="<<v.size()<<
std::flush;
430 const std::pair<timed_results_t,
bool> timed_results(compute_average_deviation<timed_results_t::value_type>(
433 [&pool, &v_chk, &v]() {
434 typedef typename pool_type::joinable joinable;
436 const auto t1=std::chrono::high_resolution_clock::now();
437 auto const &context=pool<<joinable()<<pool.sort(v);
439 const auto t2=std::chrono::high_resolution_clock::now();
440 BOOST_CHECK(v==v_chk);
441 return timed_results_t::value_type(std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count())/1000000;
444 std::cout<<
", time taken: "<<timed_results.first<<
" sec."<<std::endl;
445 std::cout<<pool.statistics()<<
std::endl;
446 std::ofstream ofs(
"sort.dot");
447 pool.cfg().write_graphviz(ofs);
448 #ifdef JMMCG_PERFORMANCE_TESTS
449 BOOST_CHECK(!timed_results.second);
453 BOOST_AUTO_TEST_SUITE_END()
455 BOOST_AUTO_TEST_SUITE_END()
457 BOOST_AUTO_TEST_SUITE_END()
459 BOOST_AUTO_TEST_SUITE_END()