diff --git a/paddle/fluid/operators/elementwise/mkldnn/elementwise_add_mkldnn_op.cc b/paddle/fluid/operators/elementwise/mkldnn/elementwise_add_mkldnn_op.cc index 542b31790f42deec8b8d412ff70429acda0f8028..e93baa2dfa0249c20d8a07442d17141246176dc7 100644 --- a/paddle/fluid/operators/elementwise/mkldnn/elementwise_add_mkldnn_op.cc +++ b/paddle/fluid/operators/elementwise/mkldnn/elementwise_add_mkldnn_op.cc @@ -136,7 +136,7 @@ class EltwiseAddMKLDNNKernel : public framework::OpKernel { std::vector srcs_pd; std::vector scales = {1.0f, 1.0f}; - const std::string key = platform::MKLDNNHandler::GetHash( + const std::string key = platform::GetHash( src_x_tz, ctx.op().Output("Out") + std::to_string(x->format()) + std::to_string(y->format())); diff --git a/paddle/fluid/operators/mkldnn/concat_mkldnn_op.cc b/paddle/fluid/operators/mkldnn/concat_mkldnn_op.cc index 5c75afdc7465caabaef087e54e359a68c601bc1e..c9a8231f14eae1e0c0c2bee85a809b5a5a38124e 100644 --- a/paddle/fluid/operators/mkldnn/concat_mkldnn_op.cc +++ b/paddle/fluid/operators/mkldnn/concat_mkldnn_op.cc @@ -72,19 +72,17 @@ std::string CreateKey(const paddle::framework::ExecutionContext& ctx, std::string key; key.reserve(platform::MKLDNNHandler::MaxKeyLength); for (size_t i = 0; i < multi_input.size(); i++) { - platform::MKLDNNHandler::AppendKeyDims( + platform::AppendKeyDims( &key, paddle::framework::vectorize(multi_input[i]->dims())); } - platform::MKLDNNHandler::AppendKey(&key, std::to_string(concat_axis)); - platform::MKLDNNHandler::AppendKey(&key, ctx.op().Output("Out")); - platform::MKLDNNHandler::AppendKey(&key, std::to_string(dt)); - platform::MKLDNNHandler::AppendKey(&key, - std::to_string(multi_input[0]->format())); + platform::AppendKey(&key, std::to_string(concat_axis)); + platform::AppendKey(&key, ctx.op().Output("Out")); + platform::AppendKey(&key, std::to_string(dt)); + platform::AppendKey(&key, std::to_string(multi_input[0]->format())); if (platform::get_cur_mkldnn_session_id() == platform::kMKLDNNSessionID_Default) { - platform::MKLDNNHandler::AppendKey(&key, "-t:"); - platform::MKLDNNHandler::AppendKey( - &key, platform::MKLDNNHandler::ThreadIDasStr()); + platform::AppendKey(&key, "-t:"); + platform::AppendKey(&key, platform::ThreadIDasStr()); } return key; } diff --git a/paddle/fluid/operators/mkldnn/conv_mkldnn_op.cc b/paddle/fluid/operators/mkldnn/conv_mkldnn_op.cc index 2b426bcdd522978b7b033b04d4d21ffad5ee22c4..7989532fb3faf103c9c683675451b8239c472df0 100644 --- a/paddle/fluid/operators/mkldnn/conv_mkldnn_op.cc +++ b/paddle/fluid/operators/mkldnn/conv_mkldnn_op.cc @@ -417,7 +417,7 @@ class ConvMKLDNNOpKernel : public paddle::framework::OpKernel { // Get unique name for storing MKLDNN primitives std::string key; key.reserve(MaxKeyLength); - platform::ConvMKLDNNHandler::AppendKey( + platform::ConvMKLDNNHandler::CreateKey( &key, src_tz, weights_tz, strides, paddings, dilations, groups, src_dt, input->format(), fuse_activation, fuse_residual_conn, ctx.op().Input("Input") + ctx.op().Input("Filter")); @@ -439,7 +439,7 @@ class ConvMKLDNNOpKernel : public paddle::framework::OpKernel { std::string key_tid = ""; if (platform::get_cur_mkldnn_session_id() == platform::kMKLDNNSessionID_Default) { - key_tid = "-t:" + platform::MKLDNNHandler::ThreadIDasStr(); + key_tid = "-t:" + platform::ThreadIDasStr(); } auto prim_key = key + key_tid + "@conv_p"; diff --git a/paddle/fluid/operators/mkldnn/dequantize_mkldnn_op.cc b/paddle/fluid/operators/mkldnn/dequantize_mkldnn_op.cc index 575103e3d34c5d93fc3c8b0512f3d294ac21b71f..d1aee1a91546e53badd0555bf6ea1940b749c9eb 100644 --- a/paddle/fluid/operators/mkldnn/dequantize_mkldnn_op.cc +++ b/paddle/fluid/operators/mkldnn/dequantize_mkldnn_op.cc @@ -36,10 +36,10 @@ std::string CreateKey(const paddle::framework::ExecutionContext& ctx, const std::vector& src_tz, const float scale_data) { std::string key; key.reserve(platform::MKLDNNHandler::MaxKeyLength); - platform::MKLDNNHandler::AppendKey(&key, std::to_string(src_dt)); - platform::MKLDNNHandler::AppendKeyDims(&key, src_tz); - platform::MKLDNNHandler::AppendKey(&key, std::to_string(scale_data)); - platform::MKLDNNHandler::AppendKey(&key, ctx.op().Output("Output")); + platform::AppendKey(&key, std::to_string(src_dt)); + platform::AppendKeyDims(&key, src_tz); + platform::AppendKey(&key, std::to_string(scale_data)); + platform::AppendKey(&key, ctx.op().Output("Output")); return key; } diff --git a/paddle/fluid/operators/mkldnn/quantize_mkldnn_op.cc b/paddle/fluid/operators/mkldnn/quantize_mkldnn_op.cc index 6d1bf50befa67e4925fd329442594e923d8b8a84..b268b14bc8e2de6d7d0be48148f48a99809f8e36 100644 --- a/paddle/fluid/operators/mkldnn/quantize_mkldnn_op.cc +++ b/paddle/fluid/operators/mkldnn/quantize_mkldnn_op.cc @@ -35,10 +35,10 @@ std::string CreateKey(const paddle::framework::ExecutionContext& ctx, const bool is_negative) { std::string key; key.reserve(platform::MKLDNNHandler::MaxKeyLength); - platform::MKLDNNHandler::AppendKeyDims(&key, src_tz); - platform::MKLDNNHandler::AppendKey(&key, std::to_string(scale_data)); - platform::MKLDNNHandler::AppendKey(&key, std::to_string(is_negative)); - platform::MKLDNNHandler::AppendKey(&key, ctx.op().Output("Output")); + platform::AppendKeyDims(&key, src_tz); + platform::AppendKey(&key, std::to_string(scale_data)); + platform::AppendKey(&key, std::to_string(is_negative)); + platform::AppendKey(&key, ctx.op().Output("Output")); return key; } diff --git a/paddle/fluid/operators/mkldnn/softmax_mkldnn_op.cc b/paddle/fluid/operators/mkldnn/softmax_mkldnn_op.cc index 5e49a08a90848423d62ebfb12eb2ac663f201ccd..138edc4d92d85c28ddd8f5412be5f3a6cd2323f4 100644 --- a/paddle/fluid/operators/mkldnn/softmax_mkldnn_op.cc +++ b/paddle/fluid/operators/mkldnn/softmax_mkldnn_op.cc @@ -205,7 +205,7 @@ class SoftmaxMKLDNNKernel : public paddle::framework::OpKernel { memory::dims softmax_tz = {src_tz[0], src_tz[1]}; // Generate keys for storing/retriving primitives for this operator const std::string key = - platform::MKLDNNHandler::GetHash(softmax_tz, ctx.op().Output("Out")); + platform::GetHash(softmax_tz, ctx.op().Output("Out")); SoftmaxMKLDNNHandler handler(softmax_tz, MKLDNNMemoryFormat::nc, dev_ctx, mkldnn_engine, key); @@ -276,7 +276,7 @@ class SoftmaxMKLDNNGradKernel : public paddle::framework::OpKernel { // Currently only supports NC data format // retrieve eltwise primitive desc from device context const std::string key = - platform::MKLDNNHandler::GetHash(softmax_tz, ctx.op().Input("Out")); + platform::GetHash(softmax_tz, ctx.op().Input("Out")); const std::string key_softmax_pd = key + "@softmax_pd"; auto softmax_pd = diff --git a/paddle/fluid/platform/mkldnn_helper.h b/paddle/fluid/platform/mkldnn_helper.h index f127ef01d7bc7c4161d1a708a7819d6dee054684..9583dde623153b01f7fb4c1e4565fe00ae0ecc26 100644 --- a/paddle/fluid/platform/mkldnn_helper.h +++ b/paddle/fluid/platform/mkldnn_helper.h @@ -179,5 +179,33 @@ inline MKLDNNMemoryFormat StringToMKLDNNFormat(std::string* format) { } } +inline std::string ThreadIDasStr(void) { + return std::to_string( + std::hash()(std::this_thread::get_id())); +} + +inline std::string dims2str(const mkldnn::memory::dims& operand_dims) { + std::string dstr = ""; + for (size_t i = 0; i < operand_dims.size(); ++i) { + dstr += std::to_string(operand_dims[i]) + "-"; + } + return dstr; +} + +inline void AppendKey(std::string* key, const std::string& s) { + key->append(s); +} + +inline std::string GetHash(const mkldnn::memory::dims& operand_dims, + const std::string& suffix) { + return dims2str(operand_dims) + suffix; +} + +inline void AppendKeyDims(std::string* key, const mkldnn::memory::dims& dims) { + for (unsigned int i = 0; i < dims.size(); i++) { + AppendKey(key, std::to_string(dims[i])); + } +} + } // namespace platform } // namespace paddle diff --git a/paddle/fluid/platform/mkldnn_reuse.h b/paddle/fluid/platform/mkldnn_reuse.h index 633be7f326834e47d86414f350f9adc129978566..7da73adf13db0d83c3e2e6c83d86472eb4c45a35 100644 --- a/paddle/fluid/platform/mkldnn_reuse.h +++ b/paddle/fluid/platform/mkldnn_reuse.h @@ -38,7 +38,7 @@ class MKLDNNHandler { platform::kMKLDNNSessionID_Default) { key_ = key_common_; } else { - key_ = key_common_ + "-t:" + MKLDNNHandler::ThreadIDasStr(); + key_ = key_common_ + "-t:" + ThreadIDasStr(); } } @@ -47,35 +47,19 @@ class MKLDNNHandler { return this->AcquireMemory(md, ptr, "@user_src_mem_p"); } - std::shared_ptr AcquireSecondSrcMemory( - const mkldnn::memory::desc& md, void* ptr) { - return this->AcquireMemory(md, ptr, "@user_src2_mem_p"); - } - - std::shared_ptr AcquireWeightsMemory( - const mkldnn::memory::desc& md, void* ptr, - user_function custom_func = {}) { - return this->AcquireMemory(md, ptr, "@user_weights_mem_p", custom_func); - } - - std::shared_ptr AcquireBiasMemory( - const mkldnn::memory::desc& md, void* ptr) { - return this->AcquireMemory(md, ptr, "@user_bias_mem_p"); - } - std::shared_ptr AcquireDstMemory( const mkldnn::memory::desc& md, void* ptr) { return this->AcquireMemory(md, ptr, "@user_dst_mem_p"); } - std::shared_ptr AcquireDiffDstMemory( + std::shared_ptr AcquireDiffSrcMemory( const mkldnn::memory::desc& md, void* ptr) { - return this->AcquireMemory(md, ptr, "@user_diff_dst_mem_p"); + return this->AcquireMemory(md, ptr, "@user_diff_src_mem_p"); } - std::shared_ptr AcquireDiffSrcMemory( + std::shared_ptr AcquireDiffDstMemory( const mkldnn::memory::desc& md, void* ptr) { - return this->AcquireMemory(md, ptr, "@user_diff_src_mem_p"); + return this->AcquireMemory(md, ptr, "@user_diff_dst_mem_p"); } std::shared_ptr AcquireMemoryFromPrimitive( @@ -138,18 +122,6 @@ class MKLDNNHandler { return mem_p; } - std::shared_ptr AcquireMemory( - const mkldnn::memory::primitive_desc& mpd, const std::string& suffix) { - auto local_key = key_ + suffix; - auto mem_p = - std::static_pointer_cast(dev_ctx_.GetBlob(local_key)); - if (mem_p == nullptr) { - mem_p = std::make_shared(mpd); - dev_ctx_.SetBlob(local_key, mem_p); - } - return mem_p; - } - std::shared_ptr AcquireMemory( const std::shared_ptr& user_memory_p, const std::shared_ptr& target_memory_p, @@ -221,67 +193,6 @@ class MKLDNNHandler { return target_memory_p; } - static std::string ThreadIDasStr(void) { - return std::to_string( - std::hash()(std::this_thread::get_id())); - } - - static std::string GetHash(mkldnn::memory::dims& operand_dims, // NOLINT - const std::string& suffix) { - return dims2str(operand_dims) + suffix; - } - - static void AppendKey( - std::string* key, const mkldnn::memory::dims& input_dims, - const mkldnn::memory::dims& weights_dims, const std::vector& strides, - const std::vector& paddings, const std::vector& dilations, - const int& groups, const mkldnn::memory::data_type& srcdt, - const MKLDNNMemoryFormat& format, const std::string& fuse_activation, - const bool& residual, const std::string& suffix) { - AppendKeyDims(key, input_dims); - - AppendKeyDims(key, weights_dims); - - AppendKeyVec(key, strides); - - AppendKeyVec(key, paddings); - - AppendKeyVec(key, dilations); - - AppendKey(key, std::to_string(groups)); - AppendKey(key, std::to_string(srcdt)); - AppendKey(key, std::to_string(format)); - AppendKey(key, fuse_activation); - AppendKey(key, std::to_string(residual)); - AppendKey(key, suffix); - } - - static void AppendKeyDims(std::string* key, - const mkldnn::memory::dims& dims) { - for (unsigned int i = 0; i < dims.size(); i++) { - AppendKey(key, std::to_string(dims[i])); - } - } - - static void AppendKeyVec(std::string* key, const std::vector& dims) { - for (unsigned int i = 0; i < dims.size(); i++) { - AppendKey(key, std::to_string(dims[i])); - } - } - - static void AppendKey(std::string* key, const std::string& s) { - key->append(s); - } - - protected: - static std::string dims2str(const mkldnn::memory::dims& operand_dims) { - std::string dstr = ""; - for (size_t i = 0; i < operand_dims.size(); ++i) { - dstr += std::to_string(operand_dims[i]) + "-"; - } - return dstr; - } - protected: const MKLDNNDeviceContext& dev_ctx_; mkldnn::engine engine_; @@ -324,6 +235,11 @@ class SumMKLDNNHandler : public MKLDNNHandler { "@dst_mem_p"); } + std::shared_ptr AcquireSecondSrcMemory( + const mkldnn::memory::desc& md, void* ptr) { + return this->AcquireMemory(md, ptr, "@user_src2_mem_p"); + } + std::shared_ptr AcquireSum( std::shared_ptr dst_memory, std::vector* inputs) { @@ -458,12 +374,12 @@ class ActivationMKLDNNHandler : public MKLDNNHandler { const float beta, const std::string& suffix) { std::string key; key.reserve(platform::MKLDNNHandler::MaxKeyLength); - platform::MKLDNNHandler::AppendKeyDims(&key, input_dims); - platform::MKLDNNHandler::AppendKey(&key, std::to_string(algorithm)); - platform::MKLDNNHandler::AppendKey(&key, std::to_string(fmt)); - platform::MKLDNNHandler::AppendKey(&key, std::to_string(alpha)); - platform::MKLDNNHandler::AppendKey(&key, std::to_string(beta)); - platform::MKLDNNHandler::AppendKey(&key, suffix); + platform::AppendKeyDims(&key, input_dims); + platform::AppendKey(&key, std::to_string(algorithm)); + platform::AppendKey(&key, std::to_string(fmt)); + platform::AppendKey(&key, std::to_string(alpha)); + platform::AppendKey(&key, std::to_string(beta)); + platform::AppendKey(&key, suffix); return key; } @@ -609,13 +525,13 @@ class LRNMKLDNNHandler : public MKLDNNHandler { const std::string& suffix) { std::string key; key.reserve(platform::MKLDNNHandler::MaxKeyLength); - platform::MKLDNNHandler::AppendKeyDims(&key, input_dims); - platform::MKLDNNHandler::AppendKey(&key, std::to_string(n)); - platform::MKLDNNHandler::AppendKey(&key, std::to_string(alpha)); - platform::MKLDNNHandler::AppendKey(&key, std::to_string(beta)); - platform::MKLDNNHandler::AppendKey(&key, std::to_string(k)); - platform::MKLDNNHandler::AppendKey(&key, std::to_string(fmt)); - platform::MKLDNNHandler::AppendKey(&key, suffix); + platform::AppendKeyDims(&key, input_dims); + platform::AppendKey(&key, std::to_string(n)); + platform::AppendKey(&key, std::to_string(alpha)); + platform::AppendKey(&key, std::to_string(beta)); + platform::AppendKey(&key, std::to_string(k)); + platform::AppendKey(&key, std::to_string(fmt)); + platform::AppendKey(&key, suffix); return key; } @@ -803,14 +719,14 @@ class PoolingMKLDNNHandler : public MKLDNNHandler { const MKLDNNMemoryFormat& fmt, const std::string& suffix) { std::string key; key.reserve(platform::MKLDNNHandler::MaxKeyLength); - platform::MKLDNNHandler::AppendKeyDims(&key, input_dims); - platform::MKLDNNHandler::AppendKey(&key, pooling_type); - platform::MKLDNNHandler::AppendKeyVec(&key, ksize); - platform::MKLDNNHandler::AppendKeyVec(&key, strides); - platform::MKLDNNHandler::AppendKeyVec(&key, paddings); - platform::MKLDNNHandler::AppendKey(&key, std::to_string(dt)); - platform::MKLDNNHandler::AppendKey(&key, std::to_string(fmt)); - platform::MKLDNNHandler::AppendKey(&key, suffix); + platform::AppendKeyDims(&key, input_dims); + platform::AppendKey(&key, pooling_type); + platform::AppendKeyDims(&key, ksize); + platform::AppendKeyDims(&key, strides); + platform::AppendKeyDims(&key, paddings); + platform::AppendKey(&key, std::to_string(dt)); + platform::AppendKey(&key, std::to_string(fmt)); + platform::AppendKey(&key, suffix); return key; } @@ -1160,6 +1076,17 @@ class ConvMKLDNNTemplateHandler : public MKLDNNHandler { pipeline); } + std::shared_ptr AcquireWeightsMemory( + const mkldnn::memory::desc& md, void* ptr, + user_function custom_func = {}) { + return this->AcquireMemory(md, ptr, "@user_weights_mem_p", custom_func); + } + + std::shared_ptr AcquireBiasMemory( + const mkldnn::memory::desc& md, void* ptr) { + return this->AcquireMemory(md, ptr, "@user_bias_mem_p"); + } + std::shared_ptr AcquireWeightsMemoryFromPrimitive( const std::shared_ptr user_weights_memory_p, std::vector& pipeline, // NOLINT @@ -1368,6 +1295,31 @@ class ConvMKLDNNTemplateHandler : public MKLDNNHandler { suffix; } + static void CreateKey( + std::string* key, const mkldnn::memory::dims& input_dims, + const mkldnn::memory::dims& weights_dims, const std::vector& strides, + const std::vector& paddings, const std::vector& dilations, + const int& groups, const mkldnn::memory::data_type& srcdt, + const MKLDNNMemoryFormat& format, const std::string& fuse_activation, + const bool& residual, const std::string& suffix) { + AppendKeyDims(key, input_dims); + + AppendKeyDims(key, weights_dims); + + AppendKeyDims(key, strides); + + AppendKeyDims(key, paddings); + + AppendKeyDims(key, dilations); + + AppendKey(key, std::to_string(groups)); + AppendKey(key, std::to_string(srcdt)); + AppendKey(key, std::to_string(format)); + AppendKey(key, fuse_activation); + AppendKey(key, std::to_string(residual)); + AppendKey(key, suffix); + } + private: std::shared_ptr conv_pd_; std::shared_ptr