TensorRT  8.2.0
nvinfer1::IPluginV2DynamicExt Class Referenceabstract

#include <NvInferRuntime.h>

Inheritance diagram for nvinfer1::IPluginV2DynamicExt:
nvinfer1::IPluginV2Ext nvinfer1::IPluginV2

Public Member Functions

IPluginV2DynamicExtclone () const noexcept override=0
 Clone the plugin object. This copies over internal plugin parameters as well and returns a new plugin object with these parameters. If the source plugin is pre-configured with configurePlugin(), the returned object should also be pre-configured. The returned object should allow attachToContext() with a new execution context. Cloned plugin objects can share the same per-engine immutable resource (e.g. weights) with the source object (e.g. via ref-counting) to avoid duplication.
 
virtual DimsExprs getOutputDimensions (int32_t outputIndex, const DimsExprs *inputs, int32_t nbInputs, IExprBuilder &exprBuilder) noexcept=0
 Get expressions for computing dimensions of an output tensor from dimensions of the input tensors. More...
 
virtual bool supportsFormatCombination (int32_t pos, const PluginTensorDesc *inOut, int32_t nbInputs, int32_t nbOutputs) noexcept=0
 Return true if plugin supports the format and datatype for the input/output indexed by pos. More...
 
virtual void configurePlugin (const DynamicPluginTensorDesc *in, int32_t nbInputs, const DynamicPluginTensorDesc *out, int32_t nbOutputs) noexcept=0
 Configure the plugin. More...
 
virtual size_t getWorkspaceSize (const PluginTensorDesc *inputs, int32_t nbInputs, const PluginTensorDesc *outputs, int32_t nbOutputs) const noexcept=0
 Find the workspace size required by the layer. More...
 
virtual int32_t enqueue (const PluginTensorDesc *inputDesc, const PluginTensorDesc *outputDesc, const void *const *inputs, void *const *outputs, void *workspace, cudaStream_t stream) noexcept=0
 Execute the layer. More...
 
- Public Member Functions inherited from nvinfer1::IPluginV2Ext
virtual nvinfer1::DataType getOutputDataType (int32_t index, nvinfer1::DataType const *inputTypes, int32_t nbInputs) const noexcept=0
 Return the DataType of the plugin output at the requested index. The default behavior should be to return the type of the first input, or DataType::kFLOAT if the layer has no inputs. The returned data type must have a format that is supported by the plugin. More...
 
virtual void attachToContext (cudnnContext *, cublasContext *, IGpuAllocator *) noexcept
 Attach the plugin object to an execution context and grant the plugin the access to some context resource. More...
 
virtual void detachFromContext () noexcept
 Detach the plugin object from its execution context. More...
 
- Public Member Functions inherited from nvinfer1::IPluginV2
virtual AsciiChar const * getPluginType () const noexcept=0
 Return the plugin type. Should match the plugin name returned by the corresponding plugin creator. More...
 
virtual AsciiChar const * getPluginVersion () const noexcept=0
 Return the plugin version. Should match the plugin version returned by the corresponding plugin creator. More...
 
virtual int32_t getNbOutputs () const noexcept=0
 Get the number of outputs from the layer. More...
 
virtual int32_t initialize () noexcept=0
 Initialize the layer for execution. This is called when the engine is created. More...
 
virtual void terminate () noexcept=0
 Release resources acquired during plugin layer initialization. This is called when the engine is destroyed. More...
 
virtual size_t getSerializationSize () const noexcept=0
 Find the size of the serialization buffer required. More...
 
virtual void serialize (void *buffer) const noexcept=0
 Serialize the layer. More...
 
virtual void destroy () noexcept=0
 Destroy the plugin object. This will be called when the network, builder or engine is destroyed.
 
virtual void setPluginNamespace (AsciiChar const *pluginNamespace) noexcept=0
 Set the namespace that this plugin object belongs to. Ideally, all plugin objects from the same plugin library should have the same namespace. More...
 
virtual AsciiChar const * getPluginNamespace () const noexcept=0
 Return the namespace of the plugin object.
 

Static Public Attributes

static constexpr int32_t kFORMAT_COMBINATION_LIMIT = 100
 

Protected Member Functions

int32_t getTensorRTVersion () const noexcept override
 Return the API version with which this plugin was built. The upper byte reserved by TensorRT and is used to differentiate this from IPluginV2. More...
 
