// Copyright © Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #pragma once #include #include #include #include #include #include namespace hipdnn_gpu_ref::detail { class CompiledKernel { public: CompiledKernel(const std::string& sourceName, const std::vector& compileDefines, const std::string& functionName); ~CompiledKernel(); CompiledKernel(const CompiledKernel&) = delete; CompiledKernel& operator=(const CompiledKernel&) = delete; CompiledKernel(CompiledKernel&&) = delete; CompiledKernel& operator=(CompiledKernel&&) = delete; hipFunction_t function() const { return _function; } private: hipModule_t _module = nullptr; hipFunction_t _function = nullptr; std::vector _binary; }; class GpuRefKernelCompiler { public: static GpuRefKernelCompiler& instance(); const CompiledKernel& getOrCompile(const std::string& sourceName, const std::vector& compileDefines, const std::string& functionName); GpuRefKernelCompiler(const GpuRefKernelCompiler&) = delete; GpuRefKernelCompiler& operator=(const GpuRefKernelCompiler&) = delete; private: GpuRefKernelCompiler() = default; std::mutex _mutex; std::unordered_map> _cache; }; } // namespace hipdnn_gpu_ref::detail