math_v2.hpp 4.11 KB
Newer Older
Chao Liu's avatar
Chao Liu committed
1
// SPDX-License-Identifier: MIT
Illia Silin's avatar
Illia Silin committed
2
// Copyright (c) 2018-2023, Advanced Micro Devices, Inc. All rights reserved.
Chao Liu's avatar
Chao Liu committed
3

Chao Liu's avatar
Chao Liu committed
4
#pragma once
5

Qianfeng's avatar
Qianfeng committed
6
#ifndef __HIP_DEVICE_COMPILE__
7
#include <cmath>
Qianfeng's avatar
Qianfeng committed
8
#endif
Chao Liu's avatar
Chao Liu committed
9
10
11

#include "ck/utility/data_type.hpp"
#include "ck/utility/type.hpp"
12
13
14
15

namespace ck {
namespace math {

16
#ifndef __HIPCC_RTC__
Umang Yadav's avatar
Umang Yadav committed
17
// math functions for the host,  some are implemented by calling C++ std functions
18

Umang Yadav's avatar
Umang Yadav committed
19
static inline __host__ float abs(float x) { return std::abs(x); };
20

Umang Yadav's avatar
Umang Yadav committed
21
static inline __host__ double abs(double x) { return std::abs(x); };
22

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

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

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

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

Umang Yadav's avatar
Umang Yadav committed
37
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
52
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
53
54
55
}
#endif

Umang Yadav's avatar
Umang Yadav committed
56
static inline __host__ bool isnan(float x) { return std::isnan(x); };
57

Umang Yadav's avatar
Umang Yadav committed
58
static inline __host__ bool isnan(double x) { return std::isnan(x); };
59

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

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

Umang Yadav's avatar
Umang Yadav committed
72
73
74
static inline __host__ bool isnan(half_t x)
{
    uint16_t xx = ck::bit_cast<uint16_t>(x);
75

Umang Yadav's avatar
Umang Yadav committed
76
    return (xx & 0x7FFF) > 0x7C00;
77
78
};

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

Umang Yadav's avatar
Umang Yadav committed
87
88
89
90
static inline __host__ half_t sqrt(half_t x)
{
    return static_cast<half_t>(std::sqrt(static_cast<float>(x)));
};
91

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

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

Umang Yadav's avatar
Umang Yadav committed
96
97
98
99
static inline __host__ half_t tanh(half_t x)
{
    return static_cast<half_t>(std::tanh(static_cast<float>(x)));
};
100

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

Umang Yadav's avatar
Umang Yadav committed
103
static inline __host__ double tanh(double x) { return std::tanh(x); };
104
#endif
Umang Yadav's avatar
Umang Yadav committed
105
// 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
113
static inline __device__ int8_t abs(int8_t x)
{
    int8_t sgn = x >> (8 - 1);
114

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

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

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

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

Umang Yadav's avatar
Umang Yadav committed
130
    return (x ^ sgn) - sgn;
Adam Osewski's avatar
Adam Osewski committed
131
132
133
};
#endif

Umang Yadav's avatar
Umang Yadav committed
134
135
136
static inline __device__ half_t abs(half_t x)
{
    uint16_t xx = ck::bit_cast<uint16_t>(x);
137

Umang Yadav's avatar
Umang Yadav committed
138
    uint16_t abs_xx = xx & 0x7fff;
139

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

Umang Yadav's avatar
Umang Yadav committed
142
    return abs_x;
143
};
144
145
146
147
148

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
149
150
151
152
static inline __device__ bool isnan(int8_t x)
{
    (void)x;
    return false;
153
};
154

Umang Yadav's avatar
Umang Yadav committed
155
156
157
158
static inline __device__ bool isnan(int32_t x)
{
    (void)x;
    return false;
159
};
160

Adam Osewski's avatar
Adam Osewski committed
161
#ifdef CK_EXPERIMENTAL_BIT_INT_EXTENSION_INT4
Umang Yadav's avatar
Umang Yadav committed
162
163
164
165
static inline __device__ bool isnan(int4_t x)
{
    (void)x;
    return false;
Adam Osewski's avatar
Adam Osewski committed
166
167
168
};
#endif

Umang Yadav's avatar
Umang Yadav committed
169
170
171
static inline __device__ bool isnan(half_t x)
{
    uint16_t xx = ck::bit_cast<uint16_t>(x);
172

Umang Yadav's avatar
Umang Yadav committed
173
    return (xx & 0x7FFF) > 0x7C00;
174
};
175

Umang Yadav's avatar
Umang Yadav committed
176
177
178
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
179
180
};

Umang Yadav's avatar
Umang Yadav committed
181
static inline __device__ float sqrt(float x) { return __builtin_amdgcn_sqrtf(x); };
182

Umang Yadav's avatar
Umang Yadav committed
183
static inline __device__ double sqrt(double x) { return __builtin_amdgcn_sqrt(x); };
184

Umang Yadav's avatar
Umang Yadav committed
185
186
187
static inline __device__ half_t tanh(half_t x)
{
    return static_cast<half_t>(::tanhf(static_cast<float>(x)));
188
189
190
191
192
193
};

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

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

194
195
} // namespace math
} // namespace ck