- Protected Member Functions inherited from nvinfer1::IPluginV2Ext
int32_t getTensorRTVersion () const noexcept override
 Return the API version with which this plugin was built. The upper byte reserved by TensorRT and is used to differentiate this from IPluginV2. More...
 
void configureWithFormat (Dims const *, int32_t, Dims const *, int32_t, DataType, PluginFormat, int32_t) noexcept override
 Derived classes should not implement this. In a C++11 API it would be override final.
 

Detailed Description

Similar to IPluginV2Ext, but with support for dynamic shapes.

Clients should override the public methods, including the following inherited methods:

virtual int32_t getNbOutputs() const noexcept = 0;
virtual nvinfer1::DataType getOutputDataType(int32_t index, const nvinfer1::DataType* inputTypes, int32_t
nbInputs) const noexcept = 0; virtual size_t getSerializationSize() const noexcept = 0; virtual void
serialize(void* buffer) const noexcept = 0; virtual void destroy() noexcept = 0; virtual void
setPluginNamespace(const char* pluginNamespace) noexcept = 0; virtual const char* getPluginNamespace() const
noexcept = 0;

For getOutputDataType, the inputTypes will always be DataType::kFLOAT or DataType::kINT32, and the returned type is canonicalized to DataType::kFLOAT if it is DataType::kHALF or DataType:kINT8. Details about the floating-point precision are elicited later by method supportsFormatCombination.

Member Function Documentation

◆ configurePlugin()

virtual void nvinfer1::IPluginV2DynamicExt::configurePlugin ( const DynamicPluginTensorDesc in,
int32_t  nbInputs,
const DynamicPluginTensorDesc out,
int32_t  nbOutputs 
)
pure virtualnoexcept

Configure the plugin.

configurePlugin() can be called multiple times in both the build and execution phases. The build phase happens before initialize() is called and only occurs during creation of an engine by IBuilder. The execution phase happens after initialize() is called and occurs during both creation of an engine by IBuilder and execution of an engine by IExecutionContext.

Build phase: IPluginV2DynamicExt->configurePlugin is called when a plugin is being prepared for profiling but not for any specific input size. This provides an opportunity for the plugin to make algorithmic choices on the basis of input and output formats, along with the bound of possible dimensions. The min and max value of the DynamicPluginTensorDesc correspond to the kMIN and kMAX value of the current profile that the plugin is being profiled for, with the desc.dims field corresponding to the dimensions of plugin specified at network creation. Wildcard dimensions will exist during this phase in the desc.dims field.

Execution phase: IPluginV2DynamicExt->configurePlugin is called when a plugin is being prepared for executing the plugin for a specific dimensions. This provides an opportunity for the plugin to change algorithmic choices based on the explicit input dimensions stored in desc.dims field.

  • IBuilder will call this function once per profile, with desc.dims resolved to the values specified by the kOPT field of the current profile. Wildcard dimensions will not exist during this phase.
  • IExecutionContext will call this during the next subsequent instance enqueue[V2]() or execute[V2]() if:
    • The batch size is changed from previous call of execute()/enqueue() if hasImplicitBatchDimension() returns true.
    • The optimization profile is changed via setOptimizationProfile() or setOptimizationProfileAsync().
    • An input shape binding is changed via setInputShapeBinding().
    • An input execution binding is changed via setBindingDimensions().
      Warning
      The execution phase is timing critical during IExecutionContext but is not part of the timing loop when called from IBuilder. Performance bottlenecks of configurePlugin won't show up during engine building but will be visible during execution after calling functions that trigger layer resource updates.
      Parameters
      inThe input tensors attributes that are used for configuration.
      nbInputsNumber of input tensors.
      outThe output tensors attributes that are used for configuration.
      nbOutputsNumber of output tensors.

◆ enqueue()

virtual int32_t nvinfer1::IPluginV2DynamicExt::enqueue ( const PluginTensorDesc inputDesc,
const PluginTensorDesc outputDesc,
const void *const *  inputs,
void *const *  outputs,
void *  workspace,
cudaStream_t  stream 
)
pure virtualnoexcept

Execute the layer.

Parameters
inputDeschow to interpret the memory for the input tensors.
outputDeschow to interpret the memory for the output tensors.
inputsThe memory for the input tensors.
outputsThe memory for the output tensors.
workspaceWorkspace for execution.
streamThe stream in which to execute the kernels.
Returns
0 for success, else non-zero (which will cause engine termination).

