class OperationExecutor : model::OperationVisitor
{
public:
-#define OP(InternalName) InternalName,
- enum class NodeName
- {
-#include "model/Operations.lst"
- };
-#undef OP
-
struct NodeNameHash
{
- size_t operator()(::neurun::exec::interp::OperationExecutor::NodeName value) const noexcept
+ size_t operator()(model::OpCode opcode) const noexcept
{
- using type = typename std::underlying_type<NodeName>::type;
- return std::hash<type>()(static_cast<type>(value));
+ using type = typename std::underlying_type<model::OpCode>::type;
+ return std::hash<type>()(static_cast<type>(opcode));
}
};
public:
OperationExecutor(ExecEnv *env) : _env{env}
{
- _kernels[NodeName::Add] = getAdd();
- _kernels[NodeName::Conv2D] = getConv2D();
- _kernels[NodeName::MaxPool2D] = getMaxPool2D();
- _kernels[NodeName::Concat] = getConcat();
- _kernels[NodeName::AvgPool2D] = getAvgPool2D();
- _kernels[NodeName::FullyConnected] = getFullyConnected();
- _kernels[NodeName::Softmax] = getSoftMax();
- _kernels[NodeName::Reshape] = getReshape();
- _kernels[NodeName::DepthwiseConv2D] = getDepthwiseConv();
+ _kernels[model::OpCode::Add] = getAdd();
+ _kernels[model::OpCode::Conv2D] = getConv2D();
+ _kernels[model::OpCode::MaxPool2D] = getMaxPool2D();
+ _kernels[model::OpCode::Concat] = getConcat();
+ _kernels[model::OpCode::AvgPool2D] = getAvgPool2D();
+ _kernels[model::OpCode::FullyConnected] = getFullyConnected();
+ _kernels[model::OpCode::Softmax] = getSoftMax();
+ _kernels[model::OpCode::Reshape] = getReshape();
+ _kernels[model::OpCode::DepthwiseConv2D] = getDepthwiseConv();
}
void execute(const model::OperationIndex &idx)
#define OP(InternalName) \
virtual void visit(const model::operation::InternalName &node) override \
{ \
- if (_kernels[NodeName::InternalName]->prepare != nullptr) \
+ if (_kernels[model::OpCode::InternalName]->prepare != nullptr) \
{ \
- _kernels[NodeName::InternalName]->prepare(_env, node); \
+ _kernels[model::OpCode::InternalName]->prepare(_env, node); \
} \
- _kernels[NodeName::InternalName]->invoke(_env, node); \
+ _kernels[model::OpCode::InternalName]->invoke(_env, node); \
}
#include "model/Operations.lst"
#undef OP
private:
ExecEnv *_env;
- std::unordered_map<NodeName, OpKernel *, NodeNameHash> _kernels;
+ std::unordered_map<model::OpCode, OpKernel *, NodeNameHash> _kernels;
};
void Interpreter::run()