Factor out TensorBase that doesn't depend on native operators (#63612)
authorPeter Bell <peterbell10@live.co.uk>
Wed, 8 Sep 2021 20:25:42 +0000 (13:25 -0700)
committerFacebook GitHub Bot <facebook-github-bot@users.noreply.github.com>
Wed, 8 Sep 2021 20:28:54 +0000 (13:28 -0700)
commitd701357d921ef167d42c125e65b6f7da6be3ad0f
tree5646a413181d0ef3e82f9476a3a37afacdb3b298
parent92318a91162efe61834dc31cf8ac7ea63fd44795
Factor out TensorBase that doesn't depend on native operators (#63612)

Summary:
Pull Request resolved: https://github.com/pytorch/pytorch/pull/63612

This makes Tensor inherit from a new class TensorBase, that provides a subset of Tensor that doesn't
directly depend on native_functions.yaml. Code that only includes TensorBase.h with thus not need to
be rebuilt every time someone changes an operator signature.

Making `Tensor` inherit from this class means that `const TensorBase&` parameters will be callable
with an ordinary `Tensor`. I've also made `Tensor` constructible and assignable from `TensorBase` to
minimize friction in code mixing the two types.

To help enforce that `Tensor.h` and `Functions.h` aren't accidentally included, I've added an error
into `Operators.h` if `TORCH_ASSERT_NO_OPERATORS` is defined. We can either set this in the build
system for certain folders, or just define it at the top of any file.

I've also included an example of manually special-casing the commonly used `contiguous` operator.
The inline function's slow path defers to `TensorBase::__dispatch_contiguous` which is defined in
`Tensor.cpp`. I've made it so `OptionalTensorRef` is constructible from `TensorBase`, so I can
materialize a `Tensor` for use in dispatch without actually increasing its refcount.

Test Plan: Imported from OSS

Reviewed By: gchanan

Differential Revision: D30728580

Pulled By: ezyang

fbshipit-source-id: 2cbc8eee08043382ee6904ea8e743b1286921c03
27 files changed:
aten/src/ATen/core/NamedTensor.cpp
aten/src/ATen/core/NamedTensor.h
aten/src/ATen/core/QuantizerBase.h
aten/src/ATen/core/Tensor.cpp
aten/src/ATen/core/Tensor.h
aten/src/ATen/core/TensorBase.h [new file with mode: 0644]
aten/src/ATen/core/VariableHooksInterface.h
aten/src/ATen/quantized/Quantizer.cpp
aten/src/ATen/quantized/Quantizer.h
aten/src/ATen/templates/Operators.h
aten/src/ATen/templates/TensorBody.h
aten/src/ATen/templates/TensorMethods.cpp
c10/core/TensorImpl.cpp
c10/core/TensorImpl.h
caffe2/core/tensor.cc
test/cpp/api/modules.cpp
torch/csrc/api/include/torch/nn/functional/activation.h
torch/csrc/api/src/nn/modules/activation.cpp
torch/csrc/autograd/autograd_meta.cpp
torch/csrc/autograd/cpp_hook.cpp
torch/csrc/autograd/cpp_hook.h
torch/csrc/autograd/custom_function.cpp
torch/csrc/autograd/custom_function.h
torch/csrc/autograd/python_variable.cpp
torch/csrc/autograd/python_variable.h
torch/csrc/autograd/variable.cpp
torch/csrc/autograd/variable.h