/* * Copyright (C) 2022-2023 Intel Corporation * * SPDX-License-Identifier: MIT * */ #pragma once #include #include #include #include namespace NEO { struct KernelDescriptor; enum ExternalFunctionResolveError : uint32_t { RESOLVE_SUCCESS = 0, ERROR_EXTERNAL_FUNCTION_INFO_MISSING, ERROR_KERNEL_DESCRIPTOR_MISSING, ERROR_LOOP_DETECTED }; struct ExternalFunctionInfo { std::string functionName = ""; uint8_t barrierCount = 0U; uint16_t numGrfRequired = 0U; uint8_t simdSize = 0U; bool hasRTCalls = false; }; struct ExternalFunctionUsageKernel { std::string usedFuncName; std::string kernelName; }; struct ExternalFunctionUsageExtFunc { std::string usedFuncName; std::string callerFuncName; }; using ExternalFunctionInfosT = std::vector; using KernelDependenciesT = std::vector; using FunctionDependenciesT = std::vector; using KernelDescriptorMapT = std::unordered_map; using FuncNameToIdMapT = std::unordered_map; using DependenciesT = std::vector>; using CalledByT = std::vector>; class DependencyResolver { public: DependencyResolver(const std::vector> &graph) : graph(graph) {} std::vector resolveDependencies(); protected: void resolveDependency(size_t nodeId, const std::vector &edges); std::vector seen; std::vector resolved; const std::vector> &graph; }; uint32_t resolveExternalDependencies(const ExternalFunctionInfosT &externalFunctionInfos, const KernelDependenciesT &kernelDependencies, const FunctionDependenciesT &funcDependencies, const KernelDescriptorMapT &nameToKernelDescriptor); uint32_t getExtFuncDependencies(const FuncNameToIdMapT &funcNameToId, const FunctionDependenciesT &funcDependencies, size_t numExternalFuncs, DependenciesT &outDependencies, CalledByT &outCalledBy); uint32_t resolveExtFuncDependencies(const ExternalFunctionInfosT &externalFunctionInfos, const FuncNameToIdMapT &funcNameToId, const FunctionDependenciesT &funcDependencies); uint32_t resolveKernelDependencies(const ExternalFunctionInfosT &externalFunctionInfos, const FuncNameToIdMapT &funcNameToId, const KernelDependenciesT &kernelDependencies, const KernelDescriptorMapT &nameToKernelDescriptor); } // namespace NEO