21 #include "benchmark/benchmark.h"
22 #include "absl/base/config.h"
23 #include "absl/numeric/int128.h"
27 constexpr
size_t kSampleSize = 1000000;
29 std::mt19937 MakeRandomEngine() {
31 std::seed_seq
seed({
r(),
r(),
r(),
r(),
r(),
r(),
r(),
r()});
32 return std::mt19937(
seed);
36 typename H =
typename std::conditional<
38 std::vector<std::pair<T, T>> GetRandomClass128SampleUniformDivisor() {
39 std::vector<std::pair<T, T>>
values;
40 std::mt19937 random = MakeRandomEngine();
41 std::uniform_int_distribution<H> uniform_h;
42 values.reserve(kSampleSize);
43 for (
size_t i = 0;
i < kSampleSize; ++
i) {
53 auto values = GetRandomClass128SampleUniformDivisor<T>();
65 auto values = GetRandomClass128SampleUniformDivisor<T>();
76 typename H =
typename std::conditional<
78 std::vector<std::pair<T, H>> GetRandomClass128SampleSmallDivisor() {
79 std::vector<std::pair<T, H>>
values;
80 std::mt19937 random = MakeRandomEngine();
81 std::uniform_int_distribution<H> uniform_h;
82 values.reserve(kSampleSize);
83 for (
size_t i = 0;
i < kSampleSize; ++
i) {
93 auto values = GetRandomClass128SampleSmallDivisor<T>();
103 template <
typename T>
105 auto values = GetRandomClass128SampleSmallDivisor<T>();
115 std::vector<std::pair<absl::uint128, absl::uint128>> GetRandomClass128Sample() {
116 std::vector<std::pair<absl::uint128, absl::uint128>>
values;
117 std::mt19937 random = MakeRandomEngine();
118 std::uniform_int_distribution<uint64_t> uniform_uint64;
119 values.reserve(kSampleSize);
120 for (
size_t i = 0;
i < kSampleSize; ++
i) {
129 auto values = GetRandomClass128Sample();
139 auto values = GetRandomClass128Sample();
148 #ifdef ABSL_HAVE_INTRINSIC_INT128
152 template <
typename T,
153 typename H =
typename std::conditional<
155 class UniformIntDistribution128 {
158 T operator()(std::mt19937& generator) {
159 return (
static_cast<T>(dist64_(generator)) << 64) | dist64_(generator);
163 std::uniform_int_distribution<H> dist64_;
166 template <
typename T,
167 typename H =
typename std::conditional<
169 std::vector<std::pair<T, T>> GetRandomIntrinsic128SampleUniformDivisor() {
170 std::vector<std::pair<T, T>>
values;
171 std::mt19937 random = MakeRandomEngine();
172 UniformIntDistribution128<T> uniform_128;
173 values.reserve(kSampleSize);
174 for (
size_t i = 0;
i < kSampleSize; ++
i) {
175 T a = uniform_128(random);
176 T b = uniform_128(random);
183 template <
typename T>
185 auto values = GetRandomIntrinsic128SampleUniformDivisor<T>();
195 template <
typename T>
197 auto values = GetRandomIntrinsic128SampleUniformDivisor<T>();
207 template <
typename T,
208 typename H =
typename std::conditional<
210 std::vector<std::pair<T, H>> GetRandomIntrinsic128SampleSmallDivisor() {
211 std::vector<std::pair<T, H>>
values;
212 std::mt19937 random = MakeRandomEngine();
213 UniformIntDistribution128<T> uniform_int128;
214 std::uniform_int_distribution<H> uniform_int64;
215 values.reserve(kSampleSize);
216 for (
size_t i = 0;
i < kSampleSize; ++
i) {
217 T a = uniform_int128(random);
224 template <
typename T>
226 auto values = GetRandomIntrinsic128SampleSmallDivisor<T>();
236 template <
typename T>
238 auto values = GetRandomIntrinsic128SampleSmallDivisor<T>();
248 std::vector<std::pair<unsigned __int128, unsigned __int128>>
249 GetRandomIntrinsic128Sample() {
250 std::vector<std::pair<unsigned __int128, unsigned __int128>>
values;
251 std::mt19937 random = MakeRandomEngine();
252 UniformIntDistribution128<unsigned __int128> uniform_uint128;
253 values.reserve(kSampleSize);
254 for (
size_t i = 0;
i < kSampleSize; ++
i) {
255 values.emplace_back(uniform_uint128(random), uniform_uint128(random));
261 auto values = GetRandomIntrinsic128Sample();
271 auto values = GetRandomIntrinsic128Sample();
280 #endif // ABSL_HAVE_INTRINSIC_INT128