11 #include <type_traits>
13 #include <unordered_set>
25 std::optional<uint32_t>
seed_{11939};
29 template <
typename ForwardIter>
30 void operator()(ForwardIter first, ForwardIter last)
const
34 uint32_t num_thread = std::thread::hardware_concurrency();
35 auto total =
static_cast<std::size_t
>(std::distance(first, last));
36 auto work_per_thread =
static_cast<std::size_t
>((total + num_thread - 1) / num_thread);
38 std::vector<joinable_thread> threads(num_thread);
39 for(std::size_t it = 0; it < num_thread; ++it)
41 std::size_t iw_begin = it * work_per_thread;
42 std::size_t iw_end =
std::min((it + 1) * work_per_thread, total);
43 auto thread_f = [
this, total, iw_begin, iw_end, &first] {
44 if(iw_begin > total || iw_end > total)
47 std::mt19937 gen(
seed_.has_value() ? (*
seed_ + iw_begin)
48 : std::random_device{}());
49 std::uniform_real_distribution<float> dis(
a_,
b_);
50 std::generate(first + iw_begin, first + iw_end, [&dis, &gen]() {
51 return ck_tile::type_convert<T>(dis(gen));
59 std::mt19937 gen(
seed_.has_value() ? *
seed_ : std::random_device{}());
60 std::uniform_real_distribution<float> dis(
a_,
b_);
62 first, last, [&dis, &gen]() {
return ck_tile::type_convert<T>(dis(gen)); });
66 template <
typename ForwardRange>
68 -> std::void_t<decltype(std::declval<const FillUniformDistribution&>()(
69 std::begin(std::forward<ForwardRange>(range)),
70 std::end(std::forward<ForwardRange>(range))))>
72 (*this)(std::begin(std::forward<ForwardRange>(range)),
73 std::end(std::forward<ForwardRange>(range)));
97 std::optional<uint32_t>
seed_{11939};
100 std::unordered_set<impl::RawIntegerType<T>>
set_{};
104 std::optional<uint32_t> seed = {11939})
113 template <
typename ForwardIter>
116 std::mt19937& gen =
gen_;
117 std::uniform_real_distribution<float> dis(
a_,
b_);
119 std::generate(first, last, [&dis, &gen, &
set]() {
120 T v =
static_cast<T
>(0);
123 v = ck_tile::type_convert<T>(dis(gen));
131 template <
typename ForwardRange>
133 -> std::void_t<decltype(std::declval<FillUniformDistribution_Unique&>()(
134 std::begin(std::forward<ForwardRange>(range)),
135 std::end(std::forward<ForwardRange>(range))))>
137 (*this)(std::begin(std::forward<ForwardRange>(range)),
138 std::end(std::forward<ForwardRange>(range)));
144 template <
typename T>
149 std::optional<uint32_t>
seed_{11939};
153 template <
typename ForwardIter>
158 uint32_t num_thread = std::thread::hardware_concurrency();
159 auto total =
static_cast<std::size_t
>(std::distance(first, last));
160 auto work_per_thread =
static_cast<std::size_t
>((total + num_thread - 1) / num_thread);
162 std::vector<joinable_thread> threads(num_thread);
163 for(std::size_t it = 0; it < num_thread; ++it)
165 std::size_t iw_begin = it * work_per_thread;
166 std::size_t iw_end =
std::min((it + 1) * work_per_thread, total);
167 auto thread_f = [
this, total, iw_begin, iw_end, &first] {
168 if(iw_begin > total || iw_end > total)
171 std::mt19937 gen(
seed_.has_value() ? (*
seed_ + iw_begin)
172 : std::random_device{}());
174 std::generate(first + iw_begin, first + iw_end, [&dis, &gen]() {
175 return ck_tile::type_convert<T>(dis(gen));
183 std::mt19937 gen(
seed_.has_value() ? *
seed_ : std::random_device{}());
186 first, last, [&dis, &gen]() {
return ck_tile::type_convert<T>(dis(gen)); });
190 template <
typename ForwardRange>
192 -> std::void_t<decltype(std::declval<const FillNormalDistribution&>()(
193 std::begin(std::forward<ForwardRange>(range)),
194 std::end(std::forward<ForwardRange>(range))))>
196 (*this)(std::begin(std::forward<ForwardRange>(range)),
197 std::end(std::forward<ForwardRange>(range)));
220 template <
typename T>
225 std::optional<uint32_t>
seed_{11939};
227 template <
typename ForwardIter>
230 std::mt19937 gen(
seed_.has_value() ? *
seed_ : std::random_device{}());
231 std::uniform_real_distribution<float> dis(
a_,
b_);
233 first, last, [&dis, &gen]() {
return ck_tile::type_convert<T>(std::round(dis(gen))); });
236 template <
typename ForwardRange>
238 -> std::void_t<decltype(std::declval<const FillUniformDistributionIntegerValue&>()(
239 std::begin(std::forward<ForwardRange>(range)),
240 std::end(std::forward<ForwardRange>(range))))>
242 (*this)(std::begin(std::forward<ForwardRange>(range)),
243 std::end(std::forward<ForwardRange>(range)));
247 template <
typename T>
252 std::optional<uint32_t>
seed_{11939};
254 template <
typename ForwardIter>
257 std::mt19937 gen(
seed_.has_value() ? *
seed_ : std::random_device{}());
260 first, last, [&dis, &gen]() {
return ck_tile::type_convert<T>(std::round(dis(gen))); });
263 template <
typename ForwardRange>
265 -> std::void_t<decltype(std::declval<const FillNormalDistributionIntegerValue&>()(
266 std::begin(std::forward<ForwardRange>(range)),
267 std::end(std::forward<ForwardRange>(range))))>
269 (*this)(std::begin(std::forward<ForwardRange>(range)),
270 std::end(std::forward<ForwardRange>(range)));
274 template <
typename T>
280 template <
typename ForwardIter>
283 std::generate(first, last, [=, n =
init_value_]()
mutable {
290 template <
typename ForwardRange>
292 -> std::void_t<decltype(std::declval<const FillMonotonicSeq&>()(
293 std::begin(std::forward<ForwardRange>(range)),
294 std::end(std::forward<ForwardRange>(range))))>
296 (*this)(std::begin(std::forward<ForwardRange>(range)),
297 std::end(std::forward<ForwardRange>(range)));
301 template <
typename T,
bool IsAscending = true>
308 template <
typename ForwardIter>
311 std::generate(first, last, [=, n =
start_value_]()
mutable {
314 if constexpr(IsAscending)
325 return type_convert<T>(tmp);
329 template <
typename ForwardRange>
331 decltype(std::declval<const FillStepRange&>()(std::begin(std::forward<ForwardRange>(range)),
332 std::end(std::forward<ForwardRange>(range))))>
334 (*this)(std::begin(std::forward<ForwardRange>(range)),
335 std::end(std::forward<ForwardRange>(range)));
339 template <
typename T>
344 template <
typename ForwardIter>
350 template <
typename ForwardRange>
352 decltype(std::declval<const FillConstant&>()(std::begin(std::forward<ForwardRange>(range)),
353 std::end(std::forward<ForwardRange>(range))))>
355 (*this)(std::begin(std::forward<ForwardRange>(range)),
356 std::end(std::forward<ForwardRange>(range)));
360 template <
typename T,
bool UseCos = true,
bool UseAbs = false>
363 template <
typename T_,
bool UseCos_ = true,
bool UseAbs_ = false>
370 if constexpr(UseCos_)
378 if constexpr(UseAbs_)
381 return ck_tile::type_convert<T_>(v);
384 template <
typename ForwardIter>
388 std::generate(first, last, gen);
391 template <
typename ForwardRange>
393 decltype(std::declval<const FillTrigValue&>()(std::begin(std::forward<ForwardRange>(range)),
394 std::end(std::forward<ForwardRange>(range))))>
396 (*this)(std::begin(std::forward<ForwardRange>(range)),
397 std::end(std::forward<ForwardRange>(range)));
__host__ constexpr __device__ T min(T x)
Definition: math.hpp:116
auto fill(OutputRange &&range, const T &init) -> std::void_t< decltype(std::fill(std::begin(std::forward< OutputRange >(range)), std::end(std::forward< OutputRange >(range)), init))>
Definition: algorithm.hpp:25
typename RawIntegerType_< sizeof(T)>::type RawIntegerType
Definition: fill.hpp:88
Definition: cluster_descriptor.hpp:13
constexpr CK_TILE_HOST_DEVICE Y bit_cast(const X &x)
Definition: bit_cast.hpp:11
CK_TILE_HOST T cos(T x)
Definition: math.hpp:749
CK_TILE_HOST T sin(T x)
Definition: math.hpp:695
CK_TILE_HOST_DEVICE bfloat16_t abs(const bfloat16_t &x)
Definition: bfloat16.hpp:395
auto operator()(ForwardRange &&range) const -> std::void_t< decltype(std::declval< const FillConstant & >()(std::begin(std::forward< ForwardRange >(range)), std::end(std::forward< ForwardRange >(range))))>
Definition: fill.hpp:351
T value_
Definition: fill.hpp:342
void operator()(ForwardIter first, ForwardIter last) const
Definition: fill.hpp:345
auto operator()(ForwardRange &&range) const -> std::void_t< decltype(std::declval< const FillMonotonicSeq & >()(std::begin(std::forward< ForwardRange >(range)), std::end(std::forward< ForwardRange >(range))))>
Definition: fill.hpp:291
T init_value_
Definition: fill.hpp:277
T step_
Definition: fill.hpp:278
void operator()(ForwardIter first, ForwardIter last) const
Definition: fill.hpp:281
std::optional< uint32_t > seed_
Definition: fill.hpp:149
void operator()(ForwardIter first, ForwardIter last) const
Definition: fill.hpp:154
float variance_
Definition: fill.hpp:148
auto operator()(ForwardRange &&range) const -> std::void_t< decltype(std::declval< const FillNormalDistribution & >()(std::begin(std::forward< ForwardRange >(range)), std::end(std::forward< ForwardRange >(range))))>
Definition: fill.hpp:191
bool threaded
Definition: fill.hpp:151
float mean_
Definition: fill.hpp:147
void operator()(ForwardIter first, ForwardIter last) const
Definition: fill.hpp:255
float mean_
Definition: fill.hpp:250
float variance_
Definition: fill.hpp:251
auto operator()(ForwardRange &&range) const -> std::void_t< decltype(std::declval< const FillNormalDistributionIntegerValue & >()(std::begin(std::forward< ForwardRange >(range)), std::end(std::forward< ForwardRange >(range))))>
Definition: fill.hpp:264
std::optional< uint32_t > seed_
Definition: fill.hpp:252
float end_value_
Definition: fill.hpp:305
float start_value_
Definition: fill.hpp:304
float step_
Definition: fill.hpp:306
void operator()(ForwardIter first, ForwardIter last) const
Definition: fill.hpp:309
auto operator()(ForwardRange &&range) const -> std::void_t< decltype(std::declval< const FillStepRange & >()(std::begin(std::forward< ForwardRange >(range)), std::end(std::forward< ForwardRange >(range))))>
Definition: fill.hpp:330
int i
Definition: fill.hpp:366
auto operator()()
Definition: fill.hpp:367
void operator()(ForwardIter first, ForwardIter last) const
Definition: fill.hpp:385
auto operator()(ForwardRange &&range) const -> std::void_t< decltype(std::declval< const FillTrigValue & >()(std::begin(std::forward< ForwardRange >(range)), std::end(std::forward< ForwardRange >(range))))>
Definition: fill.hpp:392
uint8_t type
Definition: fill.hpp:81
uint16_t type
Definition: fill.hpp:82
uint32_t type
Definition: fill.hpp:83
uint64_t type
Definition: fill.hpp:84
Definition: joinable_thread.hpp:12