math_v2.hpp 4.13 KB
Newer Older
Umang Yadav's avatar
Umang Yadav committed
1
2
3

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Weverything"
Chao Liu's avatar
Chao Liu committed
4
// SPDX-License-Identifier: MIT
Illia Silin's avatar
Illia Silin committed
5
// Copyright (c) 2018-2023, Advanced Micro Devices, Inc. All rights reserved.
Chao Liu's avatar
Chao Liu committed
6

Chao Liu's avatar
Chao Liu committed
7
#pragma once
8

Qianfeng's avatar
Qianfeng committed
9
#ifndef __HIP_DEVICE_COMPILE__
10
#include <cmath>
Qianfeng's avatar
Qianfeng committed
11
#endif
Chao Liu's avatar
Chao Liu committed
12
13
14

#include "ck/utility/data_type.hpp"
#include "ck/utility/type.hpp"
15
16
17
18

namespace ck {
namespace math {

Umang Yadav's avatar
Umang Yadav committed
19
20
// math functions for the host,  some are implemented by calling C++ std
// functions
21

Umang Yadav's avatar
Umang Yadav committed
22
static inline __host__ float abs(float x) { return x < 0 ? x * -1.0 : x; };
23

Umang Yadav's avatar
Umang Yadav committed
24
static inline __host__ double abs(double x) { return x < 0 ? x * -1.0 : x; };
25

Umang Yadav's avatar
Umang Yadav committed
26
27
static inline __host__ int8_t abs(int8_t x) {
  int8_t sgn = x >> (8 - 1);
28

Umang Yadav's avatar
Umang Yadav committed
29
  return (x ^ sgn) - sgn;
30
31
};

Umang Yadav's avatar
Umang Yadav committed
32
33
static inline __host__ int32_t abs(int32_t x) {
  int32_t sgn = x >> (32 - 1);
34

Umang Yadav's avatar
Umang Yadav committed
35
  return (x ^ sgn) - sgn;
36
37
};

Umang Yadav's avatar
Umang Yadav committed
38
39
static inline __host__ half_t abs(half_t x) {
  uint16_t xx = ck::bit_cast<uint16_t>(x);
40

Umang Yadav's avatar
Umang Yadav committed
41
  uint16_t abs_xx = xx & 0x7fff;
42

Umang Yadav's avatar
Umang Yadav committed
43
  half_t abs_x = ck::bit_cast<half_t>(abs_xx);
44

Umang Yadav's avatar
Umang Yadav committed
45
  return abs_x;
46
47
};

Adam Osewski's avatar
Adam Osewski committed
48
#ifdef CK_EXPERIMENTAL_BIT_INT_EXTENSION_INT4
Umang Yadav's avatar
Umang Yadav committed
49
50
51
static inline __host__ int4_t abs(int4_t x) {
  int4_t sgn = x >> (4 - 1);
  return (x ^ sgn) - sgn;
Adam Osewski's avatar
Adam Osewski committed
52
53
54
}
#endif

Umang Yadav's avatar
Umang Yadav committed
55
56
57
58
59
// TODO: to bit arithmetic to figure it out
static inline __host__ bool isnan(float x) {
  (void)x;
  return false;
};
60

Umang Yadav's avatar
Umang Yadav committed
61
62
63
64
static inline __host__ bool isnan(double x) {
  (void)x;
  return false;
};
65

Umang Yadav's avatar
Umang Yadav committed
66
67
68
static inline __host__ bool isnan(int8_t x) {
  (void)x;
  return false;
69
70
};

Umang Yadav's avatar
Umang Yadav committed
71
72
73
static inline __host__ bool isnan(int32_t x) {
  (void)x;
  return false;
74
75
};

Umang Yadav's avatar
Umang Yadav committed
76
77
static inline __host__ bool isnan(half_t x) {
  uint16_t xx = ck::bit_cast<uint16_t>(x);
78

Umang Yadav's avatar
Umang Yadav committed
79
  return (xx & 0x7FFF) > 0x7C00;
80
81
};

Adam Osewski's avatar
Adam Osewski committed
82
#ifdef CK_EXPERIMENTAL_BIT_INT_EXTENSION_INT4
Umang Yadav's avatar
Umang Yadav committed
83
84
85
static inline __host__ bool isnan(int4_t x) {
  (void)x;
  return false;
Adam Osewski's avatar
Adam Osewski committed
86
87
88
};
#endif

Umang Yadav's avatar
Umang Yadav committed
89
90
// MIGRAPHX doesn't care about host compilation, just return identity values for
// now
rocking5566's avatar
rocking5566 committed
91

Umang Yadav's avatar
Umang Yadav committed
92
static inline __host__ half_t sqrt(half_t x) { return x; };
93

Umang Yadav's avatar
Umang Yadav committed
94
static inline __host__ float sqrt(float x) { return x; };
95

Umang Yadav's avatar
Umang Yadav committed
96
static inline __host__ double sqrt(double x) { return x; };
97

Umang Yadav's avatar
Umang Yadav committed
98
static inline __host__ half_t tanh(half_t x) { return x; };
99

Umang Yadav's avatar
Umang Yadav committed
100
static inline __host__ float tanh(float x) { return x; };
101

Umang Yadav's avatar
Umang Yadav committed
102
103
104
105
static inline __host__ double tanh(double x) { return x; };

// math functions for the HIP kernel,  some are implemented by calling hip
// builtin functions
106
107
108
109
110

static inline __device__ float abs(float x) { return ::abs(x); };

static inline __device__ double abs(double x) { return ::abs(x); };

Umang Yadav's avatar
Umang Yadav committed
111
112
static inline __device__ int8_t abs(int8_t x) {
  int8_t sgn = x >> (8 - 1);
113

Umang Yadav's avatar
Umang Yadav committed
114
  return (x ^ sgn) - sgn;
115
116
};

Umang Yadav's avatar
Umang Yadav committed
117
118
static inline __device__ int32_t abs(int32_t x) {
  int32_t sgn = x >> (32 - 1);
119

Umang Yadav's avatar
Umang Yadav committed
120
  return (x ^ sgn) - sgn;
121
122
};

Adam Osewski's avatar
Adam Osewski committed
123
#ifdef CK_EXPERIMENTAL_BIT_INT_EXTENSION_INT4
Umang Yadav's avatar
Umang Yadav committed
124
125
static inline __device__ int4_t abs(int4_t x) {
  int4_t sgn = x >> (4 - 1);
Adam Osewski's avatar
Adam Osewski committed
126

Umang Yadav's avatar
Umang Yadav committed
127
  return (x ^ sgn) - sgn;
Adam Osewski's avatar
Adam Osewski committed
128
129
130
};
#endif

Umang Yadav's avatar
Umang Yadav committed
131
132
static inline __device__ half_t abs(half_t x) {
  uint16_t xx = ck::bit_cast<uint16_t>(x);
133

Umang Yadav's avatar
Umang Yadav committed
134
  uint16_t abs_xx = xx & 0x7fff;
135

Umang Yadav's avatar
Umang Yadav committed
136
  half_t abs_x = ck::bit_cast<half_t>(abs_xx);
137

Umang Yadav's avatar
Umang Yadav committed
138
  return abs_x;
139
};
140
141
142
143
144

static inline __device__ bool isnan(float x) { return ::isnan(x); };

static inline __device__ bool isnan(double x) { return ::isnan(x); };

Umang Yadav's avatar
Umang Yadav committed
145
146
147
static inline __device__ bool isnan(int8_t x) {
  (void)x;
  return false;
148
};
149

Umang Yadav's avatar
Umang Yadav committed
150
151
152
static inline __device__ bool isnan(int32_t x) {
  (void)x;
  return false;
153
};
154

Adam Osewski's avatar
Adam Osewski committed
155
#ifdef CK_EXPERIMENTAL_BIT_INT_EXTENSION_INT4
Umang Yadav's avatar
Umang Yadav committed
156
157
158
static inline __device__ bool isnan(int4_t x) {
  (void)x;
  return false;
Adam Osewski's avatar
Adam Osewski committed
159
160
161
};
#endif

Umang Yadav's avatar
Umang Yadav committed
162
163
static inline __device__ bool isnan(half_t x) {
  uint16_t xx = ck::bit_cast<uint16_t>(x);
164

Umang Yadav's avatar
Umang Yadav committed
165
  return (xx & 0x7FFF) > 0x7C00;
166
};
167

Umang Yadav's avatar
Umang Yadav committed
168
169
static inline __device__ half_t sqrt(half_t x) {
  return static_cast<half_t>(__builtin_amdgcn_sqrtf(static_cast<float>(x)));
rocking5566's avatar
rocking5566 committed
170
171
};

Umang Yadav's avatar
Umang Yadav committed
172
173
174
static inline __device__ float sqrt(float x) {
  return __builtin_amdgcn_sqrtf(x);
};
175

Umang Yadav's avatar
Umang Yadav committed
176
177
178
static inline __device__ double sqrt(double x) {
  return __builtin_amdgcn_sqrt(x);
};
179

Umang Yadav's avatar
Umang Yadav committed
180
181
static inline __device__ half_t tanh(half_t x) {
  return static_cast<half_t>(::tanhf(static_cast<float>(x)));
182
183
184
185
186
187
};

static inline __device__ float tanh(float x) { return ::tanhf(x); };

static inline __device__ double tanh(double x) { return ::tanh(x); };

188
189
} // namespace math
} // namespace ck
Umang Yadav's avatar
Umang Yadav committed
190
191

#pragma clang diagnostic pop