Files
2026-07-13 13:33:03 +08:00

172 lines
6.1 KiB
C++

//
// Executor.hpp
// MNN
//
// Created by MNN on 2019/07/25.
// Copyright © 2018, Alibaba Group Holding Limited
//
#ifndef MNN_Executor_hpp
#define MNN_Executor_hpp
#include <MNN/ErrorCode.hpp>
#include <MNN/expr/Expr.hpp>
#include <MNN/Tensor.hpp>
#include <MNN/Interpreter.hpp>
#include <vector>
#include <mutex>
#include <set>
#include <MNN/MNNForwardType.h>
namespace MNN {
class Backend;
class Execution;
class Runtime;
struct Op;
namespace Express {
struct RuntimeAttr;
struct ExecutorAttr;
class MNN_PUBLIC Executor {
public:
class ComputeCache;
class RuntimeExecuteWrap;
struct DebugTools;
/**Internal Usage Begin*/
struct Requirement {
std::vector<bool> contentNeedContent;
std::vector<bool> shapeNeedContent;
};
~Executor();
Requirement getRequirement(Expr* expr) const;
ErrorCode computeInfo(Expr* expr);
void makeCache(const std::vector<EXPRP>& expr, bool forceCPU = false);
/**Internal Usage End*/
bool lazyEval = true;
enum LazyMode {
LAZY_FULL = 0,
// Don't compute content until user needed.
LAZY_CONTENT = 1 << 0,
// Expr can only compute once, it can reduce the create cost of expr
LAZY_COMPUTE_ONCE = 1 << 1,
};
uint32_t getLazyMode() const {
return mLazyMode;
}
void setLazyComputeMode(uint32_t mode);
void setGlobalExecutorConfig(MNNForwardType type, const BackendConfig& config, int numberThread);
int getCurrentRuntimeStatus(RuntimeStatus statusEnum);
// Get last GPU execution time in ms (measured by GPU timestamps).
// Returns -1.0f if profiling is not supported or not enabled.
float getLastGpuTimeMs() const;
enum GCFlag {
FULL,
PART
};
void gc(GCFlag flag = FULL);
static std::shared_ptr<Executor> getGlobalExecutor();
static std::shared_ptr<Executor> newExecutor(MNNForwardType type,
const BackendConfig& config,
int numberThread);
void resetProfile();
void dumpProfile();
struct SubGraph;
bool registerSubGraph(const std::string& submoduleName, VARPS outputs, VARPS inputs);
std::shared_ptr<SubGraph> findSubGraph(const std::string& submoduleName);
static RuntimeInfo getRuntime();
void setCallBack(TensorCallBackWithInfo&& before, TensorCallBackWithInfo&& after);
const DebugTools* getDebugTools() const {
return mDebug.get();
}
ExecutorAttr* getAttr() const;
class MNN_PUBLIC RuntimeManager {
public:
~RuntimeManager();
/**
* @param configs : schedule configs.
* @param cacheName : full path for cache file. Note: should choose location for reading and writing.
*/
static RuntimeManager* createRuntimeManager(const ScheduleConfig& config);
/**
* @param rtmgr : the rtmgr to destroy
*/
static void destroy(RuntimeManager* rtmgr);
/**
* Deceperate, the same as createRuntimeManager(configs[0])
* @param configs : schedule configs.
* @param cacheName : full path for cache file. Note: should choose location for reading and writing.
*/
static RuntimeManager* createRuntimeManager(std::vector<ScheduleConfig>& configs);
/**
* @brief set cache file. when file not exist -- create it, when file exist -- load it.
* When should use : When choose GPU backend or use AUTO backend.
* Calling Position: calling after createRuntimeManager.
*/
void setCache(std::string cacheName);
/**
* @brief set the path of external files or directory
* @param path -- The path of a file or directory on disk
* @param type -- Type of the external path (see "enum ExternalPathType" in Interpreter.hpp)
*/
void setExternalPath(std::string path, int type);
/**
* @brief set external file.
*/
void setExternalFile(std::string fileName);
/**
* @brief update cache file
* When should use : Together with setCache API. calling for first inference and when input shape is changed.
* Calling Position : calling after inference done.
*/
void updateCache();
std::vector<bool> isBackendSupport(const std::vector<MNNForwardType> type);
friend class Executor;
void setMode(Interpreter::SessionMode mode);
void setHint(Interpreter::HintMode mode, int value);
void setHint(Interpreter::HintMode mode, int* value, size_t size);
void setHintPtr(Interpreter::HintMode mode, void* value);
// Push this RTM's KVCACHE_INFO meta onto its Runtime; call before any
// path that creates or clones Backends (Backends capture pMeta at ctor).
void applyMetaToRuntime() const;
bool getInfo(Interpreter::SessionInfoCode code, void* ptr);
static bool getDeviceInfo(const std::string& deviceKey, const MNNForwardType type, std::string& deviceValue);
BackendConfig* getBnConfig();
const RuntimeAttr* getInside() const {
return mInside;
}
private:
std::mutex mLock;
RuntimeAttr* mInside;
friend class StaticModule;
RuntimeManager();
};
static bool getComputeInfo(EXPRP expr, Interpreter::SessionInfoCode code, void* ptr);
#ifndef MNN_REDUCE_SIZE
std::map<std::string, std::shared_ptr<SubGraph>>& subgraph() {
return mSubGraph;
};
#endif
private:
std::shared_ptr<Runtime> _getOrCreateRuntime(MNNForwardType type, const BackendConfig* config, int numberThread, bool reset = true);
Executor(std::shared_ptr<Runtime> backend, MNNForwardType type, int numberThread);
void _makeCache(const std::vector<EXPRP>& outputs, bool forceCPU);
RuntimeInfo mRuntimeInfo;
std::shared_ptr<DebugTools> mDebug;
#ifndef MNN_REDUCE_SIZE
std::map<std::string, std::shared_ptr<SubGraph>> mSubGraph;
#endif
uint32_t mLazyMode = 0;
std::shared_ptr<ExecutorAttr> mAttr;
std::mutex mMutex;
};
} // namespace Express
} // namespace MNN
#endif