fill.hpp Source File

fill.hpp Source File#

Composable Kernel: fill.hpp Source File
library/utility/fill.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2// Copyright (c) 2018-2024, Advanced Micro Devices, Inc. All rights reserved.
3
4#pragma once
5
6#include <algorithm>
7#include <cmath>
8#include <iterator>
9#include <random>
10#include <type_traits>
11#include <utility>
12
14
15namespace ck {
16namespace utils {
17
18template <typename T>
20{
21 float a_{-5.f};
22 float b_{5.f};
23
24 template <typename ForwardIter>
25 void operator()(ForwardIter first, ForwardIter last) const
26 {
27 std::mt19937 gen(11939);
28 std::uniform_real_distribution<float> dis(a_, b_);
29 std::generate(first, last, [&dis, &gen]() { return ck::type_convert<T>(dis(gen)); });
30 }
31
32 template <typename ForwardRange>
33 auto operator()(ForwardRange&& range) const
34 -> std::void_t<decltype(std::declval<const FillUniformDistribution&>()(
35 std::begin(std::forward<ForwardRange>(range)),
36 std::end(std::forward<ForwardRange>(range))))>
37 {
38 (*this)(std::begin(std::forward<ForwardRange>(range)),
39 std::end(std::forward<ForwardRange>(range)));
40 }
41};
42
43// Normally FillUniformDistributionIntegerValue should use std::uniform_int_distribution as below.
44// However this produces segfaults in std::mt19937 which look like inifite loop.
45// template <typename T>
46// struct FillUniformDistributionIntegerValue
47// {
48// int a_{-5};
49// int b_{5};
50//
51// template <typename ForwardIter>
52// void operator()(ForwardIter first, ForwardIter last) const
53// {
54// std::mt19937 gen(11939);
55// std::uniform_int_distribution<int> dis(a_, b_);
56// std::generate(
57// first, last, [&dis, &gen]() { return ck::type_convert<T>(dis(gen)); });
58// }
59// };
60
61// Workaround for uniform_int_distribution not working as expected. See note above.<
62template <typename T>
64{
65 float a_{-5.f};
66 float b_{5.f};
67
68 template <typename ForwardIter>
69 void operator()(ForwardIter first, ForwardIter last) const
70 {
71 std::mt19937 gen(11939);
72 std::uniform_real_distribution<float> dis(a_, b_);
73 std::generate(
74 first, last, [&dis, &gen]() { return ck::type_convert<T>(std::round(dis(gen))); });
75 }
76
77 template <typename ForwardRange>
78 auto operator()(ForwardRange&& range) const
79 -> std::void_t<decltype(std::declval<const FillUniformDistributionIntegerValue&>()(
80 std::begin(std::forward<ForwardRange>(range)),
81 std::end(std::forward<ForwardRange>(range))))>
82 {
83 (*this)(std::begin(std::forward<ForwardRange>(range)),
84 std::end(std::forward<ForwardRange>(range)));
85 }
86};
87
102template <typename T>
104{
106 T step_{1};
107
108 template <typename ForwardIter>
109 void operator()(ForwardIter first, ForwardIter last) const
110 {
111 std::generate(first, last, [=, *this, n = init_value_]() mutable {
112 auto tmp = n;
113 n += step_;
114 return tmp;
115 });
116 }
117
118 template <typename ForwardRange>
119 auto operator()(ForwardRange&& range) const
120 -> std::void_t<decltype(std::declval<const FillMonotonicSeq&>()(
121 std::begin(std::forward<ForwardRange>(range)),
122 std::end(std::forward<ForwardRange>(range))))>
123 {
124 (*this)(std::begin(std::forward<ForwardRange>(range)),
125 std::end(std::forward<ForwardRange>(range)));
126 }
127};
128
129template <typename T>
131{
132 T value_{0};
133
134 template <typename ForwardIter>
135 void operator()(ForwardIter first, ForwardIter last) const
136 {
137 std::fill(first, last, value_);
138 }
139
140 template <typename ForwardRange>
141 auto operator()(ForwardRange&& range) const
142 -> std::void_t<decltype(std::declval<const FillConstant&>()(
143 std::begin(std::forward<ForwardRange>(range)),
144 std::end(std::forward<ForwardRange>(range))))>
145 {
146 (*this)(std::begin(std::forward<ForwardRange>(range)),
147 std::end(std::forward<ForwardRange>(range)));
148 }
149};
150
151template <typename T>
153{
154 // clang-format off
155 static constexpr T valid_sequences[] = {
156 0, 0, 1, 1,
157 0, 1, 0, 1,
158 0, 1, 1, 0,
159 1, 0, 0, 1,
160 1, 0, 1, 0,
161 1, 1, 0, 0,
162 };
163 // clang-format on
164
165 template <typename ForwardIter>
166 void operator()(ForwardIter first, ForwardIter last) const
167 {
168 std::for_each(first, last, [=, *this, idx = 0](T& elem) mutable {
169 auto tmp_idx = idx;
170 idx += 1;
171 return elem *= valid_sequences[tmp_idx % (sizeof(valid_sequences) / sizeof(T))];
172 });
173 }
174
175 template <typename ForwardRange>
176 auto operator()(ForwardRange&& range) const
177 -> std::void_t<decltype(std::declval<const TransformIntoStructuralSparsity&>()(
178 std::begin(std::forward<ForwardRange>(range)),
179 std::end(std::forward<ForwardRange>(range))))>
180 {
181 (*this)(std::begin(std::forward<ForwardRange>(range)),
182 std::end(std::forward<ForwardRange>(range)));
183 }
184};
185
186} // namespace utils
187} // namespace ck
Definition library/utility/check_err.hpp:24
Definition ck.hpp:268
__host__ __device__ constexpr Y type_convert(X x)
Definition utility/type_convert.hpp:98
Definition library/utility/fill.hpp:131
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 library/utility/fill.hpp:141
T value_
Definition library/utility/fill.hpp:132
void operator()(ForwardIter first, ForwardIter last) const
Definition library/utility/fill.hpp:135
A functor for filling a container with a monotonically increasing or decreasing sequence.
Definition library/utility/fill.hpp:104
T step_
Definition library/utility/fill.hpp:106
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 library/utility/fill.hpp:119
T init_value_
Definition library/utility/fill.hpp:105
void operator()(ForwardIter first, ForwardIter last) const
Definition library/utility/fill.hpp:109
Definition library/utility/fill.hpp:20
auto operator()(ForwardRange &&range) const -> std::void_t< decltype(std::declval< const FillUniformDistribution & >()(std::begin(std::forward< ForwardRange >(range)), std::end(std::forward< ForwardRange >(range))))>
Definition library/utility/fill.hpp:33
float a_
Definition library/utility/fill.hpp:21
float b_
Definition library/utility/fill.hpp:22
void operator()(ForwardIter first, ForwardIter last) const
Definition library/utility/fill.hpp:25
Definition library/utility/fill.hpp:64
auto operator()(ForwardRange &&range) const -> std::void_t< decltype(std::declval< const FillUniformDistributionIntegerValue & >()(std::begin(std::forward< ForwardRange >(range)), std::end(std::forward< ForwardRange >(range))))>
Definition library/utility/fill.hpp:78
float b_
Definition library/utility/fill.hpp:66
void operator()(ForwardIter first, ForwardIter last) const
Definition library/utility/fill.hpp:69
float a_
Definition library/utility/fill.hpp:65
Definition library/utility/fill.hpp:153
static constexpr T valid_sequences[]
Definition library/utility/fill.hpp:155
void operator()(ForwardIter first, ForwardIter last) const
Definition library/utility/fill.hpp:166
auto operator()(ForwardRange &&range) const -> std::void_t< decltype(std::declval< const TransformIntoStructuralSparsity & >()(std::begin(std::forward< ForwardRange >(range)), std::end(std::forward< ForwardRange >(range))))>
Definition library/utility/fill.hpp:176