include/ck/library/utility/host_tensor_generator.hpp Source File

include/ck/library/utility/host_tensor_generator.hpp Source File#

Composable Kernel: include/ck/library/utility/host_tensor_generator.hpp Source File
host_tensor_generator.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 <cmath>
7 #include <numeric>
8 #include <random>
9 
10 #include "ck/ck.hpp"
11 
12 template <typename T>
14 {
15  template <typename... Is>
16  T operator()(Is...)
17  {
18  return T{0};
19  }
20 };
21 
22 template <typename T>
24 {
25  T value = 1;
26 
27  template <typename... Is>
28  T operator()(Is...)
29  {
30  return value;
31  }
32 };
33 
34 template <>
36 {
37  float value = 1.0;
38 
39  template <typename... Is>
41  {
42  return ck::type_convert<ck::half_t>(value);
43  }
44 };
45 
46 template <>
48 {
49  float value = 1.0;
50 
51  template <typename... Is>
53  {
54  return ck::type_convert<ck::bhalf_t>(value);
55  }
56 };
57 
58 #if defined CK_ENABLE_FP8
59 template <>
60 struct GeneratorTensor_1<ck::f8_t>
61 {
62  float value = 1.0;
63 
64  template <typename... Is>
65  ck::f8_t operator()(Is...)
66  {
67  return ck::type_convert<ck::f8_t>(value);
68  }
69 };
70 #endif
71 
72 template <>
74 {
75  float value = 1.0;
76 
77  template <typename... Is>
79  {
80  return ck::type_convert<ck::f4_t>(value);
81  }
82 };
83 
84 template <>
86 {
88 
89  template <typename... Is>
91  {
92  return value;
93  }
94 };
95 
96 template <>
97 struct GeneratorTensor_1<ck::pk_i4_t>
98 {
100 
101  template <typename... Is>
103  {
104  int t = value + 8;
105  ck::pk_i4_t r = ((t << 4) + t) & 0xff;
106  return r;
107  }
108 };
109 
110 template <typename T>
112 {
113  int min_value = 0;
114  int max_value = 1;
115 
116  template <typename... Is>
117  T operator()(Is...)
118  {
119  return static_cast<T>((std::rand() % (max_value - min_value)) + min_value);
120  }
121 };
122 
123 template <>
125 {
126  int min_value = 0;
127  int max_value = 1;
128 
129  template <typename... Is>
131  {
132  float tmp = (std::rand() % (max_value - min_value)) + min_value;
133  return ck::type_convert<ck::bhalf_t>(tmp);
134  }
135 };
136 
137 template <>
139 {
140  int min_value = 0;
141  int max_value = 1;
142 
143  template <typename... Is>
145  {
146  return (std::rand() % (max_value - min_value)) + min_value;
147  }
148 };
149 
150 template <>
151 struct GeneratorTensor_2<ck::pk_i4_t>
152 {
153  int min_value = 0;
154  int max_value = 1;
155 
156  template <typename... Is>
158  {
159  int hi = std::rand() % (max_value - min_value) + min_value + 8;
160  int lo = std::rand() % (max_value - min_value) + min_value + 8;
161  ck::pk_i4_t r = ((hi << 4) + lo) & 0xff;
162  return r;
163  }
164 };
165 
166 #if defined CK_ENABLE_FP8
167 template <>
168 struct GeneratorTensor_2<ck::f8_t>
169 {
170  int min_value = 0;
171  int max_value = 1;
172 
173  template <typename... Is>
174  ck::f8_t operator()(Is...)
175  {
176  float tmp = (std::rand() % (max_value - min_value)) + min_value;
177  return ck::type_convert<ck::f8_t>(tmp);
178  }
179 };
180 #endif
181 
182 #if defined CK_ENABLE_BF8
183 template <>
184 struct GeneratorTensor_2<ck::bf8_t>
185 {
186  int min_value = 0;
187  int max_value = 1;
188 
189  template <typename... Is>
190  ck::bf8_t operator()(Is...)
191  {
192  float tmp = (std::rand() % (max_value - min_value)) + min_value;
193  return ck::type_convert<ck::bf8_t>(tmp);
194  }
195 };
196 #endif
197 
198 template <>
200 {
201  int min_value = 0;
202  int max_value = 1;
203 
204  template <typename... Is>
206  {
207  float tmp = (std::rand() % (max_value - min_value)) + min_value;
208  return ck::type_convert<ck::f4_t>(tmp);
209  }
210 };
211 
212 template <typename T>
214 {
215  float min_value = 0;
216  float max_value = 1;
217 
218  template <typename... Is>
219  T operator()(Is...)
220  {
221  float tmp = float(std::rand()) / float(RAND_MAX);
222 
223  return static_cast<T>(min_value + tmp * (max_value - min_value));
224  }
225 };
226 
227 template <>
229 {
230  float min_value = 0;
231  float max_value = 1;
232 
233  template <typename... Is>
235  {
236  float tmp = float(std::rand()) / float(RAND_MAX);
237 
238  float fp32_tmp = min_value + tmp * (max_value - min_value);
239 
240  return ck::type_convert<ck::bhalf_t>(fp32_tmp);
241  }
242 };
243 
244 #if defined CK_ENABLE_FP8
245 template <>
246 struct GeneratorTensor_3<ck::f8_t>
247 {
248  float min_value = 0;
249  float max_value = 1;
250 
251  template <typename... Is>
252  ck::f8_t operator()(Is...)
253  {
254  float tmp = float(std::rand()) / float(RAND_MAX);
255 
256  float fp32_tmp = min_value + tmp * (max_value - min_value);
257 
258  return ck::type_convert<ck::f8_t>(fp32_tmp);
259  }
260 };
261 #endif
262 
263 #if defined CK_ENABLE_BF8
264 template <>
265 struct GeneratorTensor_3<ck::bf8_t>
266 {
267  float min_value = 0;
268  float max_value = 1;
269 
270  template <typename... Is>
271  ck::bf8_t operator()(Is...)
272  {
273  float tmp = float(std::rand()) / float(RAND_MAX);
274 
275  float fp32_tmp = min_value + tmp * (max_value - min_value);
276 
277  return ck::type_convert<ck::bf8_t>(fp32_tmp);
278  }
279 };
280 #endif
281 
282 template <>
284 {
285  float min_value = 0;
286  float max_value = 1;
287 
288  template <typename... Is>
290  {
291  float tmp = float(std::rand()) / float(RAND_MAX);
292 
293  float fp32_tmp = min_value + tmp * (max_value - min_value);
294 
295  return ck::type_convert<ck::f4_t>(fp32_tmp);
296  }
297 };
298 
299 template <typename T>
301 {
302  std::mt19937 generator;
303  std::normal_distribution<float> distribution;
304 
305  GeneratorTensor_4(float mean, float stddev, unsigned int seed = 1)
306  : generator(seed), distribution(mean, stddev){};
307 
308  template <typename... Is>
309  T operator()(Is...)
310  {
311  float tmp = distribution(generator);
312 
313  return ck::type_convert<T>(tmp);
314  }
315 };
316 
318 {
319  template <typename... Ts>
320  float operator()(Ts... Xs) const
321  {
322  std::array<ck::index_t, sizeof...(Ts)> dims = {static_cast<ck::index_t>(Xs)...};
323  return std::accumulate(dims.begin(),
324  dims.end(),
325  true,
326  [](bool init, ck::index_t x) -> int { return init != (x % 2); })
327  ? 1
328  : -1;
329  }
330 };
331 
349 template <typename T, ck::index_t Dim>
351 {
352  template <typename... Ts>
353  T operator()(Ts... Xs) const
354  {
355  std::array<ck::index_t, sizeof...(Ts)> dims = {{static_cast<ck::index_t>(Xs)...}};
356 
357  float tmp = dims[Dim];
358  return ck::type_convert<T>(tmp);
359  }
360 };
361 
362 template <typename T, size_t NumEffectiveDim = 2>
364 {
365  T value{1};
366 
367  template <typename... Ts>
368  T operator()(Ts... Xs) const
369  {
370  std::array<ck::index_t, sizeof...(Ts)> dims = {{static_cast<ck::index_t>(Xs)...}};
371  size_t start_dim = dims.size() - NumEffectiveDim;
372  bool pred = true;
373  for(size_t i = start_dim + 1; i < dims.size(); i++)
374  {
375  pred &= (dims[start_dim] == dims[i]);
376  }
377  return pred ? value : T{0};
378  }
379 };
int8_t int8_t
Definition: int8.hpp:20
Definition: ck.hpp:264
bf8_fnuz_t bf8_t
Definition: amd_ck_fp8.hpp:991
f8_fnuz_t f8_t
Definition: amd_ck_fp8.hpp:990
unsigned _BitInt(4) f4_t
Definition: data_type.hpp:27
_Float16 half_t
Definition: data_type.hpp:25
ushort bhalf_t
Definition: data_type.hpp:24
int32_t index_t
Definition: ck.hpp:289
Definition: host_tensor_generator.hpp:14
T operator()(Is...)
Definition: host_tensor_generator.hpp:16
ck::bhalf_t operator()(Is...)
Definition: host_tensor_generator.hpp:52
ck::f4_t operator()(Is...)
Definition: host_tensor_generator.hpp:78
ck::half_t operator()(Is...)
Definition: host_tensor_generator.hpp:40
ck::pk_i4_t operator()(Is...)
Definition: host_tensor_generator.hpp:102
int8_t operator()(Is...)
Definition: host_tensor_generator.hpp:90
Definition: host_tensor_generator.hpp:24
T value
Definition: host_tensor_generator.hpp:25
T operator()(Is...)
Definition: host_tensor_generator.hpp:28
ck::bhalf_t operator()(Is...)
Definition: host_tensor_generator.hpp:130
ck::f4_t operator()(Is...)
Definition: host_tensor_generator.hpp:205
ck::pk_i4_t operator()(Is...)
Definition: host_tensor_generator.hpp:157
int8_t operator()(Is...)
Definition: host_tensor_generator.hpp:144
Definition: host_tensor_generator.hpp:112
int max_value
Definition: host_tensor_generator.hpp:114
int min_value
Definition: host_tensor_generator.hpp:113
T operator()(Is...)
Definition: host_tensor_generator.hpp:117
ck::bhalf_t operator()(Is...)
Definition: host_tensor_generator.hpp:234
ck::f4_t operator()(Is...)
Definition: host_tensor_generator.hpp:289
Definition: host_tensor_generator.hpp:214
float max_value
Definition: host_tensor_generator.hpp:216
float min_value
Definition: host_tensor_generator.hpp:215
T operator()(Is...)
Definition: host_tensor_generator.hpp:219
Definition: host_tensor_generator.hpp:301
std::mt19937 generator
Definition: host_tensor_generator.hpp:302
GeneratorTensor_4(float mean, float stddev, unsigned int seed=1)
Definition: host_tensor_generator.hpp:305
T operator()(Is...)
Definition: host_tensor_generator.hpp:309
std::normal_distribution< float > distribution
Definition: host_tensor_generator.hpp:303
Definition: host_tensor_generator.hpp:318
float operator()(Ts... Xs) const
Definition: host_tensor_generator.hpp:320
Definition: host_tensor_generator.hpp:364
T operator()(Ts... Xs) const
Definition: host_tensor_generator.hpp:368
T value
Definition: host_tensor_generator.hpp:365
Is used to generate sequential values based on the specified dimension.
Definition: host_tensor_generator.hpp:351
T operator()(Ts... Xs) const
Definition: host_tensor_generator.hpp:353
Definition: data_type.hpp:320