/* * Copyright (C) 2018-2023 Intel Corporation * * SPDX-License-Identifier: MIT * */ #pragma once #include "shared/source/built_ins/built_in_ops_base.h" #include "shared/source/built_ins/sip_kernel_type.h" #include "shared/source/compiler_interface/compiler_options.h" #include "shared/source/helpers/debug_helpers.h" #include "shared/source/utilities/stackvec.h" #include #include #include #include #include #include namespace NEO { typedef std::vector BuiltinResourceT; class Device; class SipKernel; class MemoryManager; class OsContext; inline constexpr ConstStringRef mediaKernelsBuildOptionsList[] = { "-D cl_intel_device_side_advanced_vme_enable", "-D cl_intel_device_side_avc_vme_enable", "-D cl_intel_device_side_vme_enable", "-D cl_intel_media_block_io", CompilerOptions::fastRelaxedMath}; inline constexpr CompilerOptions::ConstConcatenation<> mediaKernelsBuildOptions{mediaKernelsBuildOptionsList}; struct BuiltinCode { enum class ECodeType { any = 0, // for requesting "any" code available - priorities as below binary = 1, // ISA - highest priority intermediate = 2, // SPIR/LLVM - medium prioroty source = 3, // OCL C - lowest priority count, invalid }; static const char *getExtension(BuiltinCode::ECodeType ct) { switch (ct) { default: return ""; case BuiltinCode::ECodeType::binary: return ".bin"; case BuiltinCode::ECodeType::intermediate: return ".bc"; case BuiltinCode::ECodeType::source: return ".cl"; } } BuiltinCode::ECodeType type; BuiltinResourceT resource; Device *targetDevice; }; BuiltinResourceT createBuiltinResource(const char *ptr, size_t size); BuiltinResourceT createBuiltinResource(const BuiltinResourceT &r); std::string createBuiltinResourceName(EBuiltInOps::Type builtin, const std::string &extension); StackVec getBuiltinResourceNames(EBuiltInOps::Type builtin, BuiltinCode::ECodeType type, const Device &device); const char *getBuiltinAsString(EBuiltInOps::Type builtin); const char *getAdditionalBuiltinAsString(EBuiltInOps::Type builtin); class Storage { public: Storage(const std::string &rootPath) : rootPath(rootPath) { } virtual ~Storage() = default; BuiltinResourceT load(const std::string &resourceName); protected: virtual BuiltinResourceT loadImpl(const std::string &fullResourceName) = 0; std::string rootPath; }; class FileStorage : public Storage { public: FileStorage(const std::string &rootPath = "") : Storage(rootPath) { } protected: BuiltinResourceT loadImpl(const std::string &fullResourceName) override; }; struct EmbeddedStorageRegistry { inline static bool exists = false; static EmbeddedStorageRegistry &getInstance() { static EmbeddedStorageRegistry gsr; return gsr; } void store(const std::string &name, BuiltinResourceT &&resource) { resources.emplace(name, BuiltinResourceT(std::move(resource))); } const BuiltinResourceT *get(const std::string &name) const; ~EmbeddedStorageRegistry() { exists = false; } protected: EmbeddedStorageRegistry() { exists = true; } using ResourcesContainer = std::unordered_map; ResourcesContainer resources; }; class EmbeddedStorage : public Storage { public: EmbeddedStorage(const std::string &rootPath) : Storage(rootPath) { } protected: BuiltinResourceT loadImpl(const std::string &fullResourceName) override; }; class BuiltinsLib { public: BuiltinsLib(); BuiltinCode getBuiltinCode(EBuiltInOps::Type builtin, BuiltinCode::ECodeType requestedCodeType, Device &device); protected: BuiltinResourceT getBuiltinResource(EBuiltInOps::Type builtin, BuiltinCode::ECodeType requestedCodeType, Device &device); using StoragesContainerT = std::vector>; StoragesContainerT allStorages; // sorted by priority allStorages[0] will be checked before allStorages[1], etc. std::mutex mutex; }; class BuiltIns { public: BuiltIns(); virtual ~BuiltIns(); MOCKABLE_VIRTUAL const SipKernel &getSipKernel(SipKernelType type, Device &device); MOCKABLE_VIRTUAL const SipKernel &getSipKernel(Device &device, OsContext *context); MOCKABLE_VIRTUAL void freeSipKernels(MemoryManager *memoryManager); BuiltinsLib &getBuiltinsLib() { DEBUG_BREAK_IF(!builtinsLib.get()); return *builtinsLib; } protected: // sip builtins std::pair, std::once_flag> sipKernels[static_cast(SipKernelType::count)]; std::unique_ptr builtinsLib; using ContextId = uint32_t; std::unordered_map, std::once_flag>> perContextSipKernels; }; template class BuiltInOp; } // namespace NEO