Skip to content

Commit 70a7973

Browse files
dbortfacebook-github-bot
authored andcommitted
Make kernels/portable/cpu compatible with C++11/14/17/20 (#128)
Summary: Pull Request resolved: #128 Tweak the portable kernels to build cleanly with C++11 as well as with more recent versions. This only covers non-test, non-aten targets under `//executorch/kernels/portable/cpu/...`. A lot of the template changes deal with the lack of <base>_t templates in C++11. Most of them are of the form ``` template<class T> using BASE_t = typename BASE<T>::type; ``` so the fix was to inline that pattern: add `typename` to the front and `::type` to the end. Reviewed By: digantdesai, kirklandsign Differential Revision: D48668113 fbshipit-source-id: 93f0cbbd4cb85285e4a5f5657e0e1cc33a5a826d
1 parent 3662478 commit 70a7973

File tree

6 files changed

+58
-33
lines changed

6 files changed

+58
-33
lines changed

kernels/portable/cpu/op_clamp.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ namespace {
2727

2828
template <
2929
typename FLOAT_T,
30-
std::enable_if_t<std::is_floating_point<FLOAT_T>::value, bool> = true>
30+
typename std::enable_if<std::is_floating_point<FLOAT_T>::value, bool>::
31+
type = true>
3132
FLOAT_T min_override(FLOAT_T a, FLOAT_T b) {
3233
if (std::isnan(a)) {
3334
return a;
@@ -40,7 +41,8 @@ FLOAT_T min_override(FLOAT_T a, FLOAT_T b) {
4041

4142
template <
4243
typename FLOAT_T,
43-
std::enable_if_t<std::is_floating_point<FLOAT_T>::value, bool> = true>
44+
typename std::enable_if<std::is_floating_point<FLOAT_T>::value, bool>::
45+
type = true>
4446
FLOAT_T max_override(FLOAT_T a, FLOAT_T b) {
4547
if (std::isnan(a)) {
4648
return a;
@@ -53,14 +55,14 @@ FLOAT_T max_override(FLOAT_T a, FLOAT_T b) {
5355

5456
template <
5557
typename INT_T,
56-
std::enable_if_t<std::is_integral<INT_T>::value, bool> = true>
58+
typename std::enable_if<std::is_integral<INT_T>::value, bool>::type = true>
5759
INT_T min_override(INT_T a, INT_T b) {
5860
return std::min(a, b);
5961
}
6062

6163
template <
6264
typename INT_T,
63-
std::enable_if_t<std::is_integral<INT_T>::value, bool> = true>
65+
typename std::enable_if<std::is_integral<INT_T>::value, bool>::type = true>
6466
INT_T max_override(INT_T a, INT_T b) {
6567
return std::max(a, b);
6668
}

kernels/portable/cpu/op_floor_divide.cpp

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -28,26 +28,32 @@ namespace {
2828
* So, instead it is calculated as: a // b = (a - remainder(a, b)) / b
2929
* With some additional fix-ups added to the result.
3030
*/
31-
template <typename CTYPE>
32-
CTYPE floor_divide(CTYPE a, CTYPE b) {
33-
if constexpr (std::is_integral_v<CTYPE>) {
34-
const auto quot = a / b;
35-
if (std::signbit(a) == std::signbit(b)) {
36-
return quot;
37-
}
38-
const auto rem = a % b;
39-
return rem ? quot - 1 : quot;
40-
} else {
41-
if (b == 0) {
42-
return std::signbit(a) ? -INFINITY : INFINITY;
43-
}
44-
const auto mod = std::fmod(a, b);
45-
auto div = (a - mod) / b;
46-
if ((mod != 0) && std::signbit(b) != std::signbit(mod)) {
47-
return div - 1;
48-
}
49-
return div;
31+
template <
32+
typename INT_T,
33+
typename std::enable_if<std::is_integral<INT_T>::value, bool>::type = true>
34+
INT_T floor_divide(INT_T a, INT_T b) {
35+
const auto quot = a / b;
36+
if (std::signbit(a) == std::signbit(b)) {
37+
return quot;
5038
}
39+
const auto rem = a % b;
40+
return rem ? quot - 1 : quot;
41+
}
42+
43+
template <
44+
typename FLOAT_T,
45+
typename std::enable_if<std::is_floating_point<FLOAT_T>::value, bool>::
46+
type = true>
47+
FLOAT_T floor_divide(FLOAT_T a, FLOAT_T b) {
48+
if (b == 0) {
49+
return std::signbit(a) ? -INFINITY : INFINITY;
50+
}
51+
const auto mod = std::fmod(a, b);
52+
auto div = (a - mod) / b;
53+
if ((mod != 0) && std::signbit(b) != std::signbit(mod)) {
54+
return div - 1;
55+
}
56+
return div;
5157
}
5258

5359
} // namespace

kernels/portable/cpu/op_hardtanh.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ namespace {
2424

2525
template <
2626
typename FLOAT_T,
27-
std::enable_if_t<std::is_floating_point<FLOAT_T>::value, bool> = true>
27+
typename std::enable_if<std::is_floating_point<FLOAT_T>::value, bool>::
28+
type = true>
2829
FLOAT_T min_override(FLOAT_T a, FLOAT_T b) {
2930
if (std::isnan(a)) {
3031
return a;
@@ -37,7 +38,8 @@ FLOAT_T min_override(FLOAT_T a, FLOAT_T b) {
3738

3839
template <
3940
typename FLOAT_T,
40-
std::enable_if_t<std::is_floating_point<FLOAT_T>::value, bool> = true>
41+
typename std::enable_if<std::is_floating_point<FLOAT_T>::value, bool>::
42+
type = true>
4143
FLOAT_T max_override(FLOAT_T a, FLOAT_T b) {
4244
if (std::isnan(a)) {
4345
return a;
@@ -50,14 +52,14 @@ FLOAT_T max_override(FLOAT_T a, FLOAT_T b) {
5052

5153
template <
5254
typename INT_T,
53-
std::enable_if_t<std::is_integral<INT_T>::value, bool> = true>
55+
typename std::enable_if<std::is_integral<INT_T>::value, bool>::type = true>
5456
INT_T min_override(INT_T a, INT_T b) {
5557
return std::min(a, b);
5658
}
5759

5860
template <
5961
typename INT_T,
60-
std::enable_if_t<std::is_integral<INT_T>::value, bool> = true>
62+
typename std::enable_if<std::is_integral<INT_T>::value, bool>::type = true>
6163
INT_T max_override(INT_T a, INT_T b) {
6264
return std::max(a, b);
6365
}

kernels/portable/cpu/scalar_utils.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,9 @@ inline ScalarType promote_type_with_scalar(ScalarType t, Scalar scalar) {
128128
*/
129129
template <
130130
typename INT_T,
131-
std::enable_if_t<
132-
std::is_integral_v<INT_T> && !std::is_same_v<INT_T, bool>,
133-
bool> = true>
131+
typename std::enable_if<
132+
std::is_integral<INT_T>::value && !std::is_same<INT_T, bool>::value,
133+
bool>::type = true>
134134
bool extract_scalar(Scalar scalar, INT_T* out_val) {
135135
if (!scalar.isIntegral(/*includeBool=*/false)) {
136136
return false;
@@ -158,7 +158,8 @@ bool extract_scalar(Scalar scalar, INT_T* out_val) {
158158
*/
159159
template <
160160
typename FLOAT_T,
161-
std::enable_if_t<std::is_floating_point_v<FLOAT_T>, bool> = true>
161+
typename std::enable_if<std::is_floating_point<FLOAT_T>::value, bool>::
162+
type = true>
162163
bool extract_scalar(Scalar scalar, FLOAT_T* out_val) {
163164
double val;
164165
if (scalar.isFloatingPoint()) {
@@ -193,7 +194,8 @@ bool extract_scalar(Scalar scalar, FLOAT_T* out_val) {
193194
*/
194195
template <
195196
typename BOOL_T,
196-
std::enable_if_t<std::is_same_v<BOOL_T, bool>, bool> = true>
197+
typename std::enable_if<std::is_same<BOOL_T, bool>::value, bool>::type =
198+
true>
197199
bool extract_scalar(Scalar scalar, BOOL_T* out_val) {
198200
if (scalar.isIntegral(false)) {
199201
*out_val = static_cast<bool>(scalar.to<int64_t>());

kernels/portable/cpu/util/kernel_ops_util.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
#pragma once
1010

11+
#include <tuple>
12+
1113
#include <executorch/runtime/kernel/kernel_includes.h>
1214

1315
namespace torch {

kernels/portable/cpu/vec_ops.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,17 @@ inline void vec_softmax(T* __restrict__ y, const U* __restrict__ x, int n) {
151151
}
152152
}
153153

154+
namespace internal {
155+
template <class T>
156+
constexpr const T& clamp(const T& v, const T& lo, const T& hi) {
157+
#ifdef __cpp_lib_clamp
158+
return std::clamp(v, lo, hi);
159+
#else
160+
return v < lo ? lo : hi < v ? hi : v;
161+
#endif
162+
}
163+
} // namespace internal
164+
154165
/// Quantizes the elements of `x` into `y`, both of which must have `size`
155166
/// elements. Inverse of `dequantize_i8_f32()`.
156167
inline void quantize_i8_f32(
@@ -161,7 +172,7 @@ inline void quantize_i8_f32(
161172
size_t size) {
162173
for (size_t i = 0; i < size; ++i) {
163174
float tmp = roundf(x[i] * scale + zero_point);
164-
y[i] = std::clamp(tmp, -128.f, 127.f);
175+
y[i] = internal::clamp(tmp, -128.f, 127.f);
165176
}
166177
}
167178

0 commit comments

Comments
 (0)