Files
nvidia--tensorrt/plugin/instanceNormalizationPlugin/instanceNormFwd.h
T
wehub-resource-sync c8a779b1bb
Docker Image CI / build-ubuntu2004 (push) Waiting to run
chore: import upstream snapshot with attribution
2026-07-13 13:36:55 +08:00

166 lines
6.3 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 INSTANCE_NORM_FWD_H
#define INSTANCE_NORM_FWD_H
#include <cstdint>
#include <cuda_fp16.h>
#include <cuda_runtime_api.h>
namespace instance_norm_impl
{
#define PLUGIN_CHECK_CUDA(call) \
do \
{ \
cudaError_t status = call; \
if (status != cudaSuccess) \
{ \
return status; \
} \
} while (0)
#define PLUGIN_CHECK_CUDNN(call) \
do \
{ \
cudnnStatus_t status = call; \
if (status != CUDNN_STATUS_SUCCESS) \
{ \
return status; \
} \
} while (0)
typedef float GMEM_SUMS_TYPE;
#define ACCUM_MEAN_VAR_IN_FLOAT 1
template <typename StorageType, int32_t SM>
constexpr int32_t getPixelsPerThreadInRegisters()
{
return (sizeof(StorageType) == 4 || sizeof(StorageType) == 2)
? 6 - sizeof(StorageType)
: (SM < 800 ? (SM == 750 ? 16 : 8) : (SM == 860 ? 16 : 24));
}
template <typename StorageType, int32_t SM>
constexpr int32_t getPixelsPerThreadInSmem()
{
return (sizeof(StorageType) == 4 || sizeof(StorageType) == 2)
? (sizeof(StorageType) == 4 ? 4 : 8)
: (SM < 800 ? (SM == 750 ? 7 : 8) : (SM == 860 ? 16 : 24));
}
template <typename Input_Data_Type_ = uint16_t, typename Output_Data_Type_ = uint16_t, typename StorageType_ = float,
int32_t THREADS_PER_CTA_ = 512, int32_t THREADS_PER_PIXEL_ = 16, int32_t C_ELEMENTS_PER_CTA_ = 64,
int32_t SM_ = 700>
struct Instance_norm_kernel_params
{
static constexpr int32_t USE_ONLINE_APPROACH = 1;
static constexpr int32_t THREADS_PER_CTA = THREADS_PER_CTA_;
//! 8 or 16
static constexpr int32_t THREADS_PER_PIXEL = THREADS_PER_PIXEL_;
static constexpr int32_t SM = SM_;
typedef Input_Data_Type_ Input_Data_Type;
typedef Output_Data_Type_ Output_Data_Type;
typedef StorageType_ StorageType;
static constexpr int32_t PIXELS_PER_THREAD_IN_REGISTERS = getPixelsPerThreadInRegisters<StorageType, SM>();
static constexpr int32_t PIXELS_PER_THREAD_IN_SMEM = getPixelsPerThreadInSmem<StorageType, SM>();
//! 64
static constexpr int32_t C_ELEMENTS_PER_CTA = C_ELEMENTS_PER_CTA_;
//! 4 default
static constexpr int32_t ELEMENTS_PER_LDG = C_ELEMENTS_PER_CTA / THREADS_PER_PIXEL;
// Derived params.
static constexpr int32_t PIXELS_PER_LDG = THREADS_PER_CTA / THREADS_PER_PIXEL;
static constexpr int32_t MIN_PIXELS_PER_CTA = PIXELS_PER_LDG * PIXELS_PER_THREAD_IN_REGISTERS;
};
struct InstanceNormFwdContext
{
InstanceNormFwdContext()
: sm_count(0)
, sm_shared_size(0)
, sm_version(0)
{
}
int32_t sm_count;
int32_t sm_shared_size;
int32_t sm_version;
};
struct InstanceNormFwdParams
{
// The input/output tensors.
void const* gmem_src;
void* gmem_dst;
// The bias/scale.
float* gmem_bias;
float* gmem_scale;
// running mean/var (refer BN API from cudnn doc)
float* gmem_running_mean;
float* gmem_running_var;
// saved mean/var (refer BN API from cudnn doc)
float* gmem_saved_mean;
float* gmem_saved_var;
// The dimensions.
int32_t nhw;
int32_t c;
int32_t n;
// The buffer to do the reduction for mean, stddev and count.
GMEM_SUMS_TYPE* gmem_sums;
// The buffer to count items in the different CTAs.
int32_t* gmem_counts;
// The counters of retired CTAs.
int32_t* gmem_retired_ctas;
// The epsilon to apply to the computation of the variance.
float var_eps;
// outer loop count
int32_t outer_loops;
// exponential average factor
float exp_avg_factor;
bool use_relu;
float relu_alpha;
int32_t c_blks;
float in_scale;
float out_scale;
};
void instanceNormBufferSizesDispatch(InstanceNormFwdContext const& context, InstanceNormFwdParams const& params,
size_t& size_sums, size_t& size_counts, size_t& size_retired_ctas, int32_t input_data_type = 1,
int32_t output_data_type = 1);
int32_t instanceNormFwdDispatch(InstanceNormFwdContext const& context, InstanceNormFwdParams& params,
cudaStream_t stream, int32_t input_data_type = 1, int32_t output_data_type = 1);
} // namespace instance_norm_impl
#endif // INSTANCE_NORM_FWD_H