/home/docs/checkouts/readthedocs.org/user_builds/advanced-micro-devices-composable-kernel/checkouts/develop/include/ck_tile/host/fill.hpp Source File

/home/docs/checkouts/readthedocs.org/user_builds/advanced-micro-devices-composable-kernel/checkouts/develop/include/ck_tile/host/fill.hpp Source File#

Composable Kernel: /home/docs/checkouts/readthedocs.org/user_builds/advanced-micro-devices-composable-kernel/checkouts/develop/include/ck_tile/host/fill.hpp Source File
fill.hpp
Go to the documentation of this file.
1 // SPDX-License-Identifier: MIT
2 // Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved.
3 
4 #pragma once
5 
6 #include <algorithm>
7 #include <cmath>
8 #include <iterator>
9 #include <optional>
10 #include <random>
11 #include <stdexcept>
12 #include <type_traits>
13 #include <utility>
14 #include <unordered_set>
15 
16 #include "ck_tile/core.hpp"
18 
19 namespace ck_tile {
20 
38 template <typename T>
40 {
41  float a_{-5.f};
42  float b_{5.f};
43  std::optional<uint32_t> seed_{11939};
44  // ATTENTION: Whether to use multi-threading (note: not guaranteed to be perfectly distributed
45  // across threads).
46  bool threaded = false;
47 
48  template <typename ForwardIter>
49  void operator()(ForwardIter first, ForwardIter last) const
50  {
51  if(threaded)
52  {
53  uint32_t num_thread = std::thread::hardware_concurrency();
54  auto total = static_cast<std::size_t>(std::distance(first, last));
55  auto work_per_thread = static_cast<std::size_t>((total + num_thread - 1) / num_thread);
56 
57  std::vector<joinable_thread> threads(num_thread);
58  for(std::size_t it = 0; it < num_thread; ++it)
59  {
60  std::size_t iw_begin = it * work_per_thread;
61  std::size_t iw_end = std::min((it + 1) * work_per_thread, total);
62  auto thread_f = [this, total, iw_begin, iw_end, &first] {
63  if(iw_begin > total || iw_end > total)
64  return;
65  // need to make each thread unique, add an offset to current seed
66  std::mt19937 gen(seed_.has_value() ? (*seed_ + iw_begin)
67  : std::random_device{}());
68  std::uniform_real_distribution<float> dis(a_, b_);
69  std::generate(first + iw_begin, first + iw_end, [&dis, &gen]() {
70  return ck_tile::type_convert<T>(dis(gen));
71  });
72  };
73  threads[it] = joinable_thread(thread_f);
74  }
75  }
76  else
77  {
78  std::mt19937 gen(seed_.has_value() ? *seed_ : std::random_device{}());
79  std::uniform_real_distribution<float> dis(a_, b_);
80  std::generate(
81  first, last, [&dis, &gen]() { return ck_tile::type_convert<T>(dis(gen)); });
82  }
83  }
84 
85  template <typename ForwardRange>
86  auto operator()(ForwardRange&& range) const
87  -> std::void_t<decltype(std::declval<const FillUniformDistribution&>()(
88  std::begin(std::forward<ForwardRange>(range)),
89  std::end(std::forward<ForwardRange>(range))))>
90  {
91  (*this)(std::begin(std::forward<ForwardRange>(range)),
92  std::end(std::forward<ForwardRange>(range)));
93  }
94 };
95 
96 template <>
98 {
99  float a_{-8.f}; // same type as primary template so that
100  // `FillUniformDistribution<Type>{-5.0f, 5.0f}` works for all types
101  float b_{7.f};
102  std::optional<uint32_t> seed_{11939};
103  template <typename ForwardIter>
104  void operator()(ForwardIter first, ForwardIter last) const
105  {
106  if(a_ < -8.0f || b_ > 7.0f)
107  {
108  throw std::runtime_error(
109  "a_ or b_ of FillUniformDistribution<ck_tile::pk_int4_t> is out of range.");
110  }
111 
112  int min_value = static_cast<int>(a_);
113  int max_value = static_cast<int>(b_);
114  constexpr auto int4_array = std::array<uint8_t, 16>{0x88,
115  0x99,
116  0xaa,
117  0xbb,
118  0xcc,
119  0xdd,
120  0xee,
121  0xff,
122  0x00,
123  0x11,
124  0x22,
125  0x33,
126  0x44,
127  0x55,
128  0x66,
129  0x77};
130  std::mt19937 gen(seed_.has_value() ? *seed_ : std::random_device{}());
131  std::uniform_int_distribution<std::int32_t> dis(0, max_value - min_value + 1);
132  while(first != last)
133  {
134  int randomInt = dis(gen);
135  *first = int4_array[randomInt + (min_value + 8)];
136  ++first;
137  }
138  }
139  template <typename ForwardRange>
140  auto operator()(ForwardRange&& range) const
141  -> std::void_t<decltype(std::declval<const FillUniformDistribution&>()(
142  std::begin(std::forward<ForwardRange>(range)),
143  std::end(std::forward<ForwardRange>(range))))>
144  {
145  (*this)(std::begin(std::forward<ForwardRange>(range)),
146  std::end(std::forward<ForwardRange>(range)));
147  }
148 };
149 
150 namespace impl {
151 
152 // clang-format off
153 template<index_t bytes> struct RawIntegerType_ {};
154 template<> struct RawIntegerType_<1> { using type = uint8_t;};
155 template<> struct RawIntegerType_<2> { using type = uint16_t;};
156 template<> struct RawIntegerType_<4> { using type = uint32_t;};
157 template<> struct RawIntegerType_<8> { using type = uint64_t;};
158 // clang-format on
159 
160 template <typename T>
161 using RawIntegerType = typename RawIntegerType_<sizeof(T)>::type;
162 } // namespace impl
163 
164 // Note: this struct will have no const-ness will generate random
165 template <typename T>
167 {
168  float a_{-5.f};
169  float b_{5.f};
170  std::optional<uint32_t> seed_{11939};
171 
172  std::mt19937 gen_{};
173  std::unordered_set<impl::RawIntegerType<T>> set_{};
174 
176  float b = 5.f,
177  std::optional<uint32_t> seed = {11939})
178  : a_(a),
179  b_(b),
180  seed_(seed),
181  gen_{seed_.has_value() ? *seed_ : std::random_device{}()},
182  set_{}
183  {
184  }
185 
186  template <typename ForwardIter>
187  void operator()(ForwardIter first, ForwardIter last)
188  {
189  std::mt19937& gen = gen_;
190  std::uniform_real_distribution<float> dis(a_, b_);
191  auto& set = set_;
192  std::generate(first, last, [&dis, &gen, &set]() {
193  T v = static_cast<T>(0);
194  do
195  {
196  v = ck_tile::type_convert<T>(dis(gen));
197  } while(set.count(bit_cast<impl::RawIntegerType<T>>(v)) == 1);
198  set.insert(bit_cast<impl::RawIntegerType<T>>(v));
199 
200  return v;
201  });
202  }
203 
204  template <typename ForwardRange>
205  auto operator()(ForwardRange&& range)
206  -> std::void_t<decltype(std::declval<FillUniformDistribution_Unique&>()(
207  std::begin(std::forward<ForwardRange>(range)),
208  std::end(std::forward<ForwardRange>(range))))>
209  {
210  (*this)(std::begin(std::forward<ForwardRange>(range)),
211  std::end(std::forward<ForwardRange>(range)));
212  }
213 
214  void clear() { set_.clear(); }
215 };
216 
217 template <typename T>
219 {
220  float mean_{0.f};
221  float variance_{1.f};
222  std::optional<uint32_t> seed_{11939};
223  // ATTENTION: threaded does not guarantee the distribution between thread
224  bool threaded = false;
225 
226  template <typename ForwardIter>
227  void operator()(ForwardIter first, ForwardIter last) const
228  {
229  if(threaded)
230  {
231  uint32_t num_thread = std::thread::hardware_concurrency();
232  auto total = static_cast<std::size_t>(std::distance(first, last));
233  auto work_per_thread = static_cast<std::size_t>((total + num_thread - 1) / num_thread);
234 
235  std::vector<joinable_thread> threads(num_thread);
236  for(std::size_t it = 0; it < num_thread; ++it)
237  {
238  std::size_t iw_begin = it * work_per_thread;
239  std::size_t iw_end = std::min((it + 1) * work_per_thread, total);
240  auto thread_f = [this, total, iw_begin, iw_end, &first] {
241  if(iw_begin > total || iw_end > total)
242  return;
243  // need to make each thread unique, add an offset to current seed
244  std::mt19937 gen(seed_.has_value() ? (*seed_ + iw_begin)
245  : std::random_device{}());
246  std::normal_distribution<float> dis(mean_, std::sqrt(variance_));
247  std::generate(first + iw_begin, first + iw_end, [&dis, &gen]() {
248  return ck_tile::type_convert<T>(dis(gen));
249  });
250  };
251  threads[it] = joinable_thread(thread_f);
252  }
253  }
254  else
255  {
256  std::mt19937 gen(seed_.has_value() ? *seed_ : std::random_device{}());
257  std::normal_distribution<float> dis(mean_, std::sqrt(variance_));
258  std::generate(
259  first, last, [&dis, &gen]() { return ck_tile::type_convert<T>(dis(gen)); });
260  }
261  }
262 
263  template <typename ForwardRange>
264  auto operator()(ForwardRange&& range) const
265  -> std::void_t<decltype(std::declval<const FillNormalDistribution&>()(
266  std::begin(std::forward<ForwardRange>(range)),
267  std::end(std::forward<ForwardRange>(range))))>
268  {
269  (*this)(std::begin(std::forward<ForwardRange>(range)),
270  std::end(std::forward<ForwardRange>(range)));
271  }
272 };
273 
274 // Normally FillUniformDistributionIntegerValue should use std::uniform_int_distribution as below.
275 // However this produces segfaults in std::mt19937 which look like inifite loop.
276 // template <typename T>
277 // struct FillUniformDistributionIntegerValue
278 // {
279 // int a_{-5};
280 // int b_{5};
281 //
282 // template <typename ForwardIter>
283 // void operator()(ForwardIter first, ForwardIter last) const
284 // {
285 // std::mt19937 gen(11939);
286 // std::uniform_int_distribution<int> dis(a_, b_);
287 // std::generate(
288 // first, last, [&dis, &gen]() { return ck_tile::type_convert<T>(dis(gen)); });
289 // }
290 // };
291 
292 // Workaround for uniform_int_distribution not working as expected. See note above.<
293 template <typename T>
295 {
296  float a_{-5.f};
297  float b_{5.f};
298  std::optional<uint32_t> seed_{11939};
299 
300  template <typename ForwardIter>
301  void operator()(ForwardIter first, ForwardIter last) const
302  {
303  std::mt19937 gen(seed_.has_value() ? *seed_ : std::random_device{}());
304  std::uniform_real_distribution<float> dis(a_, b_);
305  std::generate(
306  first, last, [&dis, &gen]() { return ck_tile::type_convert<T>(std::round(dis(gen))); });
307  }
308 
309  template <typename ForwardRange>
310  auto operator()(ForwardRange&& range) const
311  -> std::void_t<decltype(std::declval<const FillUniformDistributionIntegerValue&>()(
312  std::begin(std::forward<ForwardRange>(range)),
313  std::end(std::forward<ForwardRange>(range))))>
314  {
315  (*this)(std::begin(std::forward<ForwardRange>(range)),
316  std::end(std::forward<ForwardRange>(range)));
317  }
318 };
319 
320 template <typename T>
322 {
323  float mean_{0.f};
324  float variance_{1.f};
325  std::optional<uint32_t> seed_{11939};
326 
327  template <typename ForwardIter>
328  void operator()(ForwardIter first, ForwardIter last) const
329  {
330  std::mt19937 gen(seed_.has_value() ? *seed_ : std::random_device{}());
331  std::normal_distribution<float> dis(mean_, std::sqrt(variance_));
332  std::generate(
333  first, last, [&dis, &gen]() { return ck_tile::type_convert<T>(std::round(dis(gen))); });
334  }
335 
336  template <typename ForwardRange>
337  auto operator()(ForwardRange&& range) const
338  -> std::void_t<decltype(std::declval<const FillNormalDistributionIntegerValue&>()(
339  std::begin(std::forward<ForwardRange>(range)),
340  std::end(std::forward<ForwardRange>(range))))>
341  {
342  (*this)(std::begin(std::forward<ForwardRange>(range)),
343  std::end(std::forward<ForwardRange>(range)));
344  }
345 };
346 
347 template <typename T>
349 {
351  T step_{1};
352 
353  template <typename ForwardIter>
354  void operator()(ForwardIter first, ForwardIter last) const
355  {
356  std::generate(first, last, [=, *this, n = init_value_]() mutable {
357  auto tmp = n;
358  if constexpr(std::is_same_v<decltype(tmp), pk_int4_t>)
359  {
360  n.data += step_.data;
361  }
362  else
363  {
364  n += step_;
365  }
366  return tmp;
367  });
368  }
369 
370  template <typename ForwardRange>
371  auto operator()(ForwardRange&& range) const
372  -> std::void_t<decltype(std::declval<const FillMonotonicSeq&>()(
373  std::begin(std::forward<ForwardRange>(range)),
374  std::end(std::forward<ForwardRange>(range))))>
375  {
376  (*this)(std::begin(std::forward<ForwardRange>(range)),
377  std::end(std::forward<ForwardRange>(range)));
378  }
379 };
380 
381 template <typename T, bool IsAscending = true>
383 {
384  float start_value_{0};
385  float end_value_{3};
386  float step_{1};
387 
388  template <typename ForwardIter>
389  void operator()(ForwardIter first, ForwardIter last) const
390  {
391  std::generate(first, last, [=, *this, n = start_value_]() mutable {
392  auto tmp = n;
393  n += step_;
394  if constexpr(IsAscending)
395  {
396  if(n > end_value_)
397  n = start_value_;
398  }
399  else
400  {
401  if(n < end_value_)
402  n = start_value_;
403  }
404 
405  return type_convert<T>(tmp);
406  });
407  }
408 
409  template <typename ForwardRange>
410  auto operator()(ForwardRange&& range) const
411  -> std::void_t<decltype(std::declval<const FillStepRange&>()(
412  std::begin(std::forward<ForwardRange>(range)),
413  std::end(std::forward<ForwardRange>(range))))>
414  {
415  (*this)(std::begin(std::forward<ForwardRange>(range)),
416  std::end(std::forward<ForwardRange>(range)));
417  }
418 };
419 
420 template <typename T>
422 {
423  T value_{0};
424 
425  template <typename ForwardIter>
426  void operator()(ForwardIter first, ForwardIter last) const
427  {
428  std::fill(first, last, value_);
429  }
430 
431  template <typename ForwardRange>
432  auto operator()(ForwardRange&& range) const
433  -> std::void_t<decltype(std::declval<const FillConstant&>()(
434  std::begin(std::forward<ForwardRange>(range)),
435  std::end(std::forward<ForwardRange>(range))))>
436  {
437  (*this)(std::begin(std::forward<ForwardRange>(range)),
438  std::end(std::forward<ForwardRange>(range)));
439  }
440 };
441 
442 //----------------------------------------------------------------------------------------------
445 template <typename T>
447 {
448  size_t start{0};
449  // masks represent all valid 2:4 structured sparsity permutations
450  // clang-format off
451  static constexpr int32_t masks[] = {0, 0, 1, 1,
452  0, 1, 0, 1,
453  0, 1, 1, 0,
454  1, 0, 0, 1,
455  1, 0, 1, 0,
456  1, 1, 0, 0,
457  0, 0, 0, 1,
458  0, 0, 1, 0,
459  0, 1, 0, 0,
460  1, 0, 0, 0};
461  // clang-format on
462 
463  template <typename ForwardIter>
464  void operator()(ForwardIter first, ForwardIter last) const
465  {
466  std::transform(first, last, first, [=, *this, index = start](T val) mutable {
467  auto tmp = val * masks[index % (sizeof(masks) / sizeof(int32_t))];
468  index += 1;
469 
470  return type_convert<T>(tmp);
471  });
472  }
473 
474  template <typename ForwardRange>
475  auto operator()(ForwardRange&& range) const
476  -> std::void_t<decltype(std::declval<const AdjustToStructuredSparsity&>()(
477  std::begin(std::forward<ForwardRange>(range)),
478  std::end(std::forward<ForwardRange>(range))))>
479  {
480  (*this)(std::begin(std::forward<ForwardRange>(range)),
481  std::end(std::forward<ForwardRange>(range)));
482  }
483 };
484 
485 template <typename T, bool UseCos = true, bool UseAbs = false>
487 {
488  template <typename T_, bool UseCos_ = true, bool UseAbs_ = false>
490  {
491  int i{0};
492  auto operator()()
493  {
494  float v = 0;
495  if constexpr(UseCos_)
496  {
497  v = cos(i);
498  }
499  else
500  {
501  v = sin(i);
502  }
503  if constexpr(UseAbs_)
504  v = abs(v);
505  i++;
506  return ck_tile::type_convert<T_>(v);
507  }
508  };
509  template <typename ForwardIter>
510  void operator()(ForwardIter first, ForwardIter last) const
511  {
513  std::generate(first, last, gen);
514  }
515 
516  template <typename ForwardRange>
517  auto operator()(ForwardRange&& range) const
518  -> std::void_t<decltype(std::declval<const FillTrigValue&>()(
519  std::begin(std::forward<ForwardRange>(range)),
520  std::end(std::forward<ForwardRange>(range))))>
521  {
522  (*this)(std::begin(std::forward<ForwardRange>(range)),
523  std::end(std::forward<ForwardRange>(range)));
524  }
525 };
526 
527 } // namespace ck_tile
__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
auto transform(InputRange &&range, OutputIterator iter, UnaryOperation unary_op) -> decltype(std::transform(std::begin(range), std::end(range), iter, unary_op))
Definition: algorithm.hpp:36
typename RawIntegerType_< sizeof(T)>::type RawIntegerType
Definition: fill.hpp:161
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:752
CK_TILE_HOST T sin(T x)
Definition: math.hpp:698
int32_t int32_t
Definition: integer.hpp:10
CK_TILE_HOST_DEVICE bfloat16_t abs(const bfloat16_t &x)
Definition: bfloat16.hpp:404
constexpr bool is_same_v
Definition: type.hpp:283
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a
Definition: pointer.h:1249
unsigned short uint16_t
Definition: stdint.h:125
unsigned int uint32_t
Definition: stdint.h:126
unsigned char uint8_t
Definition: stdint.h:124
unsigned __int64 uint64_t
Definition: stdint.h:136
Transforms given input to fit 2:4 structured sparsity pattern so every subgroup of 4 elements contain...
Definition: fill.hpp:447
auto operator()(ForwardRange &&range) const -> std::void_t< decltype(std::declval< const AdjustToStructuredSparsity & >()(std::begin(std::forward< ForwardRange >(range)), std::end(std::forward< ForwardRange >(range))))>
Definition: fill.hpp:475
size_t start
Definition: fill.hpp:448
static constexpr int32_t masks[]
Definition: fill.hpp:451
void operator()(ForwardIter first, ForwardIter last) const
Definition: fill.hpp:464
Definition: fill.hpp:422
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:432
T value_
Definition: fill.hpp:423
void operator()(ForwardIter first, ForwardIter last) const
Definition: fill.hpp:426
Definition: fill.hpp:349
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:371
T init_value_
Definition: fill.hpp:350
T step_
Definition: fill.hpp:351
void operator()(ForwardIter first, ForwardIter last) const
Definition: fill.hpp:354
Definition: fill.hpp:219
std::optional< uint32_t > seed_
Definition: fill.hpp:222
void operator()(ForwardIter first, ForwardIter last) const
Definition: fill.hpp:227
float variance_
Definition: fill.hpp:221
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:264
bool threaded
Definition: fill.hpp:224
float mean_
Definition: fill.hpp:220
void operator()(ForwardIter first, ForwardIter last) const
Definition: fill.hpp:328
float mean_
Definition: fill.hpp:323
float variance_
Definition: fill.hpp:324
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:337
std::optional< uint32_t > seed_
Definition: fill.hpp:325
Definition: fill.hpp:383
float end_value_
Definition: fill.hpp:385
float start_value_
Definition: fill.hpp:384
float step_
Definition: fill.hpp:386
void operator()(ForwardIter first, ForwardIter last) const
Definition: fill.hpp:389
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:410
int i
Definition: fill.hpp:491
auto operator()()
Definition: fill.hpp:492
Definition: fill.hpp:487
void operator()(ForwardIter first, ForwardIter last) const
Definition: fill.hpp:510
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:517
void operator()(ForwardIter first, ForwardIter last) const
Definition: fill.hpp:104
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: fill.hpp:140
void operator()(ForwardIter first, ForwardIter last)
Definition: fill.hpp:187
std::optional< uint32_t > seed_
Definition: fill.hpp:170
float a_
Definition: fill.hpp:168
FillUniformDistribution_Unique(float a=-5.f, float b=5.f, std::optional< uint32_t > seed={11939})
Definition: fill.hpp:175
auto operator()(ForwardRange &&range) -> std::void_t< decltype(std::declval< FillUniformDistribution_Unique & >()(std::begin(std::forward< ForwardRange >(range)), std::end(std::forward< ForwardRange >(range))))>
Definition: fill.hpp:205
std::mt19937 gen_
Definition: fill.hpp:172
void clear()
Definition: fill.hpp:214
float b_
Definition: fill.hpp:169
std::unordered_set< impl::RawIntegerType< T > > set_
Definition: fill.hpp:173
Definition: fill.hpp:40
float b_
Definition: fill.hpp:42
bool threaded
Definition: fill.hpp:46
void operator()(ForwardIter first, ForwardIter last) const
Definition: fill.hpp:49
float a_
Definition: fill.hpp:41
std::optional< uint32_t > seed_
Definition: fill.hpp:43
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: fill.hpp:86
std::optional< uint32_t > seed_
Definition: fill.hpp:298
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: fill.hpp:310
void operator()(ForwardIter first, ForwardIter last) const
Definition: fill.hpp:301
float b_
Definition: fill.hpp:297
float a_
Definition: fill.hpp:296
uint8_t type
Definition: fill.hpp:154
uint16_t type
Definition: fill.hpp:155
uint32_t type
Definition: fill.hpp:156
uint64_t type
Definition: fill.hpp:157
Definition: fill.hpp:153
Definition: joinable_thread.hpp:12
Definition: pk_int4.hpp:21