From e3c041d319b0effb32b240814c507a656dd6fb32 Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Tue, 29 May 2018 19:57:57 +0800 Subject: [PATCH 1/4] add auto_grown_mutex for selected rows --- paddle/fluid/framework/selected_rows.cc | 7 ++++--- paddle/fluid/framework/selected_rows.h | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/paddle/fluid/framework/selected_rows.cc b/paddle/fluid/framework/selected_rows.cc index 56cf6693ca..c9d2388aa4 100644 --- a/paddle/fluid/framework/selected_rows.cc +++ b/paddle/fluid/framework/selected_rows.cc @@ -18,8 +18,8 @@ namespace paddle { namespace framework { struct ReAllocateVisitor { - ReAllocateVisitor(framework::Tensor* tensor, const framework::DDim& dims) - : tensor_(tensor), dims_(dims) {} + ReAllocateVisitor(const framework::DDim& dims, framework::Tensor* tensor) + : dims_(dims), tensor_(tensor) {} template void operator()() const { @@ -153,6 +153,7 @@ bool SelectedRows::Set(int64_t key, const framework::Tensor& value) { } PADDLE_ENFORCE_EQ(value.dims()[0], static_cast(1), "The first dim of value should be 1."); + std::lock_guard lock(auto_grown_mutex_); auto index = Index(key); bool is_new_key = false; if (index == -1) { @@ -164,7 +165,7 @@ bool SelectedRows::Set(int64_t key, const framework::Tensor& value) { auto dims = value_->dims(); dims[0] = (dims[0] + 1) << 1; framework::VisitDataType(framework::ToDataType(value.type()), - ReAllocateVisitor(value_.get(), dims)); + ReAllocateVisitor(dims, value_.get())); } } diff --git a/paddle/fluid/framework/selected_rows.h b/paddle/fluid/framework/selected_rows.h index c27c927ee7..487c739087 100644 --- a/paddle/fluid/framework/selected_rows.h +++ b/paddle/fluid/framework/selected_rows.h @@ -125,6 +125,7 @@ class SelectedRows { Vector rows_; std::unique_ptr value_{nullptr}; int64_t height_; + std::mutex auto_grown_mutex_; }; /* From add9ed3388d0082fcf26615a0408536d6932cecf Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Tue, 29 May 2018 21:52:34 +0800 Subject: [PATCH 2/4] change order of member --- paddle/fluid/framework/selected_rows.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paddle/fluid/framework/selected_rows.cc b/paddle/fluid/framework/selected_rows.cc index c9d2388aa4..21fd05aff0 100644 --- a/paddle/fluid/framework/selected_rows.cc +++ b/paddle/fluid/framework/selected_rows.cc @@ -34,8 +34,8 @@ struct ReAllocateVisitor { tensor_->ShareDataWith(cpu_tensor); } - framework::Tensor* tensor_; framework::DDim dims_; + framework::Tensor* tensor_; }; struct TensorCopyVisitor { From 167312484b026d771dcd0066707e9d022e2cfddf Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Tue, 29 May 2018 23:53:10 +0800 Subject: [PATCH 3/4] use unique ptr to hold auto_grown_mutex_ for default copy and move constructor --- paddle/fluid/framework/selected_rows.cc | 2 +- paddle/fluid/framework/selected_rows.h | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/paddle/fluid/framework/selected_rows.cc b/paddle/fluid/framework/selected_rows.cc index 21fd05aff0..c05e7be1ff 100644 --- a/paddle/fluid/framework/selected_rows.cc +++ b/paddle/fluid/framework/selected_rows.cc @@ -153,7 +153,7 @@ bool SelectedRows::Set(int64_t key, const framework::Tensor& value) { } PADDLE_ENFORCE_EQ(value.dims()[0], static_cast(1), "The first dim of value should be 1."); - std::lock_guard lock(auto_grown_mutex_); + std::lock_guard lock(*auto_grown_mutex_.get()); auto index = Index(key); bool is_new_key = false; if (index == -1) { diff --git a/paddle/fluid/framework/selected_rows.h b/paddle/fluid/framework/selected_rows.h index 487c739087..24c8b64b03 100644 --- a/paddle/fluid/framework/selected_rows.h +++ b/paddle/fluid/framework/selected_rows.h @@ -15,6 +15,7 @@ limitations under the License. */ #pragma once #include +#include #include #include @@ -46,11 +47,13 @@ class SelectedRows { SelectedRows(const std::vector& rows, const int64_t& height) : rows_(rows), height_(height) { value_.reset(new Tensor()); + auto_grown_mutex_.reset(new std::mutex); } SelectedRows() { height_ = 0; value_.reset(new Tensor()); + auto_grown_mutex_.reset(new std::mutex); } platform::Place place() const { return value_->place(); } @@ -125,7 +128,7 @@ class SelectedRows { Vector rows_; std::unique_ptr value_{nullptr}; int64_t height_; - std::mutex auto_grown_mutex_; + std::unique_ptr auto_grown_mutex_{nullptr}; }; /* From fa2079b71a30a55cb2e6ff75cf528a35dd8876ae Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Wed, 30 May 2018 09:45:39 +0800 Subject: [PATCH 4/4] add mutex header --- paddle/fluid/framework/selected_rows.h | 1 + 1 file changed, 1 insertion(+) diff --git a/paddle/fluid/framework/selected_rows.h b/paddle/fluid/framework/selected_rows.h index 24c8b64b03..1990cb1434 100644 --- a/paddle/fluid/framework/selected_rows.h +++ b/paddle/fluid/framework/selected_rows.h @@ -16,6 +16,7 @@ limitations under the License. */ #include #include +#include // NOLINT #include #include