From da7468853ae322252270bbb58032668bd21b7457 Mon Sep 17 00:00:00 2001 From: Sebastian Messmer Date: Thu, 10 Jan 2019 16:06:29 -0800 Subject: [PATCH] caffe2::Tensor::is_same() (#15407) Summary: Pull Request resolved: https://github.com/pytorch/pytorch/pull/15407 Don't ask the tensor for its intrusive pointer if we just want to check if two tensors are the same. This mirrors ATen APIs. Reviewed By: dzhulgakov Differential Revision: D13520389 fbshipit-source-id: 681317f36f480ab60e532bb08a073f98f39770fd --- caffe2/core/tensor.h | 4 ++++ caffe2/operators/experimental/c10/cpu/add_cpu.cc | 9 ++++----- caffe2/operators/experimental/c10/cpu/mul_cpu.cc | 9 ++++----- caffe2/operators/experimental/c10/cpu/stop_gradient_cpu.cc | 2 +- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/caffe2/core/tensor.h b/caffe2/core/tensor.h index acd14b2..7e7b4d8 100644 --- a/caffe2/core/tensor.h +++ b/caffe2/core/tensor.h @@ -108,6 +108,10 @@ class CAFFE2_API Tensor final { return C10Tensor(std::move(impl_)); } + bool is_same(const Tensor& other) const noexcept { + return impl_ == other.impl_; + } + Tensor Clone() const { Tensor x(GetDevice()); x.CopyFrom(*this); diff --git a/caffe2/operators/experimental/c10/cpu/add_cpu.cc b/caffe2/operators/experimental/c10/cpu/add_cpu.cc index 34d4a51..dc62e25 100644 --- a/caffe2/operators/experimental/c10/cpu/add_cpu.cc +++ b/caffe2/operators/experimental/c10/cpu/add_cpu.cc @@ -26,9 +26,8 @@ void add_op_cpu_impl( std::vector B_dims; if (legacy_broadcast) { - CAFFE_ENFORCE_NE( - C.getIntrusivePtr(), - B.getIntrusivePtr(), + CAFFE_ENFORCE( + !B.is_same(C), "In-place is allowed only with the first tensor when " "legacy-broadcasting"); C.ResizeLike(A); @@ -50,9 +49,9 @@ void add_op_cpu_impl( const std::vector C_dims = caffe2::elementwise_ops_utils::ComputeBinaryBroadcastForwardDims( A_dims, B_dims); - if (C.getIntrusivePtr() == A.getIntrusivePtr()) { + if (A.is_same(C)) { CAFFE_ENFORCE_EQ(C_dims, A_dims); - } else if (C.getIntrusivePtr() == B.getIntrusivePtr()) { + } else if (B.is_same(C)) { CAFFE_ENFORCE_EQ(C_dims, B_dims); } else { C.Resize(C_dims); diff --git a/caffe2/operators/experimental/c10/cpu/mul_cpu.cc b/caffe2/operators/experimental/c10/cpu/mul_cpu.cc index 568bf91..3d29546 100644 --- a/caffe2/operators/experimental/c10/cpu/mul_cpu.cc +++ b/caffe2/operators/experimental/c10/cpu/mul_cpu.cc @@ -27,9 +27,8 @@ void mul_op_cpu_impl( std::vector B_dims; if (legacy_broadcast) { - CAFFE_ENFORCE_NE( - C.getIntrusivePtr(), - B.getIntrusivePtr(), + CAFFE_ENFORCE( + !B.is_same(C), "In-place is allowed only with the first tensor when " "legacy-broadcasting"); C.ResizeLike(A); @@ -51,9 +50,9 @@ void mul_op_cpu_impl( const std::vector C_dims = caffe2::elementwise_ops_utils::ComputeBinaryBroadcastForwardDims( A_dims, B_dims); - if (C.getIntrusivePtr() == A.getIntrusivePtr()) { + if (A.is_same(C)) { CAFFE_ENFORCE_EQ(C_dims, A_dims); - } else if (C.getIntrusivePtr() == B.getIntrusivePtr()) { + } else if (B.is_same(C)) { CAFFE_ENFORCE_EQ(C_dims, B_dims); } else { C.Resize(C_dims); diff --git a/caffe2/operators/experimental/c10/cpu/stop_gradient_cpu.cc b/caffe2/operators/experimental/c10/cpu/stop_gradient_cpu.cc index e4e4415..5c7c23d 100644 --- a/caffe2/operators/experimental/c10/cpu/stop_gradient_cpu.cc +++ b/caffe2/operators/experimental/c10/cpu/stop_gradient_cpu.cc @@ -14,7 +14,7 @@ void stop_gradient_op_cpu_impl( const C10Tensor& output_) { Tensor input(input_); Tensor output(output_); - if (output.getIntrusivePtr() != input.getIntrusivePtr()) { + if (!output.is_same(input)) { output.CopyFrom(input); } } -- 2.7.4