Support half precision sigmoid activation (#378)
* Support half precision sigmoid activation * introduce a vectorized variant using fast_tanh * move the math to fast_math.h * fixed compile * .raw() -> .to_half() Co-authored-by: Haicheng Wu <haichengw@nvidia.com>
This commit is contained in:
@@ -98,15 +98,7 @@ template <typename T>
|
||||
struct Sigmoid {
|
||||
CUTLASS_HOST_DEVICE
|
||||
T operator()(T const &scalar) const {
|
||||
return T(1) / (T(1) + exp(-scalar));
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
struct Sigmoid<float> {
|
||||
CUTLASS_HOST_DEVICE
|
||||
float operator()(float const &scalar) const {
|
||||
return 1.0f / (1.0f + expf(-scalar));
|
||||
return T(1) / (T(1) + fast_exp(-scalar));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -126,6 +118,30 @@ struct Sigmoid<Array<T, N> > {
|
||||
}
|
||||
};
|
||||
|
||||
template <int N>
|
||||
struct Sigmoid<Array<half_t, N>> {
|
||||
using T = half_t;
|
||||
|
||||
CUTLASS_HOST_DEVICE
|
||||
Array<T, N> operator()(Array<T, N> const& z) const {
|
||||
plus<Array<T, N>> add;
|
||||
|
||||
#if defined(CUTLASS_USE_TANH_FOR_SIGMOID)
|
||||
multiplies<Array<T, N>> mul;
|
||||
fast_tanh_op<Array<T, N>> tanh;
|
||||
return mul(add(tanh(mul(z, cutlass::constants::half<T>())), cutlass::constants::one<T>()),
|
||||
cutlass::constants::half<T>());
|
||||
#else
|
||||
divides<Array<T, N>> div;
|
||||
negate<Array<T, N>> neg;
|
||||
fast_exp_op<Array<T, N>> fast_exp;
|
||||
return div(cutlass::constants::one<T>(),
|
||||
add(cutlass::constants::one<T>(),
|
||||
fast_exp(neg(z))));
|
||||
#endif
|
||||
}
|
||||
};
|
||||
|
||||
// SiLu (swish) operator introduced by Elfwing et al. in the following paper
|
||||
// "Sigmoid-Weighted Linear Units for Neural Network Function Approximation in Reinforcement Learning" (2017)
|
||||
// https://arxiv.org/pdf/1702.03118.pdf
|
||||
|
||||
Reference in New Issue
Block a user