test_block_indirect_sort.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. //----------------------------------------------------------------------------
  2. /// @file test_block_indirect_sort.cpp
  3. /// @brief Test program of the block_indirect_sort algorithm
  4. ///
  5. /// @author Copyright (c) 2016 Francisco Jose Tapia (fjtapia@gmail.com )\n
  6. /// Distributed under the Boost Software License, Version 1.0.\n
  7. /// ( See accompanying file LICENSE_1_0.txt or copy at
  8. /// http://www.boost.org/LICENSE_1_0.txt )
  9. /// @version 0.1
  10. ///
  11. /// @remarks
  12. //-----------------------------------------------------------------------------
  13. #include <algorithm>
  14. #include <random>
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <time.h>
  18. #include <vector>
  19. #include <ciso646>
  20. #include <boost/test/included/test_exec_monitor.hpp>
  21. #include <boost/test/test_tools.hpp>
  22. #include <boost/sort/sort.hpp>
  23. namespace bsc = boost::sort::common;
  24. namespace bsp = boost::sort;
  25. using boost::sort::block_indirect_sort;
  26. using bsc::range;
  27. // ------------------- vector with 64 bits random numbers --------------------
  28. std::vector< uint64_t > Vrandom;
  29. const uint64_t NELEM = 2000000;
  30. void test1 (void)
  31. {
  32. const uint32_t NElem = 500000;
  33. std::vector< uint64_t > V1;
  34. V1.reserve (NElem);
  35. //------------------ sorted elements 4 threads --------------------------
  36. V1.clear ( );
  37. for (uint32_t i = 0; i < NElem; ++i) V1.push_back (i);
  38. block_indirect_sort ( V1.begin ( ), V1.end ( ), 4);
  39. for (unsigned i = 1; i < NElem; i++)
  40. { BOOST_CHECK (V1[ i - 1 ] <= V1[ i ]);
  41. };
  42. //-------------------- reverse sorted elements 4 threads ------------------
  43. V1.clear ( );
  44. for (uint32_t i = 0; i < NElem; ++i) V1.push_back (NElem - i);
  45. block_indirect_sort ( V1.begin ( ), V1.end ( ), 4);
  46. for (unsigned i = 1; i < NElem; i++)
  47. { BOOST_CHECK (V1[ i - 1 ] <= V1[ i ]);
  48. };
  49. //-------------------- equal elements 4 threads ---------------------------
  50. V1.clear ( );
  51. for (uint32_t i = 0; i < NElem; ++i) V1.push_back (1000);
  52. block_indirect_sort (V1.begin ( ), V1.end ( ), 4);
  53. for (unsigned i = 1; i < NElem; i++)
  54. { BOOST_CHECK (V1[ i - 1 ] == V1[ i ]);
  55. };
  56. //------------------ sorted elements 8 threads --------------------------
  57. V1.clear ( );
  58. for (uint32_t i = 0; i < NElem; ++i) V1.push_back (i);
  59. block_indirect_sort ( V1.begin ( ), V1.end ( ), 8);
  60. for (unsigned i = 1; i < NElem; i++)
  61. { BOOST_CHECK (V1[ i - 1 ] <= V1[ i ]);
  62. };
  63. //-------------------- reverse sorted elements 8 threads ------------------
  64. V1.clear ( );
  65. for (uint32_t i = 0; i < NElem; ++i) V1.push_back (NElem - i);
  66. block_indirect_sort ( V1.begin ( ), V1.end ( ), 8);
  67. for (unsigned i = 1; i < NElem; i++)
  68. { BOOST_CHECK (V1[ i - 1 ] <= V1[ i ]);
  69. };
  70. //-------------------- equal elements 8 threads ---------------------------
  71. V1.clear ( );
  72. for (uint32_t i = 0; i < NElem; ++i) V1.push_back (1000);
  73. block_indirect_sort (V1.begin ( ), V1.end ( ), 8);
  74. for (unsigned i = 1; i < NElem; i++)
  75. { BOOST_CHECK (V1[ i - 1 ] == V1[ i ]);
  76. };
  77. };
  78. void test2 (void)
  79. {
  80. typedef std::less<uint64_t> compare;
  81. std::vector< uint64_t > V1, V2;
  82. V1.reserve ( NELEM ) ;
  83. V2 = Vrandom;
  84. std::sort (V2.begin ( ), V2.end ( ));
  85. //------------------- random elements 0 threads ---------------------------
  86. V1 = Vrandom;
  87. block_indirect_sort (V1.begin ( ), V1.end ( ), compare(), 0);
  88. for (unsigned i = 0; i < V1.size(); i++)
  89. { BOOST_CHECK (V1[i] == V2[i]);
  90. };
  91. //------------------- random elements 4 threads ---------------------------
  92. V1 = Vrandom;
  93. block_indirect_sort (V1.begin ( ), V1.end ( ), compare(), 4);
  94. for (unsigned i = 0; i < V1.size(); i++)
  95. { BOOST_CHECK (V1[i] == V2[i]);
  96. };
  97. //------------------- random elements 8 threads ---------------------------
  98. V1 = Vrandom;
  99. block_indirect_sort (V1.begin ( ), V1.end ( ), compare(), 8);
  100. for (unsigned i = 0; i < V1.size(); i++)
  101. { BOOST_CHECK (V1[i] == V2[i]);
  102. };
  103. //------------------- random elements 16 threads ---------------------------
  104. V1 = Vrandom;
  105. block_indirect_sort ( V1.begin ( ), V1.end ( ), compare(), 16);
  106. for (unsigned i = 0; i < V1.size(); i++)
  107. { BOOST_CHECK (V1[i] == V2[i]);
  108. };
  109. //------------------- random elements 100 threads ---------------------------
  110. V1 = Vrandom;
  111. block_indirect_sort ( V1.begin ( ), V1.end ( ), compare(), 100);
  112. for (unsigned i = 1; i < V1.size(); i++)
  113. { BOOST_CHECK (V1[i] == V2[i]);
  114. };
  115. };
  116. template<uint32_t NN>
  117. struct int_array
  118. {
  119. uint64_t M[NN];
  120. int_array(uint64_t number = 0)
  121. { for (uint32_t i = 0; i < NN; ++i) M[i] = number;
  122. };
  123. bool operator<(const int_array<NN> &A) const
  124. { return M[0] < A.M[0];
  125. };
  126. };
  127. template<class IA>
  128. void test_int_array(uint32_t NELEM)
  129. {
  130. std::vector<IA> V1;
  131. V1.reserve(NELEM);
  132. for (uint32_t i = 0; i < NELEM; ++i)
  133. V1.emplace_back(Vrandom[i]);
  134. bsp::block_indirect_sort(V1.begin(), V1.end());
  135. for (unsigned i = 1; i < NELEM; i++)
  136. { BOOST_CHECK(not (V1[i] < V1[i-1]));
  137. };
  138. };
  139. void test3 (void)
  140. {
  141. test_int_array<int_array<1> >(1u << 20);
  142. test_int_array<int_array<2> >(1u << 19);
  143. test_int_array<int_array<8> >(1u << 17);
  144. }
  145. int test_main (int, char *[])
  146. {
  147. std::mt19937 my_rand (0);
  148. Vrandom.reserve (NELEM);
  149. for (uint32_t i = 0; i < NELEM; ++i) Vrandom.push_back (my_rand ( ));
  150. test1 ( );
  151. test2 ( );
  152. test3 ( );
  153. return 0;
  154. };