tensor_test.cc 8.2 KB
Newer Older
D
dzhwinter 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13
//  Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserve.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
F
fengjiayi 已提交
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
/*
  Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserve.
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at
  http://www.apache.org/licenses/LICENSE-2.0
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
*/

#include "paddle/framework/tensor.h"
#include <gtest/gtest.h>
29
#include <string>
F
fengjiayi 已提交
30

31 32 33
namespace framework = paddle::framework;
namespace platform = paddle::platform;

F
fengjiayi 已提交
34
TEST(Tensor, Dims) {
35
  framework::Tensor tt;
36
  tt.Resize({2, 3, 4});
37
  framework::DDim dims = tt.dims();
F
fengjiayi 已提交
38 39 40 41 42 43 44
  ASSERT_EQ(arity(dims), 3);
  for (int i = 0; i < 3; ++i) {
    EXPECT_EQ(i + 2, dims[i]);
  }
}

TEST(Tensor, DataAssert) {
45
  framework::Tensor src_tensor;
F
fengjiayi 已提交
46

47 48
  bool caught = false;
  try {
F
fengjiayi 已提交
49
    src_tensor.data<double>();
50
  } catch (platform::EnforceNotMet err) {
51
    caught = true;
F
fengjiayi 已提交
52
    std::string msg =
Z
zchen0211 已提交
53
        "holder_ should not be null\nTensor holds no memory. Call "
Y
Yan Chunwei 已提交
54
        "Tensor::mutable_data first.";
55 56 57 58 59 60
    const char* what = err.what();
    for (size_t i = 0; i < msg.length(); ++i) {
      ASSERT_EQ(what[i], msg[i]);
    }
  }
  ASSERT_TRUE(caught);
F
fengjiayi 已提交
61 62
}

F
fengjiayi 已提交
63
/* following tests are not available at present
F
fengjiayi 已提交
64
   because Memory::Alloc() and Memory::Free() have not been ready.
F
fengjiayi 已提交
65
*/
F
fengjiayi 已提交
66
TEST(Tensor, MutableData) {
67
  {
68
    framework::Tensor src_tensor;
69 70 71
    float* p1 = nullptr;
    float* p2 = nullptr;
    // initialization
72 73
    p1 = src_tensor.mutable_data<float>(framework::make_ddim({1, 2, 3}),
                                        platform::CPUPlace());
74
    EXPECT_NE(p1, nullptr);
F
fengjiayi 已提交
75
    // set src_tensor a new dim with large size
76
    // momery is supposed to be re-allocated
77 78
    p2 = src_tensor.mutable_data<float>(framework::make_ddim({3, 4}),
                                        platform::CPUPlace());
79 80
    EXPECT_NE(p2, nullptr);
    EXPECT_NE(p1, p2);
F
fengjiayi 已提交
81
    // set src_tensor a new dim with same size
82
    // momery block is supposed to be unchanged
83 84
    p1 = src_tensor.mutable_data<float>(framework::make_ddim({2, 2, 3}),
                                        platform::CPUPlace());
85
    EXPECT_EQ(p1, p2);
F
fengjiayi 已提交
86
    // set src_tensor a new dim with smaller size
87
    // momery block is supposed to be unchanged
88 89
    p2 = src_tensor.mutable_data<float>(framework::make_ddim({2, 2}),
                                        platform::CPUPlace());
90 91
    EXPECT_EQ(p1, p2);
  }
L
liaogang 已提交
92

93
#ifdef PADDLE_WITH_CUDA
94
  {
95
    framework::Tensor src_tensor;
96 97 98
    float* p1 = nullptr;
    float* p2 = nullptr;
    // initialization
99 100
    p1 = src_tensor.mutable_data<float>(framework::make_ddim({1, 2, 3}),
                                        platform::CUDAPlace());
101 102 103
    EXPECT_NE(p1, nullptr);
    // set src_tensor a new dim with large size
    // momery is supposed to be re-allocated
104 105
    p2 = src_tensor.mutable_data<float>(framework::make_ddim({3, 4}),
                                        platform::CUDAPlace());
106 107 108 109
    EXPECT_NE(p2, nullptr);
    EXPECT_NE(p1, p2);
    // set src_tensor a new dim with same size
    // momery block is supposed to be unchanged
110 111
    p1 = src_tensor.mutable_data<float>(framework::make_ddim({2, 2, 3}),
                                        platform::CUDAPlace());
112 113 114
    EXPECT_EQ(p1, p2);
    // set src_tensor a new dim with smaller size
    // momery block is supposed to be unchanged
115 116
    p2 = src_tensor.mutable_data<float>(framework::make_ddim({2, 2}),
                                        platform::CUDAPlace());
117 118 119
    EXPECT_EQ(p1, p2);
  }
#endif
F
fengjiayi 已提交
120
}
F
fengjiayi 已提交
121

