24#ifndef TVM_TOPI_ELEMWISE_H_
25#define TVM_TOPI_ELEMWISE_H_
44#define TOPI_DECLARE_UNARY_OP(OpName) \
45 inline Tensor OpName(const Tensor& x, std::string name = "T_" #OpName, \
46 std::string tag = kElementWise) { \
48 x->shape, [&](const ffi::Array<PrimVar>& i) { return ::tvm::OpName(x(i)); }, name, tag); \
106 [&](
const ffi::Array<PrimVar>&
i) {
107 auto x2 = x(i) * x(i);
108 auto p = x2 * alpha_13 + alpha_11;
109 p = x2 * p + alpha_9;
110 p = x2 * p + alpha_7;
111 p = x2 * p + alpha_5;
112 p = x2 * p + alpha_3;
113 p = x2 * p + alpha_1;
116 auto q = x2 * beta_6 + beta_4;
135 if (
x->GetDataType().MatchesElementType(DLDataTypeCode::kDLFloat, 32)) {
141 x->shape, [&](
const ffi::Array<PrimVar>&
i) { return ::tvm::tanh(x(i)); }, name, tag);
156 return compute(
x->shape, [&](
const ffi::Array<PrimVar>&
i) { return x(i); }, name, tag);
170 return compute(
x->shape, [&](
const ffi::Array<PrimVar>&
i) { return -x(i); }, name, tag);
184 return compute(
x->shape, [&](
const ffi::Array<PrimVar>&
i) { return !x(i); }, name, tag);
198 return compute(
x->shape, [&](
const ffi::Array<PrimVar>&
i) { return ~x(i); }, name, tag);
213 [&](
const ffi::Array<PrimVar>&
i) {
214 PrimType x_type(x->GetDataType());
215 PrimExpr zero = MakeConst(x_type, 0);
216 PrimExpr one = MakeConst(x_type, 1);
217 PrimExpr minus_one = MakeConst(x_type, -1);
218 auto s1 = tvm::prim::Select((x(i) < zero), minus_one, zero);
219 auto s2 = tvm::prim::Select((x(i) > zero), one, s1);
237 [&](
const ffi::Array<PrimVar>&
i) {
238 PrimExpr one = MakeConst(x->GetDataType(), 1);
239 return one / tvm::sqrt(x(i));
257 std::string name =
"T_clip", std::string tag =
kElementWise) {
260 [&](
const ffi::Array<PrimVar>&
i) {
261 PrimType x_type(x->GetDataType());
262 auto min_val = tvm::cast(x_type, a_min);
263 auto max_val = tvm::cast(x_type, a_max);
264 return tvm::max(tvm::min(x(i), max_val), min_val);
285 return cast(
x,
PrimType(type), std::move(name), std::move(tag));
292 [&](
const ffi::Array<PrimVar>&
i) ->
PrimExpr {
294 PrimType expr_ty = expr.ty();
295 if (expr_ty.MatchesElementType(type.code(), type.bits())) {
296 if (expr_ty.lanes() == type.lanes()) {
298 } else if (expr_ty.lanes() == 1 && type.IsFixedLengthVector()) {
299 return tvm::prim::Broadcast(expr, type.lanes());
321 std::string tag = kElementWise) {
326 std::string tag = kElementWise) {
328 x->shape, [&](
const ffi::Array<PrimVar>&
i) { return reinterpret(type, x(i)); }, name, tag);
341 std::string tag = kElementWise) {
345 [&](
const ffi::Array<PrimVar>&
i) {
347 for (
size_t j = 1;
j <
xs.size();
j++) {
367 std::string name, std::string tag);
370 std::string name =
"T_full", std::string tag = kElementWise) {
375 std::string name =
"T_full", std::string tag = kElementWise) {
378 LOG(
ERROR) <<
"Can't cast fill_value to " << dtype;
380 return compute(
shape, [&](
const ffi::Array<PrimVar>&
i) {
return ev; }, name, tag);
395 std::string name =
"T_full_like", std::string tag = kElementWise) {
397 return compute(
x->shape, [&](
const ffi::Array<PrimVar>&
i) { return ev; }, name, tag);
436 [&](
const ffi::Array<PrimVar>&
i) {
438 auto x = ::tvm::max(::tvm::min(_x(i), x_hi), x_lo);
440 auto n = ::tvm::floor(x * log2e + one_half);
442 auto f = x - n * ln2;
444 (((((p[0] * f + p[1]) * f + p[2]) * f + p[3]) * f + p[4]) * f + p[5]) * f * f + f + one;
447 tvm::reinterpret(PrimType::Float(32), ::tvm::cast(PrimType::Int(32), n + b) << 23);
448 return ::tvm::max(ef * y, _x(i));
464 std::string tag = kElementWise) {
465 if (
x->GetDataType().MatchesElementType(DLDataTypeCode::kDLFloat, 32)) {
470 x->shape, [&](
const ffi::Array<PrimVar>&
i) { return ::tvm::exp(x(i)); }, name, tag);
479 data->shape, [&](
const ffi::Array<PrimVar>&
i) { return fast_erf_float_expr(data(i), 32); },
488 data->shape, [&](
const ffi::Array<PrimVar>&
i) { return fast_erf_float_expr(data(i), 16); },
502 std::string tag = kElementWise) {
504 if (
x_type.MatchesElementType(DLDataTypeCode::kDLFloat, 32)) {
507 }
else if (
x_type.MatchesElementType(DLDataTypeCode::kDLFloat, 16)) {
Managed reference class to FloatImmNode.
Definition expr.h:567
Typed reference/view over any Expr whose ExprNode::ty is PrimType.
Definition base_expr.h:401
Definition base_expr.h:137
static PrimType Float(int bits, int lanes=1)
Construct a floating-point type with fixed lanes.
RAII wrapper function to enter and exit a context object similar to python's with syntax.
Definition with_context.h:59
Managed Tensor. The array is backed by reference counted blocks.
Definition tensor.h:49
Tensor structure representing a possible input, or intermediate computation result.
Definition tensor.h:98
#define TOPI_DECLARE_UNARY_OP(OpName)
Definition elemwise.h:44
Tensor expression language DSL.
Definition extracted_task.h:33
Tensor compute(ffi::Array< PrimExpr > shape, FCompute fcompute, std::string name="tensor", std::string tag="", ffi::Map< ffi::String, ffi::Any > attrs={})
Construct a new tensor by computing over shape, using the computation rule: result_tensor[axis] = fco...
const Op & cast()
See pesudo code below:
PrimExpr MakeConst(PrimType dtype, ValueType value, Span span=Span())
Make a const value with certain data type.
Definition op.h:1002
constexpr auto kElementWise
Definition tags.h:32
Tensor clip(const Tensor &x, const PrimExpr &a_min, const PrimExpr &a_max, std::string name="T_clip", std::string tag=kElementWise)
Creates an operation that clips each element of a tensor to the interval [a_min, a_max].
Definition elemwise.h:256
Tensor ceil(const Tensor &x, std::string name="T_" "ceil", std::string tag=kElementWise)
Definition elemwise.h:59
Tensor isinf(const Tensor &x, std::string name="T_" "isinf", std::string tag=kElementWise)
Definition elemwise.h:77
Tensor shape(const Tensor &src, PrimType dtype, const std::string name="T_shape", const std::string tag=kInjective)
Get the shape of input tensor.
Definition transform.h:2009
Tensor round(const Tensor &x, std::string name="T_" "round", std::string tag=kElementWise)
Definition elemwise.h:60
Tensor tan(const Tensor &x, std::string name="T_" "tan", std::string tag=kElementWise)
Definition elemwise.h:65
Tensor logical_not(const Tensor &x, std::string name="T_logical_not", std::string tag=kElementWise)
Creates an operation that returns the logical NOT of a given tensor.
Definition elemwise.h:182
Tensor fast_erf_float32(const Tensor &data, std::string name, std::string tag)
Fast_erf_float expression from Eigen.
Definition elemwise.h:477
Tensor floor(const Tensor &x, std::string name="T_" "floor", std::string tag=kElementWise)
Definition elemwise.h:58
Tensor trunc(const Tensor &x, std::string name="T_" "trunc", std::string tag=kElementWise)
Definition elemwise.h:61
Tensor isnan(const Tensor &x, std::string name="T_" "isnan", std::string tag=kElementWise)
Definition elemwise.h:74
Tensor fast_erf_float16(const Tensor &data, std::string name, std::string tag)
Fast_erf_float expression from Eigen for float16.
Definition elemwise.h:486
Tensor acos(const Tensor &x, std::string name="T_" "acos", std::string tag=kElementWise)
Definition elemwise.h:68
Tensor asinh(const Tensor &x, std::string name="T_" "asinh", std::string tag=kElementWise)
Definition elemwise.h:71
Tensor log(const Tensor &x, std::string name="T_" "log", std::string tag=kElementWise)
Definition elemwise.h:55
Tensor fast_tanh_float(const Tensor &in, std::string name, std::string tag)
Fast_tanh_float implementation from Eigen https://github.com/eigenteam/eigen-git-mirror/blob/master/E...
Definition elemwise.h:83
Tensor fast_tanh(const Tensor &x, std::string name="T_fast_tanh", std::string tag=kElementWise)
Creates an operation that returns hyperbolic tanh of a given tensor.
Definition elemwise.h:133
Tensor fast_erf(const Tensor &x, std::string name="T_fast_erf", std::string tag=kElementWise)
Fast erf implementation.
Definition elemwise.h:501
Tensor cos(const Tensor &x, std::string name="T_" "cos", std::string tag=kElementWise)
Definition elemwise.h:63
Tensor rsqrt(const Tensor &x, std::string name="tensor", std::string tag=kElementWise)
Creates an operation that returns rsqrt of a given tensor.
Definition elemwise.h:234
Tensor abs(const Tensor &x, std::string name="T_" "abs", std::string tag=kElementWise)
Definition elemwise.h:62
Tensor asin(const Tensor &x, std::string name="T_" "asin", std::string tag=kElementWise)
Definition elemwise.h:70
Tensor bitwise_not(const Tensor &x, std::string name="T_bitwise_not", std::string tag=kElementWise)
Creates an operation that returns the bitwise NOT of a given tensor.
Definition elemwise.h:196
Tensor atan(const Tensor &x, std::string name="T_" "atan", std::string tag=kElementWise)
Definition elemwise.h:72
Tensor atanh(const Tensor &x, std::string name="T_" "atanh", std::string tag=kElementWise)
Definition elemwise.h:73
Tensor log10(const Tensor &x, std::string name="T_" "log10", std::string tag=kElementWise)
Definition elemwise.h:57
Tensor sigmoid(const Tensor &x, std::string name="T_" "sigmoid", std::string tag=kElementWise)
Definition elemwise.h:53
Tensor identity(const Tensor &x, std::string name="T_identity", std::string tag=kElementWise)
Creates an operation that returns identity of a given tensor.
Definition elemwise.h:154
Tensor isfinite(const Tensor &x, std::string name="T_" "isfinite", std::string tag=kElementWise)
Definition elemwise.h:76
Tensor log2(const Tensor &x, std::string name="T_" "log2", std::string tag=kElementWise)
Definition elemwise.h:56
Tensor elemwise_sum(const ffi::Array< Tensor > &xs, std::string name="T_elemwise_sum", std::string tag=kElementWise)
Creates an operation that sum each element of a tensor.
Definition elemwise.h:340
Tensor cosh(const Tensor &x, std::string name="T_" "cosh", std::string tag=kElementWise)
Definition elemwise.h:64
Tensor acosh(const Tensor &x, std::string name="T_" "acosh", std::string tag=kElementWise)
Definition elemwise.h:69
Tensor full(const ffi::Array< PrimExpr > &shape, PrimType dtype, const PrimExpr fill_value, std::string name, std::string tag)
Creates an operation that fill a tensor with fill_value.
Definition elemwise.h:374
Tensor sin(const Tensor &x, std::string name="T_" "sin", std::string tag=kElementWise)
Definition elemwise.h:66
Tensor tanh(const Tensor &x, std::string name="T_" "tanh", std::string tag=kElementWise)
Definition elemwise.h:75
Tensor full_like(const Tensor &x, const PrimExpr fill_value, std::string name="T_full_like", std::string tag=kElementWise)
Creates an operation that construct a tensor with same shape as input tensor, then fill a tensor with...
Definition elemwise.h:394
Tensor erf(const Tensor &x, std::string name="T_" "erf", std::string tag=kElementWise)
Definition elemwise.h:52
Tensor fast_exp(const Tensor &x, std::string name="T_fast_exp", std::string tag=kElementWise)
Fast exponential function implementation.
Definition elemwise.h:463
Tensor sign(const Tensor &x, std::string name="T_sign", std::string tag=kElementWise)
Returns the sign of the tensor.
Definition elemwise.h:210
Tensor negative(const Tensor &x, std::string name="T_negative", std::string tag=kElementWise)
Creates an operation that returns the negation of a given tensor.
Definition elemwise.h:168
Tensor sinh(const Tensor &x, std::string name="T_" "sinh", std::string tag=kElementWise)
Definition elemwise.h:67
Tensor fast_exp_float32(const Tensor &_x, std::string name, std::string tag)
Fast exponential function implementation.
Definition elemwise.h:421
An object that builds and maintains block scope and StmtSref mapping for Dependence analysis.
Definition analyzer.h:40
PrimExpr cast(PrimType t, PrimExpr value, Span span=Span())
cast value to type.
PrimExpr reinterpret(PrimType t, PrimExpr value, Span span=Span())
perform reinterpret cast value to type.
Common operators defined for Expr.