未验证 提交 713c05dd 编写于 作者: Z Zeng Jinle 提交者: GitHub

refine tensor.mutable_data, test=develop (#19680)

上级 c78a4781
...@@ -51,6 +51,8 @@ void* Tensor::mutable_data(platform::Place place, proto::VarType::Type type, ...@@ -51,6 +51,8 @@ void* Tensor::mutable_data(platform::Place place, proto::VarType::Type type,
/* some versions of boost::variant don't have operator!= */ /* some versions of boost::variant don't have operator!= */
if (holder_ == nullptr || !(holder_->place() == place) || if (holder_ == nullptr || !(holder_->place() == place) ||
holder_->size() < size + offset_) { holder_->size() < size + offset_) {
// Reset holder first before re-allocate to save memory
holder_.reset();
holder_ = memory::AllocShared(place, size); holder_ = memory::AllocShared(place, size);
offset_ = 0; offset_ = 0;
} }
......
...@@ -57,23 +57,28 @@ TEST(Tensor, MutableData) { ...@@ -57,23 +57,28 @@ TEST(Tensor, MutableData) {
// initialization // initialization
p1 = src_tensor.mutable_data<float>(framework::make_ddim({1, 2, 3}), p1 = src_tensor.mutable_data<float>(framework::make_ddim({1, 2, 3}),
platform::CPUPlace()); platform::CPUPlace());
auto p1_holder = src_tensor.Holder();
EXPECT_NE(p1, nullptr); EXPECT_NE(p1, nullptr);
// set src_tensor a new dim with large size // set src_tensor a new dim with large size
// momery is supposed to be re-allocated // momery is supposed to be re-allocated
p2 = src_tensor.mutable_data<float>(framework::make_ddim({3, 4}), p2 = src_tensor.mutable_data<float>(framework::make_ddim({3, 4}),
platform::CPUPlace()); platform::CPUPlace());
EXPECT_NE(p2, nullptr); EXPECT_NE(p2, nullptr);
EXPECT_NE(p1, p2); auto p2_holder1 = src_tensor.Holder();
EXPECT_NE(p1_holder.get(), p2_holder1.get());
// set src_tensor a new dim with same size // set src_tensor a new dim with same size
// momery block is supposed to be unchanged // momery block is supposed to be unchanged
p1 = src_tensor.mutable_data<float>(framework::make_ddim({2, 2, 3}), p1 = src_tensor.mutable_data<float>(framework::make_ddim({2, 2, 3}),
platform::CPUPlace()); platform::CPUPlace());
EXPECT_EQ(p1, p2); auto p2_holder2 = src_tensor.Holder();
EXPECT_EQ(p2_holder1.get(), p2_holder2.get());
// set src_tensor a new dim with smaller size // set src_tensor a new dim with smaller size
// momery block is supposed to be unchanged // momery block is supposed to be unchanged
p2 = src_tensor.mutable_data<float>(framework::make_ddim({2, 2}), p2 = src_tensor.mutable_data<float>(framework::make_ddim({2, 2}),
platform::CPUPlace()); platform::CPUPlace());
auto p2_holder3 = src_tensor.Holder();
EXPECT_EQ(p1, p2); EXPECT_EQ(p1, p2);
EXPECT_EQ(p2_holder2.get(), p2_holder3.get());
float* p3 = nullptr; float* p3 = nullptr;
float* p4 = nullptr; float* p4 = nullptr;
...@@ -82,14 +87,18 @@ TEST(Tensor, MutableData) { ...@@ -82,14 +87,18 @@ TEST(Tensor, MutableData) {
auto* tmp = src_tensor.mutable_data<uint8_t>(framework::make_ddim({2, 2}), auto* tmp = src_tensor.mutable_data<uint8_t>(framework::make_ddim({2, 2}),
platform::CPUPlace()); platform::CPUPlace());
p3 = reinterpret_cast<float*>(tmp); p3 = reinterpret_cast<float*>(tmp);
auto p3_holder1 = src_tensor.Holder();
EXPECT_EQ(p1, p3); EXPECT_EQ(p1, p3);
EXPECT_EQ(p2_holder3.get(), p3_holder1.get());
// set src_tensor a different type but bigger size. // set src_tensor a different type but bigger size.
// memory block is supposed to be changed. // memory block is supposed to be changed.
auto* tmp2 = src_tensor.mutable_data<double>( auto* tmp2 = src_tensor.mutable_data<double>(
framework::make_ddim({2, 2, 3}), platform::CPUPlace()); framework::make_ddim({2, 2, 3}), platform::CPUPlace());
auto p3_holder2 = src_tensor.Holder();
p4 = reinterpret_cast<float*>(tmp2); p4 = reinterpret_cast<float*>(tmp2);
EXPECT_NE(p1, p4); EXPECT_NE(p1, p4);
EXPECT_NE(p3_holder1.get(), p3_holder2.get());
} }
// Not sure if it's desired, but currently, Tensor type can be changed. // Not sure if it's desired, but currently, Tensor type can be changed.
{ {
...@@ -113,13 +122,15 @@ TEST(Tensor, MutableData) { ...@@ -113,13 +122,15 @@ TEST(Tensor, MutableData) {
// initialization // initialization
p1 = src_tensor.mutable_data<float>(framework::make_ddim({1, 2, 3}), p1 = src_tensor.mutable_data<float>(framework::make_ddim({1, 2, 3}),
platform::CUDAPlace()); platform::CUDAPlace());
auto p1_holder = src_tensor.Holder();
EXPECT_NE(p1, nullptr); EXPECT_NE(p1, nullptr);
// set src_tensor a new dim with large size // set src_tensor a new dim with large size
// momery is supposed to be re-allocated // momery is supposed to be re-allocated
p2 = src_tensor.mutable_data<float>(framework::make_ddim({3, 1024}), p2 = src_tensor.mutable_data<float>(framework::make_ddim({3, 1024}),
platform::CUDAPlace()); platform::CUDAPlace());
auto p2_holder = src_tensor.Holder();
EXPECT_NE(p2, nullptr); EXPECT_NE(p2, nullptr);
EXPECT_NE(p1, p2); EXPECT_NE(p1_holder.get(), p2_holder.get());
// set src_tensor a new dim with same size // set src_tensor a new dim with same size
// momery block is supposed to be unchanged // momery block is supposed to be unchanged
p1 = src_tensor.mutable_data<float>(framework::make_ddim({2, 2, 3}), p1 = src_tensor.mutable_data<float>(framework::make_ddim({2, 2, 3}),
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册