math_v2.hpp 4.08 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 {

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

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

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

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

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

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

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

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

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

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

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

Adam Osewski's avatar
Adam Osewski committed
47
#ifdef CK_EXPERIMENTAL_BIT_INT_EXTENSION_INT4
Umang Yadav's avatar
Umang Yadav committed
48
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
static inline __host__ bool isnan(float x) { return std::isnan(x); };
56

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

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

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

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

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

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

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

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

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

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

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

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

Umang Yadav's avatar
Umang Yadav committed
104
// math functions for the HIP kernel,  some are implemented by calling hip builtin functions
105
106
107
108
109

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
110
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
119
static inline __device__ int32_t abs(int32_t x)
{
    int32_t sgn = x >> (32 - 1);
120

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

193
194
} // namespace math
} // namespace ck