/* * Copyright (C) 2022 Intel Corporation * * SPDX-License-Identifier: MIT * */ #include "shared/source/utilities/arrayref.h" #include #include #include #pragma once namespace NEO { struct KernelDescriptor; enum ExternalFunctionResolveError : uint32_t { RESOLVE_SUCCESS = 0, ERROR_EXTERNAL_FUNCTION_INFO_MISSING, ERROR_KERNEL_DESCRIPTOR_MISSING, ERROR_LOOP_DETECKTED }; struct ExternalFunctionInfo { std::string functionName = ""; uint8_t barrierCount = 0U; uint16_t numGrfRequired = 0U; uint8_t simdSize = 0U; }; 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(); inline bool hasLoop() { return loopDeteckted; } protected: void resolveDependency(size_t nodeId, const std::vector &edges); std::vector seen; std::vector resolved; const std::vector> &graph; bool loopDeteckted = false; }; uint32_t resolveBarrierCount(ExternalFunctionInfosT externalFunctionInfos, KernelDependenciesT kernelDependencies, FunctionDependenciesT funcDependencies, KernelDescriptorMapT &nameToKernelDescriptor); uint32_t getExtFuncDependencies(FuncNameToIdMapT &funcNameToId, FunctionDependenciesT funcDependencies, size_t numExternalFuncs, DependenciesT &outDependencies, CalledByT &outCalledBy); uint32_t resolveExtFuncDependencies(ExternalFunctionInfosT externalFunctionInfos, FuncNameToIdMapT &funcNameToId, FunctionDependenciesT funcDependencies); uint32_t resolveKernelDependencies(ExternalFunctionInfosT externalFunctionInfos, FuncNameToIdMapT &funcNameToId, KernelDependenciesT kernelDependencies, KernelDescriptorMapT &nameToKernelDescriptor); } // namespace NEO