tensorrt
给tensorrt写插件的时候,报错:
interpolate.cpp:63:93: error: invalid new-expression of abstract class type ‘torch2trt::InterpolatePlugin’
因为还有父类的虚函数没有实现。
可以通过一个简单的类实现进行测试,所有的函数不需要实现,这样看有哪些虚函数。比如:
class InterpolatePlugin : public IPluginV2
{
public:
InterpolatePlugin(std::vector<int64_t> size, std::string mode, bool align_corners) {};
InterpolatePlugin(const char *data, size_t length){};
// create from serialized data
InterpolatePlugin(const std::string &data) { };
int getNbOutputs() const override {};
Dims getOutputDimensions(int index, const Dims* inputs, int nbInputDims) override{ };
int initialize() override{};
void terminate() override{};
size_t getWorkspaceSize(int maxBatchSize) const override{};
int enqueue(
int batchSize, const void* const* inputs, void** outputs, void* workspace, cudaStream_t stream) override{ };
size_t getSerializationSize() const override{};
void serialize(void* buffer) const override{};
void configureWithFormat(const Dims* inputDims, int nbInputs, const Dims* outputDims, int nbOutputs, DataType type,
PluginFormat format, int maxBatchSize) override{};
bool supportsFormat(DataType type, PluginFormat format) const override{};
const char* getPluginType() const override{};
const char* getPluginVersion() const override{};
void destroy() override{};
IPluginV2* clone() const override{};
void setPluginNamespace(const char* libNamespace) override{}
const char* getPluginNamespace() const override{}
private:
// float mNegSlope;
// int mBatchDim;
// configured by user
std::vector<int64_t> size;
std::string mode;
bool align_corners;
};
上面是IPluginV2
, 下面是IPluginV2DynamicExt
类的最简单,包含了所有虚函数。
class InterpolatePlugin : public IPluginV2DynamicExt
{
public:
InterpolatePlugin(std::vector<int64_t> size, std::string mode, bool align_corners) {};
InterpolatePlugin(const char *data, size_t length){};
// create from serialized data
InterpolatePlugin(const std::string &data) { };
// ~InterpolatePlugin() override = default;
// IPluginV2 methods
const char* getPluginType() const override{};
const char* getPluginVersion() const override{};
int getNbOutputs() const override{};
int initialize() override{};
void terminate() override{};
size_t getSerializationSize() const override{};
void serialize(void* buffer) const override{};
void destroy() override{};
void setPluginNamespace(const char* libNamespace) override{};
const char* getPluginNamespace() const override{};
// void setClipParam(bool clip){};
// IPluginV2Ext methods
nvinfer1::DataType getOutputDataType(int index, const nvinfer1::DataType* inputType, int nbInputs) const override{};
// IPluginV2DynamicExt methods
IPluginV2DynamicExt* clone() const override{
return new InterpolatePlugin(size, mode, align_corners);
};
DimsExprs getOutputDimensions(
int outputIndex, const DimsExprs* inputs, int nbInputs, IExprBuilder& exprBuilder) override{};
bool supportsFormatCombination(int pos, const PluginTensorDesc* inOut, int nbInputs, int nbOutputs) override{};
void configurePlugin(
const DynamicPluginTensorDesc* in, int nbInputs, const DynamicPluginTensorDesc* out, int nbOutputs) override{};
size_t getWorkspaceSize(
const PluginTensorDesc* inputs, int nbInputs, const PluginTensorDesc* outputs, int nbOutputs) const override{};
int enqueue(const PluginTensorDesc* inputDesc, const PluginTensorDesc* outputDesc, const void* const* inputs,
void* const* outputs, void* workspace, cudaStream_t stream) override{};
private:
std::vector<int64_t> size;
std::string mode;
bool align_corners;
};