// Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved. // // 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 // std::unique_ptr #include "lite/backends/xpu/xpu_header_sitter.h" // xpu_free #include "lite/core/target_wrapper.h" // TargetWrapper #include "lite/utils/cp_logging.h" // CHECK_EQ #include "lite/utils/macros.h" #define XPU_CALL(func) \ { \ auto e = (func); \ CHECK_EQ(e, 0) << "XPU: (" << #func << ") returns " << e; \ } namespace paddle { namespace lite { // MAX(lod.size()) = 64 const int XPU_MAX_LOD_SIZE = 64; // MAX(lod[i + 1] - lod[i]) = 512 const int XPU_MAX_LOD_SEQ_LEN = 512; using TargetWrapperXPU = TargetWrapper; struct XPUScratchPad { XPUScratchPad(void* addr, bool is_l3) : addr_(addr), is_l3_(is_l3) {} void* addr_{nullptr}; bool is_l3_{false}; }; struct XPUScratchPadDeleter { void operator()(XPUScratchPad* sp) const { if (!sp->is_l3_) { XPU_CALL(xpu_free(sp->addr_)); } delete sp; } }; using XPUScratchPadGuard = std::unique_ptr; template <> class TargetWrapper { public: static size_t num_devices() { return 1; } static size_t maximum_stream() { return 0; } static void* Malloc(size_t size); static void Free(void* ptr); static void MemcpySync(void* dst, const void* src, size_t size, IoDirection dir); static XPUScratchPadGuard MallocScratchPad(size_t size, bool use_l3 = false); static xdnn::Context* GetRawContext() { if (tls_raw_ctx_ == nullptr) { tls_raw_ctx_ = xdnn::create_context(); CHECK(tls_raw_ctx_); int r = xdnn::set_workspace_l3_size(tls_raw_ctx_, workspace_l3_size_per_thread); if (r != 0) { LOG(WARNING) << "xdnn::set_workspace_l3_size() failed, r = " << r << ", workspace_l3_size_per_thread = " << workspace_l3_size_per_thread; } } return tls_raw_ctx_; } // **DEPRECATED**, use xpu_set_device() at the very beginning of each worker // thread static void SetDev(int dev_no = 0) { const char* dev_env = getenv("LITE_XPU_DEV"); if (dev_env) { dev_no = atoi(dev_env); } XPU_CALL(xpu_set_device(dev_no)); } static std::string multi_encoder_precision; // NOLINT static int workspace_l3_size_per_thread; private: static LITE_THREAD_LOCAL xdnn::Context* tls_raw_ctx_; }; } // namespace lite } // namespace paddle