caffe2::Tensor::is_same() (#15407)
authorSebastian Messmer <messmer@fb.com>
Fri, 11 Jan 2019 00:06:29 +0000 (16:06 -0800)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Fri, 11 Jan 2019 00:22:25 +0000 (16:22 -0800)
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
caffe2/operators/experimental/c10/cpu/add_cpu.cc
caffe2/operators/experimental/c10/cpu/mul_cpu.cc
caffe2/operators/experimental/c10/cpu/stop_gradient_cpu.cc

index acd14b2..7e7b4d8 100644 (file)
@@ -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);
index 34d4a51..dc62e25 100644 (file)
@@ -26,9 +26,8 @@ void add_op_cpu_impl(
   std::vector<int> 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<int> 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);
index 568bf91..3d29546 100644 (file)
@@ -27,9 +27,8 @@ void mul_op_cpu_impl(
   std::vector<int> 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<int> 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);
index e4e4415..5c7c23d 100644 (file)
@@ -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);
   }
 }