169 lines
6.1 KiB
C++
169 lines
6.1 KiB
C++
/*
|
|
* SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef TRT_PLUGIN_CUDNN_WRAPPER_H
|
|
#define TRT_PLUGIN_CUDNN_WRAPPER_H
|
|
|
|
#include "NvInferPlugin.h"
|
|
#include <functional>
|
|
#include <string>
|
|
|
|
extern "C"
|
|
{
|
|
//! Forward declaration of cudnnTensorStruct to use in other interfaces.
|
|
struct cudnnTensorStruct;
|
|
}
|
|
|
|
namespace nvinfer1
|
|
{
|
|
namespace pluginInternal
|
|
{
|
|
/*
|
|
* Copy of the CUDNN return codes
|
|
*/
|
|
enum CudnnStatus
|
|
{
|
|
CUDNN_STATUS_SUCCESS = 0,
|
|
CUDNN_STATUS_NOT_INITIALIZED = 1,
|
|
CUDNN_STATUS_ALLOC_FAILED = 2,
|
|
CUDNN_STATUS_BAD_PARAM = 3,
|
|
CUDNN_STATUS_INTERNAL_ERROR = 4,
|
|
CUDNN_STATUS_INVALID_VALUE = 5,
|
|
CUDNN_STATUS_ARCH_MISMATCH = 6,
|
|
CUDNN_STATUS_MAPPING_ERROR = 7,
|
|
CUDNN_STATUS_EXECUTION_FAILED = 8,
|
|
CUDNN_STATUS_NOT_SUPPORTED = 9,
|
|
CUDNN_STATUS_LICENSE_ERROR = 10,
|
|
CUDNN_STATUS_RUNTIME_PREREQUISITE_MISSING = 11,
|
|
CUDNN_STATUS_RUNTIME_IN_PROGRESS = 12,
|
|
CUDNN_STATUS_RUNTIME_FP_OVERFLOW = 13,
|
|
CUDNN_STATUS_VERSION_MISMATCH = 14,
|
|
};
|
|
|
|
/*
|
|
* Copy of the CUDNN cudnnBatchNormMode_t
|
|
*/
|
|
enum cudnnBatchNormMode
|
|
{
|
|
CUDNN_BATCHNORM_PER_ACTIVATION = 0,
|
|
CUDNN_BATCHNORM_SPATIAL = 1,
|
|
CUDNN_BATCHNORM_SPATIAL_PERSISTENT = 2,
|
|
};
|
|
|
|
/*
|
|
* Copy of the CUDNN cudnnTensorFormat_t
|
|
*/
|
|
enum cudnnTensorFormat
|
|
{
|
|
CUDNN_TENSOR_NCHW = 0,
|
|
CUDNN_TENSOR_NHWC = 1,
|
|
CUDNN_TENSOR_NCHW_VECT_C = 2,
|
|
};
|
|
|
|
/*
|
|
* Copy of CUDNN data type
|
|
*/
|
|
enum cudnnDataType
|
|
{
|
|
CUDNN_DATA_FLOAT = 0,
|
|
CUDNN_DATA_DOUBLE = 1,
|
|
CUDNN_DATA_HALF = 2,
|
|
CUDNN_DATA_INT8 = 3,
|
|
CUDNN_DATA_INT32 = 4,
|
|
CUDNN_DATA_INT8x4 = 5,
|
|
CUDNN_DATA_UINT8 = 6,
|
|
CUDNN_DATA_UINT8x4 = 7,
|
|
CUDNN_DATA_INT8x32 = 8,
|
|
CUDNN_DATA_BFLOAT16 = 9,
|
|
CUDNN_DATA_INT64 = 10,
|
|
CUDNN_DATA_BOOLEAN = 11,
|
|
CUDNN_DATA_FP8_E4M3 = 12,
|
|
CUDNN_DATA_FP8_E5M2 = 13,
|
|
CUDNN_DATA_FAST_FLOAT_FOR_FP8 = 14,
|
|
};
|
|
|
|
using cudnnStatus_t = CudnnStatus;
|
|
using cudnnBatchNormMode_t = cudnnBatchNormMode;
|
|
using cudnnTensorFormat_t = cudnnTensorFormat;
|
|
using cudnnDataType_t = cudnnDataType;
|
|
|
|
using cudnnHandle_t = struct cudnnContext*;
|
|
using cudnnTensorDescriptor_t = struct cudnnTensorStruct*;
|
|
|
|
class CudnnWrapper
|
|
{
|
|
public:
|
|
explicit CudnnWrapper(bool initHandle = false, char const* callerPluginName = nullptr);
|
|
~CudnnWrapper();
|
|
|
|
cudnnContext* getCudnnHandle();
|
|
bool isValid() const;
|
|
|
|
/*
|
|
* Copy of the CUDNN APIs
|
|
*/
|
|
cudnnStatus_t cudnnCreate(cudnnContext** handle);
|
|
cudnnStatus_t cudnnDestroy(cudnnContext* handle);
|
|
cudnnStatus_t cudnnCreateTensorDescriptor(cudnnTensorDescriptor_t* tensorDesc);
|
|
cudnnStatus_t cudnnDestroyTensorDescriptor(cudnnTensorDescriptor_t tensorDesc);
|
|
cudnnStatus_t cudnnSetStream(cudnnHandle_t handle, cudaStream_t streamId);
|
|
cudnnStatus_t cudnnBatchNormalizationForwardTraining(cudnnHandle_t handle, cudnnBatchNormMode_t mode,
|
|
void const* alpha, void const* beta, cudnnTensorStruct const* xDesc, void const* x,
|
|
cudnnTensorStruct const* yDesc, void* y, cudnnTensorStruct const* bnScaleBiasMeanVarDesc, void const* bnScale,
|
|
void const* bnBias, double exponentialAverageFactor, void* resultRunningMean, void* resultRunningVariance,
|
|
double epsilon, void* resultSaveMean, void* resultSaveInvVariance);
|
|
cudnnStatus_t cudnnSetTensor4dDescriptor(cudnnTensorDescriptor_t tensorDesc, cudnnTensorFormat_t format,
|
|
cudnnDataType_t dataType, int n, int c, int h, int w);
|
|
cudnnStatus_t cudnnSetTensorNdDescriptor(cudnnTensorDescriptor_t tensorDesc, cudnnDataType_t dataType, int nbDims,
|
|
int const dimA[], int const strideA[]);
|
|
cudnnStatus_t cudnnSetTensorNdDescriptorEx(cudnnTensorDescriptor_t tensorDesc, cudnnTensorFormat_t format,
|
|
cudnnDataType_t dataType, int nbDims, int const dimA[]);
|
|
cudnnStatus_t cudnnDeriveBNTensorDescriptor(
|
|
cudnnTensorDescriptor_t derivedBnDesc, cudnnTensorStruct const* xDesc, cudnnBatchNormMode_t mode);
|
|
char const* cudnnGetErrorString(cudnnStatus_t status);
|
|
|
|
private:
|
|
void* mLibrary{nullptr};
|
|
cudnnContext* mHandle{nullptr};
|
|
void* tryLoadingCudnn(char const*);
|
|
|
|
cudnnStatus_t (*_cudnnCreate)(cudnnContext**);
|
|
cudnnStatus_t (*_cudnnDestroy)(cudnnContext*);
|
|
cudnnStatus_t (*_cudnnCreateTensorDescriptor)(cudnnTensorDescriptor_t*);
|
|
cudnnStatus_t (*_cudnnDestroyTensorDescriptor)(cudnnTensorDescriptor_t);
|
|
cudnnStatus_t (*_cudnnSetStream)(cudnnHandle_t, cudaStream_t);
|
|
cudnnStatus_t (*_cudnnBatchNormalizationForwardTraining)(cudnnHandle_t, cudnnBatchNormMode_t, void const*,
|
|
void const*, cudnnTensorStruct const*, void const*, cudnnTensorStruct const*, void*, cudnnTensorStruct const*,
|
|
void const*, void const*, double, void*, void*, double, void*, void*);
|
|
cudnnStatus_t (*_cudnnSetTensor4dDescriptor)(
|
|
cudnnTensorDescriptor_t, cudnnTensorFormat_t, cudnnDataType_t, int, int, int, int);
|
|
cudnnStatus_t (*_cudnnSetTensorNdDescriptor)(cudnnTensorDescriptor_t tensorDesc, cudnnDataType_t dataType,
|
|
int nbDims, int const dimA[], int const strideA[]);
|
|
cudnnStatus_t (*_cudnnSetTensorNdDescriptorEx)(cudnnTensorDescriptor_t tensorDesc, cudnnTensorFormat_t format,
|
|
cudnnDataType_t dataType, int nbDims, int const dimA[]);
|
|
cudnnStatus_t (*_cudnnDeriveBNTensorDescriptor)(
|
|
cudnnTensorDescriptor_t, cudnnTensorStruct const*, cudnnBatchNormMode_t);
|
|
char const* (*_cudnnGetErrorString)(cudnnStatus_t status);
|
|
};
|
|
|
|
CudnnWrapper& getCudnnWrapper(char const* callerPluginName);
|
|
|
|
} // namespace pluginInternal
|
|
} // namespace nvinfer1
|
|
|
|
#endif // TRT_PLUGIN_CUDNN_WRAPPER_H
|