/
usr
/
local
/
lib64
/
python3.6
/
site-packages
/
torch
/
include
/
torch
/
csrc
/
jit
/
tensorexpr
/
/usr/local/lib64/python3.6/site-packages/torch/include/torch/csrc/jit/tensorexpr
mkdir
upload
Name
Size
Mode
Actions
operators/
-
0755
rm
analysis.h
5888
0644
edit
dl
rm
block_codegen.h
4211
0644
edit
dl
rm
bounds_inference.h
2230
0644
edit
dl
rm
bounds_overlap.h
3329
0644
edit
dl
rm
codegen.h
6402
0644
edit
dl
rm
cpp_codegen.h
2278
0644
edit
dl
rm
cpp_intrinsics.h
719
0644
edit
dl
rm
cuda_codegen.h
7782
0644
edit
dl
rm
cuda_random.h
2642
0644
edit
dl
rm
dim_arg.h
884
0644
edit
dl
rm
eval.h
9639
0644
edit
dl
rm
exceptions.h
3253
0644
edit
dl
rm
expr.h
11588
0644
edit
dl
rm
external_functions.h
1274
0644
edit
dl
rm
external_functions_registry.h
2343
0644
edit
dl
rm
fwd_decls.h
2806
0644
edit
dl
rm
graph_opt.h
2553
0644
edit
dl
rm
half_support.h
5038
0644
edit
dl
rm
hash_provider.h
7930
0644
edit
dl
rm
intrinsic_symbols.h
420
0644
edit
dl
rm
ir.h
22622
0644
edit
dl
rm
ir_cloner.h
2069
0644
edit
dl
rm
ir_mutator.h
2010
0644
edit
dl
rm
ir_printer.h
3693
0644
edit
dl
rm
ir_simplifier.h
15090
0644
edit
dl
rm
ir_verifier.h
1240
0644
edit
dl
rm
ir_visitor.h
1825
0644
edit
dl
rm
kernel.h
9210
0644
edit
dl
rm
llvm_codegen.h
3180
0644
edit
dl
rm
llvm_jit.h
1965
0644
edit
dl
rm
loopnest.h
21599
0644
edit
dl
rm
mem_dependency_checker.h
13003
0644
edit
dl
rm
reduction.h
6742
0644
edit
dl
rm
registerizer.h
12498
0644
edit
dl
rm
stmt.h
21138
0644
edit
dl
rm
tensor.h
7640
0644
edit
dl
rm
tensorexpr_init.h
268
0644
edit
dl
rm
types.h
3880
0644
edit
dl
rm
unique_name_manager.h
940
0644
edit
dl
rm
var_substitutor.h
1753
0644
edit
dl
rm
Edit:
/usr/local/lib64/python3.6/site-packages/torch/include/torch/csrc/jit/tensorexpr/reduction.h
(6742B)
#pragma once #include <torch/csrc/jit/tensorexpr/dim_arg.h> #include <torch/csrc/jit/tensorexpr/expr.h> #include <torch/csrc/jit/tensorexpr/ir.h> #include <torch/csrc/jit/tensorexpr/ir_printer.h> #include <torch/csrc/jit/tensorexpr/types.h> #include <functional> #include <vector> namespace torch { namespace jit { namespace tensorexpr { using ParameterList = const std::vector<VarHandle>; using ReduceInteraction = std::function<ExprHandle(ExprHandle, ExprHandle)>; // A Reducer is a user interface describing a particular reduction // operation. It has three components: An initialization value, a way of // interacting each value with the accumulation, and a method for obtaining the // current value to be reduced. It is materialized into a ReduceOp when loop // variables are known. class TORCH_API Reducer { public: Reducer(ExprHandle init, ReduceInteraction& interaction) : init_(init.node()), interaction_(interaction) {} template <typename RI> Reducer(ExprHandle init, RI interaction) : init_(init.node()) { interaction_ = interaction; } virtual ~Reducer() = default; ExprPtr initializer() const { return init_; } ReduceOpPtr operator()( BufPtr result_buf, ExprHandle body, const std::vector<ExprPtr>& output, const std::vector<VarPtr>& inner) const; ReduceOpPtr operator()( BufPtr result_buf, ExprPtr body, const std::vector<ExprPtr>& output, const std::vector<VarPtr>& inner) const; // Polymorphic handling of Body functions with a variety of parameters. static ExprHandle getReduceBody( const std::function<ExprHandle(ParameterList&)>& func, const std::vector<VarHandle>& vars) { return func(vars); } static ExprHandle getReduceBody( const std::function<ExprHandle(const VarHandle&)>& func, const std::vector<VarHandle>& vars) { if (vars.size() != 1) { throw malformed_input("mismatch between reduce body and arg size (1)"); } return func(vars[0]); } static ExprHandle getReduceBody( const std::function<ExprHandle(const VarHandle&, const VarHandle&)>& func, const std::vector<VarHandle>& vars) { if (vars.size() != 2) { throw malformed_input("mismatch between reduce body and arg size (2)"); } return func(vars[0], vars[1]); } static ExprHandle getReduceBody( const std::function< ExprHandle(const VarHandle&, const VarHandle&, const VarHandle&)>& func, const std::vector<VarHandle>& vars) { if (vars.size() != 3) { throw malformed_input("mismatch between reduce body and arg size (3)"); } return func(vars[0], vars[1], vars[2]); } static ExprHandle getReduceBody( const std::function<ExprHandle( const VarHandle&, const VarHandle&, const VarHandle&, const VarHandle&)>& func, const std::vector<VarHandle>& vars) { if (vars.size() != 4) { throw malformed_input("mismatch between reduce body and arg size (4)"); } return func(vars[0], vars[1], vars[2], vars[3]); } // Completes the reduction operator by applying the interaction function to // the accumulation and the body expression. static ExprPtr complete( BufPtr accumulator, ReduceInteraction interaction, ExprHandle body, const std::vector<ExprPtr>& output_args, const std::vector<VarPtr>& reduce_args) { ExprHandle accum = ExprHandle(alloc<Load>(body.dtype(), accumulator, output_args)); auto e = interaction(accum, body); return e.node(); } private: ExprPtr init_; ReduceInteraction interaction_; }; // An expression representing a Reduction operation (e.g. Sum, Max) broken into // it's component parts: initialization, accumulation var, acquisition of value // to be reduced and interaction. // // This is intended to be expanded in the loopnest and not make it to codegen. class TORCH_API ReduceOp : public ExprNode<ReduceOp> { public: // NOLINTNEXTLINE(cppcoreguidelines-pro-type-member-init) ReduceOp( ExprPtr body, std::vector<VarPtr> reduce_args, const Reducer& reducer) : ExprNodeBase(body->dtype()), body_(body), reduce_args_(std::move(reduce_args)), reducer_(reducer) {} // return the body expression which obtains the value to be reduced. ExprPtr body() const { return body_; } // Returns the original Reducer factory that can create ReduceOps. const Reducer& reducer() const { return reducer_; } // returns variables associated with the axes of reduction. const std::vector<VarPtr>& reduce_args() const { return reduce_args_; } private: ExprPtr body_; std::vector<VarPtr> reduce_args_; const Reducer reducer_; }; class Sum : public Reducer { public: Sum() : Reducer(ExprHandle(0), [](ExprHandle a, ExprHandle b) { return a + b; }) {} }; inline ExprHandle maximumVal(ScalarType type) { switch (type) { #define MAX_BY_TYPE_CASE(Type, Name) \ case ScalarType::Name: \ return ExprHandle(std::numeric_limits<Type>::max()); AT_FORALL_SCALAR_TYPES_AND3(Bool, Half, BFloat16, MAX_BY_TYPE_CASE) #undef MAX_BY_TYPE_CASE default: throw unsupported_dtype(); } return ExprHandle(); } inline ExprHandle minimumVal(ScalarType type) { switch (type) { #define MAX_BY_TYPE_CASE(Type, Name) \ case ScalarType::Name: \ return ExprHandle(std::numeric_limits<Type>::min()); AT_FORALL_SCALAR_TYPES_AND3(Bool, Half, BFloat16, MAX_BY_TYPE_CASE) #undef MAX_BY_TYPE_CASE default: throw unsupported_dtype(); } } class Maximum : public Reducer { public: // TODO possible to remove this arg by deferring the init value until we // know the dtype of the body. Maximum(Dtype dtype) : Reducer( minimumVal(dtype.scalar_type()), [](ExprHandle a, ExprHandle b) { return Max::make(a, b, true); }) {} Maximum(ExprHandle initializer) : Reducer(initializer, [](ExprHandle a, ExprHandle b) { return Max::make(a, b, true); }) {} }; class Minimum : public Reducer { public: Minimum(Dtype dtype) : Reducer( maximumVal(dtype.scalar_type()), [](ExprHandle a, ExprHandle b) { return Min::make(a, b, true); }) {} Minimum(ExprHandle initializer) : Reducer(initializer, [](ExprHandle a, ExprHandle b) { return Min::make(a, b, true); }) {} }; class ReductionExpander : public IRMutator { public: StmtPtr expand(StmtPtr s) { return s->accept_mutator(this); } ExprPtr mutate(ReduceOpPtr v) override { return v->body(); } }; } // namespace tensorexpr } // namespace jit } // namespace torch
Save
cmd:
run