9 #if defined(__HIPCC_RTC__) || defined(CK_CODE_GEN_RTC)
16 __host__ __device__
static constexpr
int32_t Lowest() noexcept {
return -2147483647 - 1; }
18 __host__ __device__
static constexpr
int32_t Min() noexcept {
return -2147483647 - 1; }
20 __host__ __device__
static constexpr
int32_t Max() noexcept {
return 2147483647; }
22 __host__ __device__
static constexpr
int32_t Infinity() noexcept {
return 0; }
29 __host__ __device__
static constexpr
int16_t Lowest() noexcept {
return -32768; }
31 __host__ __device__
static constexpr
int16_t Min() noexcept {
return -32768; }
33 __host__ __device__
static constexpr
int16_t Max() noexcept {
return 32767; }
35 __host__ __device__
static constexpr
int16_t Infinity() noexcept {
return 0; }
41 struct NumericLimits<
int8_t>
43 __host__ __device__
static constexpr
int8_t Lowest() noexcept {
return -128; }
45 __host__ __device__
static constexpr
int8_t Min() noexcept {
return -128; }
47 __host__ __device__
static constexpr
int8_t Max() noexcept {
return 127; }
49 __host__ __device__
static constexpr
int8_t Infinity() noexcept {
return 0; }
51 __host__ __device__
static constexpr
int8_t QuietNaN() {
return 0; }
57 __host__ __device__
static constexpr
uint32_t Lowest() noexcept {
return 0; }
59 __host__ __device__
static constexpr
uint32_t Min() noexcept {
return 0; }
61 __host__ __device__
static constexpr
uint32_t Max() noexcept {
return 4294967295U; }
63 __host__ __device__
static constexpr
uint32_t Infinity() noexcept {
return 0; }
71 __host__ __device__
static constexpr
uint16_t Lowest() noexcept {
return 0; }
73 __host__ __device__
static constexpr
uint16_t Min() noexcept {
return 0; }
75 __host__ __device__
static constexpr
uint16_t Max() noexcept {
return 65535U; }
77 __host__ __device__
static constexpr
uint16_t Infinity() noexcept {
return 0; }
83 struct NumericLimits<float>
85 static constexpr
unsigned int binary_min = 0x00800000;
86 static constexpr
unsigned int binary_max = 0x7F7FFFFF;
87 static constexpr
unsigned int binary_lowest = 0xFF7FFFFF;
88 static constexpr
unsigned int binary_qnan = 0xFFC00001;
89 static constexpr
unsigned int binary_inf = 0x7F800000;
91 __host__ __device__
static constexpr
float Min() {
return bit_cast<float>(binary_min); }
93 __host__ __device__
static constexpr
float Max() {
return bit_cast<float>(binary_max); }
95 __host__ __device__
static constexpr
float Lowest() {
return bit_cast<float>(binary_lowest); }
97 __host__ __device__
static constexpr
float QuietNaN() {
return bit_cast<float>(binary_qnan); }
99 __host__ __device__
static constexpr
float Infinity() {
return bit_cast<float>(binary_inf); }
103 struct NumericLimits<
half_t>
105 static constexpr
unsigned short binary_min = 0x0400;
106 static constexpr
unsigned short binary_max = 0x7BFF;
107 static constexpr
unsigned short binary_lowest = 0xFBFF;
108 static constexpr
unsigned short binary_qnan = 0x7FFF;
110 __host__ __device__
static constexpr
half_t Min() {
return bit_cast<half_t>(binary_min); }
112 __host__ __device__
static constexpr
half_t Max() {
return bit_cast<half_t>(binary_max); }
114 __host__ __device__
static constexpr
half_t Lowest() {
return bit_cast<half_t>(binary_lowest); }
116 __host__ __device__
static constexpr
half_t QuietNaN() {
return bit_cast<half_t>(binary_qnan); }
119 #ifdef CK_EXPERIMENTAL_BIT_INT_EXTENSION_INT4
121 struct NumericLimits<
int4_t>
123 __host__ __device__
static constexpr
int4_t Min() {
return int4_t(-8); }
125 __host__ __device__
static constexpr
int4_t Max() {
return int4_t(7); }
132 struct NumericLimits<f8_fnuz_t>
135 static constexpr
uint8_t binary_min = 0x08;
136 static constexpr
uint8_t binary_max = 0x7F;
137 static constexpr
uint8_t binary_lowest = 0xFF;
138 static constexpr
uint8_t binary_qnan = 0x80;
145 __host__ __device__
static constexpr f8_fnuz_t
Min() {
return f8_fnuz_t(binary_min); }
147 __host__ __device__
static constexpr f8_fnuz_t
Max() {
return f8_fnuz_t(binary_max); }
149 __host__ __device__
static constexpr f8_fnuz_t
Lowest() {
return f8_fnuz_t(binary_lowest); }
151 __host__ __device__
static constexpr f8_fnuz_t
QuietNaN() {
return f8_fnuz_t(binary_qnan); }
155 struct NumericLimits<bf8_fnuz_t>
158 static constexpr
uint8_t binary_min = 0x04;
159 static constexpr
uint8_t binary_max = 0x7F;
160 static constexpr
uint8_t binary_lowest = 0xFF;
161 static constexpr
uint8_t binary_qnan = 0x80;
168 __host__ __device__
static constexpr bf8_fnuz_t
Min() {
return bf8_fnuz_t(binary_min); }
170 __host__ __device__
static constexpr bf8_fnuz_t
Max() {
return bf8_fnuz_t(binary_max); }
172 __host__ __device__
static constexpr bf8_fnuz_t
Lowest() {
return bf8_fnuz_t(binary_lowest); }
174 __host__ __device__
static constexpr bf8_fnuz_t
QuietNaN() {
return bf8_fnuz_t(binary_qnan); }
178 struct NumericLimits<f8_ocp_t>
180 static constexpr
uint8_t binary_min = 0x08;
181 static constexpr
uint8_t binary_max = 0x7E;
182 static constexpr
uint8_t binary_lowest = 0xFE;
183 static constexpr
uint8_t binary_qnan = 0x7F;
185 __host__ __device__
static constexpr f8_ocp_t
Min() {
return bit_cast<f8_ocp_t>(binary_min); }
187 __host__ __device__
static constexpr f8_ocp_t
Max() {
return bit_cast<f8_ocp_t>(binary_max); }
189 __host__ __device__
static constexpr f8_ocp_t
Lowest()
191 return bit_cast<f8_ocp_t>(binary_lowest);
194 __host__ __device__
static constexpr f8_ocp_t
QuietNaN()
196 return bit_cast<f8_ocp_t>(binary_qnan);
201 struct NumericLimits<bf8_ocp_t>
203 static constexpr
uint8_t binary_min = 0x04;
204 static constexpr
uint8_t binary_max = 0x7B;
205 static constexpr
uint8_t binary_lowest = 0xFB;
206 static constexpr
uint8_t binary_qnan = 0x7D;
208 __host__ __device__
static constexpr bf8_ocp_t
Min() {
return bit_cast<bf8_ocp_t>(binary_min); }
210 __host__ __device__
static constexpr bf8_ocp_t
Max() {
return bit_cast<bf8_ocp_t>(binary_max); }
212 __host__ __device__
static constexpr bf8_ocp_t
Lowest()
214 return bit_cast<bf8_ocp_t>(binary_lowest);
217 __host__ __device__
static constexpr bf8_ocp_t
QuietNaN()
219 return bit_cast<bf8_ocp_t>(binary_qnan);
224 struct NumericLimits<
f4_t>
226 static constexpr
uint8_t binary_min_normal = 0x2;
227 static constexpr
uint8_t binary_max_normal = 0x7;
228 static constexpr
uint8_t binary_lowest_normal = 0xF;
229 static constexpr
uint8_t binary_min_subnorm = 0x1;
230 static constexpr
uint8_t binary_max_subnorm = 0x1;
232 static constexpr
float data_max_normal_number = 6;
233 static constexpr
float data_min_subnormal_number = 0.5;
235 __host__ __device__
static constexpr
f4_t Min() {
return f4_t(binary_min_normal); }
236 __host__ __device__
static constexpr
f4_t Max() {
return f4_t(binary_max_normal); }
237 __host__ __device__
static constexpr
f4_t Lowest() {
return f4_t(binary_lowest_normal); }
238 __host__ __device__
static constexpr
f4_t MinSubnorm() {
return f4_t(binary_min_subnorm); }
239 __host__ __device__
static constexpr
f4_t MaxSubnorm() {
return f4_t(binary_max_subnorm); }
241 __host__ __device__
static constexpr
float DataMaxNorm() {
return data_max_normal_number; }
242 __host__ __device__
static constexpr
float DataMinSubnorm()
244 return data_min_subnormal_number;
249 struct NumericLimits<
f6_t>
251 static constexpr
uint8_t binary_min_normal = 0x08;
252 static constexpr
uint8_t binary_max_normal = 0x1F;
253 static constexpr
uint8_t binary_lowest_normal = 0x3F;
254 static constexpr
uint8_t binary_min_subnorm = 0x01;
255 static constexpr
uint8_t binary_max_subnorm = 0x07;
257 static constexpr
float data_max_normal_number = 7.5;
258 static constexpr
float data_min_subnormal_number = 0.125;
260 __host__ __device__
static constexpr
f6_t Min() {
return f6_t(binary_min_normal & 0b111111); }
261 __host__ __device__
static constexpr
f6_t Max() {
return f6_t(binary_max_normal & 0b111111); }
262 __host__ __device__
static constexpr
f6_t Lowest()
264 return f6_t(binary_lowest_normal & 0b111111);
266 __host__ __device__
static constexpr
f6_t MinSubnorm()
268 return f6_t(binary_min_subnorm & 0b111111);
270 __host__ __device__
static constexpr
f6_t MaxSubnorm()
272 return f6_t(binary_max_subnorm & 0b111111);
275 __host__ __device__
static constexpr
float DataMaxNorm() {
return data_max_normal_number; }
276 __host__ __device__
static constexpr
float DataMinSubnorm()
278 return data_min_subnormal_number;
283 struct NumericLimits<
bf6_t>
285 static constexpr
uint8_t binary_min_normal = 0x08;
286 static constexpr
uint8_t binary_max_normal = 0x1F;
287 static constexpr
uint8_t binary_lowest_normal = 0x3F;
288 static constexpr
uint8_t binary_min_subnorm = 0x01;
289 static constexpr
uint8_t binary_max_subnorm = 0x03;
291 static constexpr
float data_max_normal_number = 28;
292 static constexpr
float data_min_subnormal_number = 0.0625;
294 __host__ __device__
static constexpr
bf6_t Min() {
return bf6_t(binary_min_normal); }
295 __host__ __device__
static constexpr
bf6_t Max() {
return bf6_t(binary_max_normal); }
296 __host__ __device__
static constexpr
bf6_t Lowest() {
return bf6_t(binary_lowest_normal); }
297 __host__ __device__
static constexpr
bf6_t MinSubnorm() {
return bf6_t(binary_min_subnorm); }
298 __host__ __device__
static constexpr
bf6_t MaxSubnorm() {
return bf6_t(binary_max_subnorm); }
300 __host__ __device__
static constexpr
float DataMaxNorm() {
return data_max_normal_number; }
301 __host__ __device__
static constexpr
float DataMinSubnorm()
303 return data_min_subnormal_number;
308 template <
typename T>
313 __host__ __device__
static constexpr T
Lowest() {
return std::numeric_limits<T>::lowest(); }
316 return std::numeric_limits<T>::quiet_NaN();
318 __host__ __device__
static constexpr T
Infinity() {
return std::numeric_limits<T>::infinity(); }
324 static constexpr
unsigned short binary_min = 0x0400;
325 static constexpr
unsigned short binary_max = 0x7BFF;
326 static constexpr
unsigned short binary_lowest = 0xFBFF;
327 static constexpr
unsigned short binary_qnan = 0x7FFF;
329 __host__ __device__
static constexpr
half_t Min() {
return bit_cast<half_t>(binary_min); }
331 __host__ __device__
static constexpr
half_t Max() {
return bit_cast<half_t>(binary_max); }
333 __host__ __device__
static constexpr
half_t Lowest() {
return bit_cast<half_t>(binary_lowest); }
335 __host__ __device__
static constexpr
half_t QuietNaN() {
return bit_cast<half_t>(binary_qnan); }
338 #ifdef CK_EXPERIMENTAL_BIT_INT_EXTENSION_INT4
340 struct NumericLimits<
int4_t>
342 __host__ __device__
static constexpr
int4_t Min() {
return int4_t(-8); }
344 __host__ __device__
static constexpr
int4_t Max() {
return int4_t(7); }
356 static constexpr
uint8_t binary_lowest = 0xFF;
379 static constexpr
uint8_t binary_lowest = 0xFF;
401 static constexpr
uint8_t binary_lowest = 0xFE;
404 __host__ __device__
static constexpr
f8_ocp_t Min() {
return bit_cast<f8_ocp_t>(binary_min); }
406 __host__ __device__
static constexpr
f8_ocp_t Max() {
return bit_cast<f8_ocp_t>(binary_max); }
410 return bit_cast<f8_ocp_t>(binary_lowest);
415 return bit_cast<f8_ocp_t>(binary_qnan);
424 static constexpr
uint8_t binary_lowest = 0xFB;
427 __host__ __device__
static constexpr
bf8_ocp_t Min() {
return bit_cast<bf8_ocp_t>(binary_min); }
429 __host__ __device__
static constexpr
bf8_ocp_t Max() {
return bit_cast<bf8_ocp_t>(binary_max); }
433 return bit_cast<bf8_ocp_t>(binary_lowest);
438 return bit_cast<bf8_ocp_t>(binary_qnan);
445 static constexpr
uint8_t binary_min_normal = 0x2;
446 static constexpr
uint8_t binary_max_normal = 0x7;
447 static constexpr
uint8_t binary_lowest_normal = 0xF;
448 static constexpr
uint8_t binary_min_subnorm = 0x1;
449 static constexpr
uint8_t binary_max_subnorm = 0x1;
451 static constexpr
float data_max_normal_number = 6;
452 static constexpr
float data_min_subnormal_number = 0.5;
454 __host__ __device__
static constexpr
f4_t Min() {
return f4_t(binary_min_normal); }
455 __host__ __device__
static constexpr
f4_t Max() {
return f4_t(binary_max_normal); }
456 __host__ __device__
static constexpr
f4_t Lowest() {
return f4_t(binary_lowest_normal); }
460 __host__ __device__
static constexpr
float DataMaxNorm() {
return data_max_normal_number; }
463 return data_min_subnormal_number;
470 static constexpr
uint8_t binary_min_normal = 0x08;
471 static constexpr
uint8_t binary_max_normal = 0x1F;
472 static constexpr
uint8_t binary_lowest_normal = 0x3F;
473 static constexpr
uint8_t binary_min_subnorm = 0x01;
474 static constexpr
uint8_t binary_max_subnorm = 0x07;
476 static constexpr
float data_max_normal_number = 7.5;
477 static constexpr
float data_min_subnormal_number = 0.125;
479 __host__ __device__
static constexpr
f6_t Min() {
return f6_t(binary_min_normal & 0b111111); }
480 __host__ __device__
static constexpr
f6_t Max() {
return f6_t(binary_max_normal & 0b111111); }
483 return f6_t(binary_lowest_normal & 0b111111);
487 return f6_t(binary_min_subnorm & 0b111111);
491 return f6_t(binary_max_subnorm & 0b111111);
494 __host__ __device__
static constexpr
float DataMaxNorm() {
return data_max_normal_number; }
497 return data_min_subnormal_number;
504 static constexpr
uint8_t binary_min_normal = 0x08;
505 static constexpr
uint8_t binary_max_normal = 0x1F;
506 static constexpr
uint8_t binary_lowest_normal = 0x3F;
507 static constexpr
uint8_t binary_min_subnorm = 0x01;
508 static constexpr
uint8_t binary_max_subnorm = 0x03;
510 static constexpr
float data_max_normal_number = 28;
511 static constexpr
float data_min_subnormal_number = 0.0625;
513 __host__ __device__
static constexpr
bf6_t Min() {
return bf6_t(binary_min_normal); }
514 __host__ __device__
static constexpr
bf6_t Max() {
return bf6_t(binary_max_normal); }
515 __host__ __device__
static constexpr
bf6_t Lowest() {
return bf6_t(binary_lowest_normal); }
519 __host__ __device__
static constexpr
float DataMaxNorm() {
return data_max_normal_number; }
522 return data_min_subnormal_number;
__host__ constexpr __device__ T max(T x)
Definition: math.hpp:84
__host__ constexpr __device__ T min(T x)
Definition: math.hpp:116
unsigned _BitInt(4) f4_t
Definition: data_type.hpp:33
_BitInt(6) f6_t
Definition: data_type.hpp:34
_Float16 half_t
Definition: data_type.hpp:31
_BitInt(4) int4_t
Definition: data_type.hpp:32
unsigned _BitInt(6) bf6_t
Definition: data_type.hpp:35
signed short int16_t
Definition: stdint.h:122
unsigned short uint16_t
Definition: stdint.h:125
unsigned int uint32_t
Definition: stdint.h:126
signed int int32_t
Definition: stdint.h:123
unsigned char uint8_t
Definition: stdint.h:124
signed char int8_t
Definition: stdint.h:121
__host__ static constexpr __device__ float DataMaxNorm()
Definition: numeric_limits.hpp:519
__host__ static constexpr __device__ bf6_t MinSubnorm()
Definition: numeric_limits.hpp:516
__host__ static constexpr __device__ float DataMinSubnorm()
Definition: numeric_limits.hpp:520
__host__ static constexpr __device__ bf6_t MaxSubnorm()
Definition: numeric_limits.hpp:517
__host__ static constexpr __device__ bf6_t Max()
Definition: numeric_limits.hpp:514
__host__ static constexpr __device__ bf6_t Lowest()
Definition: numeric_limits.hpp:515
__host__ static constexpr __device__ bf6_t Min()
Definition: numeric_limits.hpp:513
__host__ static constexpr __device__ bf8_fnuz_t QuietNaN()
Definition: numeric_limits.hpp:393
__host__ static constexpr __device__ bf8_fnuz_t Min()
Definition: numeric_limits.hpp:387
__host__ static constexpr __device__ bf8_fnuz_t Lowest()
Definition: numeric_limits.hpp:391
__host__ static constexpr __device__ bf8_fnuz_t Max()
Definition: numeric_limits.hpp:389
__host__ static constexpr __device__ bf8_ocp_t Min()
Definition: numeric_limits.hpp:427
__host__ static constexpr __device__ bf8_ocp_t Lowest()
Definition: numeric_limits.hpp:431
__host__ static constexpr __device__ bf8_ocp_t Max()
Definition: numeric_limits.hpp:429
__host__ static constexpr __device__ bf8_ocp_t QuietNaN()
Definition: numeric_limits.hpp:436
__host__ static constexpr __device__ e8m0_bexp_t Binary_2()
Definition: numeric_limits.hpp:542
__host__ static constexpr __device__ e8m0_bexp_t Binary_142()
Definition: numeric_limits.hpp:548
__host__ static constexpr __device__ e8m0_bexp_t Max()
Definition: numeric_limits.hpp:539
__host__ static constexpr __device__ e8m0_bexp_t QuietNaN()
Definition: numeric_limits.hpp:540
__host__ static constexpr __device__ e8m0_bexp_t Binary_135()
Definition: numeric_limits.hpp:544
__host__ static constexpr __device__ e8m0_bexp_t Min()
Definition: numeric_limits.hpp:538
__host__ static constexpr __device__ e8m0_bexp_t Binary_1()
Definition: numeric_limits.hpp:541
__host__ static constexpr __device__ e8m0_bexp_t Binary_3()
Definition: numeric_limits.hpp:543
__host__ static constexpr __device__ float DataMinSubnorm()
Definition: numeric_limits.hpp:461
__host__ static constexpr __device__ f4_t Min()
Definition: numeric_limits.hpp:454
__host__ static constexpr __device__ f4_t Lowest()
Definition: numeric_limits.hpp:456
__host__ static constexpr __device__ float DataMaxNorm()
Definition: numeric_limits.hpp:460
__host__ static constexpr __device__ f4_t Max()
Definition: numeric_limits.hpp:455
__host__ static constexpr __device__ f4_t MaxSubnorm()
Definition: numeric_limits.hpp:458
__host__ static constexpr __device__ f4_t MinSubnorm()
Definition: numeric_limits.hpp:457
__host__ static constexpr __device__ float DataMaxNorm()
Definition: numeric_limits.hpp:494
__host__ static constexpr __device__ f6_t MinSubnorm()
Definition: numeric_limits.hpp:485
__host__ static constexpr __device__ f6_t MaxSubnorm()
Definition: numeric_limits.hpp:489
__host__ static constexpr __device__ f6_t Min()
Definition: numeric_limits.hpp:479
__host__ static constexpr __device__ f6_t Max()
Definition: numeric_limits.hpp:480
__host__ static constexpr __device__ f6_t Lowest()
Definition: numeric_limits.hpp:481
__host__ static constexpr __device__ float DataMinSubnorm()
Definition: numeric_limits.hpp:495
__host__ static constexpr __device__ f8_fnuz_t QuietNaN()
Definition: numeric_limits.hpp:370
__host__ static constexpr __device__ f8_fnuz_t Min()
Definition: numeric_limits.hpp:364
__host__ static constexpr __device__ f8_fnuz_t Max()
Definition: numeric_limits.hpp:366
__host__ static constexpr __device__ f8_fnuz_t Lowest()
Definition: numeric_limits.hpp:368
__host__ static constexpr __device__ f8_ocp_t Min()
Definition: numeric_limits.hpp:404
__host__ static constexpr __device__ f8_ocp_t Max()
Definition: numeric_limits.hpp:406
__host__ static constexpr __device__ f8_ocp_t QuietNaN()
Definition: numeric_limits.hpp:413
__host__ static constexpr __device__ f8_ocp_t Lowest()
Definition: numeric_limits.hpp:408
__host__ static constexpr __device__ half_t Max()
Definition: numeric_limits.hpp:331
__host__ static constexpr __device__ half_t Lowest()
Definition: numeric_limits.hpp:333
__host__ static constexpr __device__ half_t Min()
Definition: numeric_limits.hpp:329
__host__ static constexpr __device__ half_t QuietNaN()
Definition: numeric_limits.hpp:335
Definition: numeric_limits.hpp:310
__host__ static constexpr __device__ T Lowest()
Definition: numeric_limits.hpp:313
__host__ static constexpr __device__ T Infinity()
Definition: numeric_limits.hpp:318
__host__ static constexpr __device__ T QuietNaN()
Definition: numeric_limits.hpp:314
__host__ static constexpr __device__ T Min()
Definition: numeric_limits.hpp:311
__host__ static constexpr __device__ T Max()
Definition: numeric_limits.hpp:312
Definition: amd_ck_fp8.hpp:49
Definition: amd_ck_fp8.hpp:369
Unsigned representation of a conventional biased Float32 exponent.
Definition: e8m0.hpp:26
Definition: amd_ck_fp8.hpp:36
Definition: amd_ck_fp8.hpp:323