◆ getOutputDimensions()

virtual DimsExprs nvinfer1::IPluginV2DynamicExt::getOutputDimensions ( int32_t  outputIndex,
const DimsExprs inputs,
int32_t  nbInputs,
IExprBuilder exprBuilder 
)
pure virtualnoexcept

Get expressions for computing dimensions of an output tensor from dimensions of the input tensors.

Parameters
outputIndexThe index of the output tensor
inputsExpressions for dimensions of the input tensors
nbInputsThe number of input tensors
exprBuilderObject for generating new expressions

This function is called by the implementations of IBuilder during analysis of the network.

Example #1: A plugin has a single output that transposes the last two dimensions of the plugin's single input. The body of the override of getOutputDimensions can be:

DimsExprs output(inputs[0]);
std::swap(output.d[output.nbDims-1], output.d[output.nbDims-2]);
return output;

Example #2: A plugin concatenates its two inputs along the first dimension. The body of the override of getOutputDimensions can be:

DimsExprs output(inputs[0]);
output.d[0] = exprBuilder.operation(DimensionOperation::kSUM, *inputs[0].d[0], *inputs[1].d[0]);
return output;

◆ getTensorRTVersion()

int32_t nvinfer1::IPluginV2DynamicExt::getTensorRTVersion ( ) const
inlineoverrideprotectedvirtualnoexcept

Return the API version with which this plugin was built. The upper byte reserved by TensorRT and is used to differentiate this from IPluginV2.

Do not override this method as it is used by the TensorRT library to maintain backwards-compatibility with plugins.

Reimplemented from nvinfer1::IPluginV2.

◆ getWorkspaceSize()

virtual size_t nvinfer1::IPluginV2DynamicExt::getWorkspaceSize ( const PluginTensorDesc inputs,
int32_t  nbInputs,
const PluginTensorDesc outputs,
int32_t  nbOutputs 
) const
pure virtualnoexcept

Find the workspace size required by the layer.

This function is called after the plugin is configured, and possibly during execution. The result should be a sufficient workspace size to deal with inputs and outputs of the given size or any smaller problem.

Returns
The workspace size.

◆ supportsFormatCombination()

virtual bool nvinfer1::IPluginV2DynamicExt::supportsFormatCombination ( int32_t  pos,
const PluginTensorDesc inOut,
int32_t  nbInputs,
int32_t  nbOutputs 
)
pure virtualnoexcept

Return true if plugin supports the format and datatype for the input/output indexed by pos.

For this method inputs are numbered 0..(nbInputs-1) and outputs are numbered nbInputs..(nbInputs+nbOutputs-1). Using this numbering, pos is an index into InOut, where 0 <= pos < nbInputs+nbOutputs-1.

TensorRT invokes this method to ask if the input/output indexed by pos supports the format/datatype specified by inOut[pos].format and inOut[pos].type. The override should return true if that format/datatype at inOut[pos] are supported by the plugin. If support is conditional on other input/output formats/datatypes, the plugin can make its result conditional on the formats/datatypes in inOut[0..pos-1], which will be set to values that the plugin supports. The override should not inspect inOut[pos+1..nbInputs+nbOutputs-1], which will have invalid values. In other words, the decision for pos must be based on inOut[0..pos] only.

Some examples:

  • A definition for a plugin that supports only FP16 NCHW:
      return inOut.format[pos] == TensorFormat::kLINEAR && inOut.type[pos] == DataType::kHALF;
    
  • A definition for a plugin that supports only FP16 NCHW for its two inputs, and FP32 NCHW for its single output:
      return inOut.format[pos] == TensorFormat::kLINEAR && (inOut.type[pos] == pos < 2 ?  DataType::kHALF :
      DataType::kFLOAT);
    
  • A definition for a "polymorphic" plugin with two inputs and one output that supports any format or type, but the inputs and output must have the same format and type:
      return pos == 0 || (inOut.format[pos] == inOut.format[0] && inOut.type[pos] == inOut.type[0]);
    

Warning: TensorRT will stop asking for formats once it finds kFORMAT_COMBINATION_LIMIT on combinations.

Member Data Documentation

◆ kFORMAT_COMBINATION_LIMIT

constexpr int32_t nvinfer1::IPluginV2DynamicExt::kFORMAT_COMBINATION_LIMIT = 100
staticconstexpr

Limit on number of format combinations accepted.


The documentation for this class was generated from the following file: