From 94b172a7e8a0abb93129ec6b85758779c8dc7596 Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Sun, 6 Aug 2017 18:08:17 +0800 Subject: [PATCH] fix mkldnn lib bug, and mkldnnbase --- CMakeLists.txt | 2 +- paddle/gserver/layers/MkldnnBase.h | 99 +++++++++++++++++++++++++++++ paddle/gserver/layers/MkldnnLayer.h | 1 + 3 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 paddle/gserver/layers/MkldnnBase.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b174831109..db9ff86baf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -144,7 +144,7 @@ if(WITH_GPU) endif(WITH_GPU) if(WITH_MKLDNN) - list(APPEND EXTERNAL_LIBS ${MKLDNN_LIBRARY} ${MKLDNN_IOMP_LIB}) + list(APPEND EXTERNAL_LIBS ${MKLDNN_LIB} ${MKLDNN_IOMP_LIB}) endif() if(USE_NNPACK) diff --git a/paddle/gserver/layers/MkldnnBase.h b/paddle/gserver/layers/MkldnnBase.h new file mode 100644 index 0000000000..eba72e58e5 --- /dev/null +++ b/paddle/gserver/layers/MkldnnBase.h @@ -0,0 +1,99 @@ +/* Copyright (c) 2017 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. */ + +#pragma once + +#include "mkldnn.hpp" + +namespace paddle { + +typedef enum { + DNN_BASE = 1, + DNN_TESTS = 1, + DNN_SIZES, + DNN_FMTS, + DNN_TESTS_DETAILS, + DNN_TESTS_MORE, + DNN_ALL, +} DNN_LOG_LEVEL; + +/** + * @brief MKLDNN CPU engine. + * + */ +class CpuEngine { +public: + static CpuEngine& Instance() { + // Thread-safe in C++11. + static CpuEngine myInstance; + return myInstance; + } + + // Disallow copy or move + CpuEngine(const CpuEngine&) = delete; // Copy constructor + CpuEngine(CpuEngine&&) = delete; // Move constructor + CpuEngine& operator=(const CpuEngine&) = delete; // Copy assignment + CpuEngine& operator=(CpuEngine&&) = delete; // Move assignment + + mkldnn::engine& getEngine() { return cpuEngine_; } + +protected: + CpuEngine() : cpuEngine_(mkldnn::engine::cpu, 0) {} + // CpuEngine() : cpuEngine_(mkldnn::engine::cpu_lazy, 0) {} + ~CpuEngine() {} + +private: + mkldnn::engine cpuEngine_; +}; + +/** + * @brief MKLDNN Stream. + * + */ +class MkldnnStream { +public: + MkldnnStream() : ready_(false) { resetState(); } + + virtual ~MkldnnStream() {} + + /** + * @brief Submit stream + * @param prims The primitives vector + * block Waiting for the stream to complete + */ + void submit(std::vector& prims, bool block = true) { + resetState(); + stream_->submit(prims).wait(block); + ready_ = false; + } + + /** + * @brief Reset the mkldnn stream + */ + void resetState() { + if (ready_) { + return; + } + // TODO(TJ): change me when mkldnn have method to reset this state + stream_.reset(new mkldnn::stream(mkldnn::stream::kind::eager)); + // stream_.reset(new mkldnn::stream(mkldnn::stream::kind::lazy)); + ready_ = true; + } + +private: + bool ready_; + std::shared_ptr stream_; +}; + +} // namespace paddle diff --git a/paddle/gserver/layers/MkldnnLayer.h b/paddle/gserver/layers/MkldnnLayer.h index 7e6d88b273..e69c9d6a1a 100644 --- a/paddle/gserver/layers/MkldnnLayer.h +++ b/paddle/gserver/layers/MkldnnLayer.h @@ -16,6 +16,7 @@ limitations under the License. */ #include #include "Layer.h" +#include "MkldnnBase.h" #include "mkldnn.hpp" namespace paddle { -- GitLab