F
fengjiayi 已提交
122
TEST(Tensor, ShareDataWith) {
F
fengjiayi 已提交
123
  {
124 125
    framework::Tensor src_tensor;
    framework::Tensor dst_tensor;
F
fengjiayi 已提交
126 127 128
    // Try to share data form uninitialized tensor
    bool caught = false;
    try {
129
      dst_tensor.ShareDataWith(src_tensor);
Y
Yu Yang 已提交
130
    } catch (paddle::platform::EnforceNotMet err) {
F
fengjiayi 已提交
131
      caught = true;
F
fengjiayi 已提交
132
      std::string msg =
Z
zchen0211 已提交
133
          "holder_ should not be null\nTensor holds no memory. Call "
Y
Yan Chunwei 已提交
134
          "Tensor::mutable_data first.";
F
fengjiayi 已提交
135 136 137
      const char* what = err.what();
      for (size_t i = 0; i < msg.length(); ++i) {
        ASSERT_EQ(what[i], msg[i]);
F
fengjiayi 已提交
138 139 140 141
      }
    }
    ASSERT_TRUE(caught);

142 143
    src_tensor.mutable_data<int>(framework::make_ddim({2, 3, 4}),
                                 platform::CPUPlace());
144
    dst_tensor.ShareDataWith(src_tensor);
F
fengjiayi 已提交
145 146 147
    ASSERT_EQ(src_tensor.data<int>(), dst_tensor.data<int>());
  }

148
#ifdef PADDLE_WITH_CUDA
149
  {
150 151 152 153
    framework::Tensor src_tensor;
    framework::Tensor dst_tensor;
    src_tensor.mutable_data<int>(framework::make_ddim({2, 3, 4}),
                                 platform::CUDAPlace());
154
    dst_tensor.ShareDataWith(src_tensor);
155 156 157
    ASSERT_EQ(src_tensor.data<int>(), dst_tensor.data<int>());
  }
#endif
F
fengjiayi 已提交
158 159 160 161
}

TEST(Tensor, Slice) {
  {
162 163 164 165 166
    framework::Tensor src_tensor;
    src_tensor.mutable_data<int>(framework::make_ddim({5, 3, 4}),
                                 platform::CPUPlace());
    framework::Tensor slice_tensor = src_tensor.Slice(1, 3);
    framework::DDim slice_dims = slice_tensor.dims();
F
fengjiayi 已提交
167 168 169 170 171 172 173 174
    ASSERT_EQ(arity(slice_dims), 3);
    EXPECT_EQ(slice_dims[0], 2);
    EXPECT_EQ(slice_dims[1], 3);
    EXPECT_EQ(slice_dims[2], 4);

    uintptr_t src_data_address =
        reinterpret_cast<uintptr_t>(src_tensor.data<int>());
    uintptr_t src_mutable_data_address = reinterpret_cast<uintptr_t>(
175
        src_tensor.mutable_data<int>(src_tensor.dims(), platform::CPUPlace()));
F
fengjiayi 已提交
176 177
    uintptr_t slice_data_address =
        reinterpret_cast<uintptr_t>(slice_tensor.data<int>());
178 179 180
    uintptr_t slice_mutable_data_address =
        reinterpret_cast<uintptr_t>(slice_tensor.mutable_data<int>(
            slice_tensor.dims(), platform::CPUPlace()));
F
fengjiayi 已提交
181 182 183 184 185
    EXPECT_EQ(src_data_address, src_mutable_data_address);
    EXPECT_EQ(slice_data_address, slice_mutable_data_address);
    EXPECT_EQ(src_data_address + 3 * 4 * 1 * sizeof(int), slice_data_address);
  }

186
#ifdef PADDLE_WITH_CUDA
187
  {
188 189 190 191 192
    framework::Tensor src_tensor;
    src_tensor.mutable_data<double>(framework::make_ddim({6, 9}),
                                    platform::CUDAPlace());
    framework::Tensor slice_tensor = src_tensor.Slice(2, 6);
    framework::DDim slice_dims = slice_tensor.dims();
193 194 195
    ASSERT_EQ(arity(slice_dims), 2);
    EXPECT_EQ(slice_dims[0], 4);
    EXPECT_EQ(slice_dims[1], 9);
F
fengjiayi 已提交
196

197 198
    uintptr_t src_data_address =
        reinterpret_cast<uintptr_t>(src_tensor.data<double>());
199 200 201
    uintptr_t src_mutable_data_address =
        reinterpret_cast<uintptr_t>(src_tensor.mutable_data<double>(
            src_tensor.dims(), platform::CUDAPlace()));
202 203
    uintptr_t slice_data_address =
        reinterpret_cast<uintptr_t>(slice_tensor.data<double>());
204 205 206
    uintptr_t slice_mutable_data_address =
        reinterpret_cast<uintptr_t>(slice_tensor.mutable_data<double>(
            slice_tensor.dims(), platform::CUDAPlace()));
207 208 209 210 211
    EXPECT_EQ(src_data_address, src_mutable_data_address);
    EXPECT_EQ(slice_data_address, slice_mutable_data_address);
    EXPECT_EQ(src_data_address + 9 * 2 * sizeof(double), slice_data_address);
  }
#endif
F
fengjiayi 已提交
212 213
}

F
fengjiayi 已提交
214
TEST(Tensor, ReshapeToMatrix) {
215 216
  framework::Tensor src;
  int* src_ptr = src.mutable_data<int>({2, 3, 4, 9}, platform::CPUPlace());
F
WIP  
fengjiayi 已提交
217 218 219
  for (int i = 0; i < 2 * 3 * 4 * 9; ++i) {
    src_ptr[i] = i;
  }
220
  framework::Tensor res = framework::ReshapeToMatrix(src, 2);
F
WIP  
fengjiayi 已提交
221 222
  ASSERT_EQ(res.dims()[0], 2 * 3);
  ASSERT_EQ(res.dims()[1], 4 * 9);
Z
zchen0211 已提交
223
}
D
dzhwinter 已提交
224 225

TEST(Tensor, Layout) {
226 227 228 229
  framework::Tensor src;
  ASSERT_EQ(src.layout(), framework::DataLayout::kNHWC);
  src.set_layout(framework::DataLayout::kAnyLayout);
  ASSERT_EQ(src.layout(), framework::DataLayout::kAnyLayout);
D
dzhwinter 已提交
230
}