19#include <NvInferVersion.h>
28#ifdef NV_TENSORRT_MAJOR
29#if NV_TENSORRT_MAJOR != 8
30class SoftmaxPlugin :
public nvinfer1::IPlugin {
32 SoftmaxPlugin(
const SoftmaxParameter ¶m, nvinfer1::Dims in_dims) {
33 input_dims_.nbDims = in_dims.nbDims;
34 for (
int i = 0; i < in_dims.nbDims; i++) {
35 input_dims_.d[i] = in_dims.d[i];
36 input_dims_.type[i] = in_dims.type[i];
38 axis_ = param.axis() - 1;
40 CHECK_LE(axis_ + 1, input_dims_.nbDims);
43 for (
int i = axis_ + 1; i < input_dims_.nbDims; i++) {
44 inner_num_ *= input_dims_.d[i];
47 for (
int i = 0; i < axis_; i++) {
48 outer_num_ *= input_dims_.d[i];
50 cudnnCreateTensorDescriptor(&input_desc_);
51 cudnnCreateTensorDescriptor(&output_desc_);
57 cudnnDestroyTensorDescriptor(input_desc_);
58 cudnnDestroyTensorDescriptor(output_desc_);
60 virtual int initialize() {
62 cublasCreate(&cublas_);
65 virtual void terminate() {
66 cublasDestroy(cublas_);
69 int getNbOutputs()
const override {
return 1; }
71 nvinfer1::Dims getOutputDimensions(
int index,
const nvinfer1::Dims *inputs,
72 int nbInputDims)
override {
73 nvinfer1::Dims out_dims = inputs[0];
77 void configure(
const nvinfer1::Dims *inputDims,
int nbInputs,
78 const nvinfer1::Dims *outputDims,
int nbOutputs,
79 int maxBatchSize)
override {
80 input_dims_ = inputDims[0];
83 size_t getWorkspaceSize(
int maxBatchSize)
const override {
return 0; }
85 int enqueue(
int batchSize,
const void *
const *inputs,
void **outputs,
86 void *workspace, cudaStream_t stream)
override;
88 size_t getSerializationSize()
override {
return 0; }
90 void serialize(
void *buffer)
override {
91 char *d =
reinterpret_cast<char *
>(buffer), *a = d;
92 size_t size = getSerializationSize();
93 CHECK_EQ(d, a + size);
98 cublasHandle_t cublas_;
99 nvinfer1::Dims input_dims_;
103 cudnnTensorDescriptor_t input_desc_;
104 cudnnTensorDescriptor_t output_desc_;
108class SoftmaxPlugin :
public nvinfer1::IPluginV2 {
110 SoftmaxPlugin(
const char *layer_name,
const void *serial_data,
111 size_t serial_length) {
112 const char *p =
reinterpret_cast<const char *
>(serial_data);
116 input_dims_.nbDims =
reinterpret_cast<const int *
>(p)[0];
118 for (
int i = 0; i < input_dims_.nbDims; ++i) {
119 input_dims_.d[i] =
reinterpret_cast<const int *
>(p)[0];
126 inner_num_ =
reinterpret_cast<const int *
>(p)[0];
129 outer_num_ =
reinterpret_cast<const int *
>(p)[0];
132 axis_ =
reinterpret_cast<const int *
>(p)[0];
135 CHECK_LE(axis_, input_dims_.nbDims);
138 CHECK_EQ(p,
reinterpret_cast<const char *
>(serial_data) + serial_length);
139 CHECK_EQ(getSerializationSize(), serial_length);
141 cudnnCreateTensorDescriptor(&input_desc_);
142 cudnnCreateTensorDescriptor(&output_desc_);
145 SoftmaxPlugin(
const SoftmaxParameter ¶m, nvinfer1::Dims in_dims) {
146 input_dims_.nbDims = in_dims.nbDims;
147 for (
int i = 0; i < in_dims.nbDims; i++) {
148 input_dims_.d[i] = in_dims.d[i];
151 axis_ = param.axis() - 1;
153 CHECK_LE(axis_ + 1, input_dims_.nbDims);
156 for (
int i = axis_ + 1; i < input_dims_.nbDims; i++) {
157 inner_num_ *= input_dims_.d[i];
160 for (
int i = 0; i < axis_; i++) {
161 outer_num_ *= input_dims_.d[i];
163 cudnnCreateTensorDescriptor(&input_desc_);
164 cudnnCreateTensorDescriptor(&output_desc_);
167 SoftmaxPlugin(
int axis, nvinfer1::Dims in_dims) {
168 input_dims_.nbDims = in_dims.nbDims;
169 for (
int i = 0; i < in_dims.nbDims; i++) {
170 input_dims_.d[i] = in_dims.d[i];
175 CHECK_LE(axis_ + 1, input_dims_.nbDims);
178 for (
int i = axis_ + 1; i < input_dims_.nbDims; i++) {
179 inner_num_ *= input_dims_.d[i];
182 for (
int i = 0; i < axis_; i++) {
183 outer_num_ *= input_dims_.d[i];
185 cudnnCreateTensorDescriptor(&input_desc_);
186 cudnnCreateTensorDescriptor(&output_desc_);
190 cudnnDestroyTensorDescriptor(input_desc_);
191 cudnnDestroyTensorDescriptor(output_desc_);
194 virtual int initialize() noexcept {
195 cudnnCreate(&cudnn_);
196 cublasCreate(&cublas_);
199 virtual void terminate() noexcept {
200 cublasDestroy(cublas_);
201 cudnnDestroy(cudnn_);
203 int getNbOutputs() const noexcept
override {
return 1; }
205 nvinfer1::Dims getOutputDimensions(
int index,
const nvinfer1::Dims *inputs,
206 int nbInputDims)
noexcept override {
207 nvinfer1::Dims out_dims = inputs[0];
211 void configureWithFormat(
const nvinfer1::Dims *inputDims,
int nbInputs,
212 const nvinfer1::Dims *outputDims,
int nbOutputs,
213 nvinfer1::DataType type,
214 nvinfer1::PluginFormat format,
215 int maxBatchSize)
noexcept override {
216 input_dims_ = inputDims[0];
218 size_t getWorkspaceSize(
int maxBatchSize)
const noexcept override {
222 int enqueue(
int batchSize,
const void *
const *inputs,
void *
const *outputs,
223 void *workspace, cudaStream_t stream)
noexcept override;
225 size_t getSerializationSize() const noexcept
override {
227 return sizeof(int) +
sizeof(
int) * 1 * input_dims_.nbDims +
228 sizeof(inner_num_) +
sizeof(outer_num_) +
sizeof(axis_);
231 void serialize(
void *buffer)
const noexcept override {
232 char *p =
reinterpret_cast<char *
>(buffer);
235 reinterpret_cast<int *
>(p)[0] = input_dims_.nbDims;
237 for (
int i = 0; i < input_dims_.nbDims; ++i) {
238 reinterpret_cast<int *
>(p)[0] = input_dims_.d[i];
244 reinterpret_cast<int *
>(p)[0] = inner_num_;
247 reinterpret_cast<int *
>(p)[0] = outer_num_;
250 reinterpret_cast<int *
>(p)[0] = axis_;
254 std::string Name()
const {
return "softmax_plugin"; }
256 const char *getPluginType() const noexcept
override {
257 return "softmax_plugin";
260 const char *getPluginVersion() const noexcept
override {
return "1"; }
262 void setPluginNamespace(
const char *s_name)
noexcept override {
266 const char *getPluginNamespace() const noexcept
override {
return "camera"; }
267 bool supportsFormat(nvinfer1::DataType type,
268 nvinfer1::PluginFormat format)
const noexcept override {
272 void destroy() noexcept
override {
delete this; }
274 nvinfer1::IPluginV2 *clone() const noexcept
override {
275 SoftmaxPlugin *p =
new SoftmaxPlugin();
276 cudnnCreate(&(p->cudnn_));
277 cublasCreate(&(p->cublas_));
279 p->inner_num_ = inner_num_;
280 p->outer_num_ = outer_num_;
281 (p->input_dims_).nbDims = input_dims_.nbDims;
282 for (
int i = 0; i < input_dims_.nbDims; i++) {
283 (p->input_dims_).d[i] = input_dims_.d[i];
285 cudnnCreateTensorDescriptor(&(p->input_desc_));
286 cudnnCreateTensorDescriptor(&(p->output_desc_));
290 nvinfer1::DataType getOutputDataType(int32_t index,
291 nvinfer1::DataType
const *inputTypes,
292 int32_t nbInputs)
const noexcept {
293 return nvinfer1::DataType::kFLOAT;
296 void configurePlugin(nvinfer1::Dims
const *inputDims, int32_t nbInputs,
297 nvinfer1::Dims
const *outputDims, int32_t nbOutputs,
298 nvinfer1::DataType
const *inputTypes,
299 nvinfer1::DataType
const *outputTypes,
300 bool const *inputIsBroadcast,
301 bool const *outputIsBroadcast,
302 nvinfer1::PluginFormat floatFormat,
303 int32_t maxBatchSize)
noexcept {}
306 const char *name_ =
"camera";
307 cudnnHandle_t cudnn_;
308 cublasHandle_t cublas_;
309 nvinfer1::Dims input_dims_;
313 cudnnTensorDescriptor_t input_desc_;
314 cudnnTensorDescriptor_t output_desc_;
317class SoftmaxPluginCreator :
public nvinfer1::IPluginCreator {
319 SoftmaxPluginCreator() {}
320 ~SoftmaxPluginCreator() {
323 nvinfer1::IPluginV2 *createPlugin(
325 const nvinfer1::PluginFieldCollection *fc)
noexcept override {
327 nvinfer1::Dims in_dims;
328 const nvinfer1::PluginField *fields = fc->fields;
329 for (
int i = 0; i < fc->nbFields; ++i) {
330 const char *attrName = fields[i].name;
331 if (!strcmp(attrName,
"axis")) {
333 axis = *(
static_cast<const int32_t *
>(fields[i].data));
334 }
else if (!strcmp(attrName,
"in_dims")) {
336 in_dims = *(
static_cast<const nvinfer1::Dims *
>(fields[i].data));
340 SoftmaxPlugin *obj =
new SoftmaxPlugin(axis, in_dims);
341 obj->setPluginNamespace(mNamespaces.c_str());
344 nvinfer1::IPluginV2 *deserializePlugin(
345 const char *name,
const void *serial_data,
346 size_t serial_length)
noexcept override {
347 return new SoftmaxPlugin(name, serial_data, serial_length);
349 const char *getPluginName() const noexcept
override {
350 return "softmax_plugincamera";
352 const char *getPluginVersion() const noexcept
override {
return "1"; }
353 const char *getPluginNamespace() const noexcept
override {
return "camera"; }
354 void setPluginNamespace(
const char *s_name)
noexcept override {
355 mNamespaces = s_name;
357 const nvinfer1::PluginFieldCollection *getFieldNames() noexcept
override {
362 std::string mNamespaces =
"camera";
364REGISTER_TENSORRT_PLUGIN(SoftmaxPluginCreator);