Files
alibaba--mnn/source/backend/tensorrt/execution/plugin/LayerNormPlugin.cpp
T
2026-07-13 13:33:03 +08:00

52 lines
1.8 KiB
C++
Executable File

//
// LayerNormPlugin.cpp
// MNN
//
// Created by MNN on b'2021/02/08'.
// Copyright © 2018, Alibaba Group Holding Limited
//
#include "LayerNormPlugin.hpp"
namespace MNN {
LayerNormPlugin::LayerNormPlugin(const Op* op, const MNNTRTPlugin::Plugin* plugin) {
const auto* layer_norm_param = op->main_as_LayerNorm();
int axis_size = layer_norm_param->axis()->size();
mAxis.resize(axis_size);
for (int i = 0; i < axis_size; ++i) {
mAxis[i] = layer_norm_param->axis()->Get(i);
}
mEpsilon = layer_norm_param->epsilon();
int size = layer_norm_param->gamma()->size();
cudaMalloc(&mGamma, size * sizeof(float));
MNN_ASSERT(nullptr != mGamma);
const float* gamma_data = layer_norm_param->gamma()->data();
auto status = cudaMemcpy(mGamma, gamma_data, size * sizeof(float), cudaMemcpyHostToDevice);
MNN_ASSERT(0 == status);
cudaMalloc(&mBeta, size * sizeof(float));
MNN_ASSERT(nullptr != mBeta);
const float* beta_data = layer_norm_param->beta()->data();
status = cudaMemcpy(mBeta, beta_data, size * sizeof(float), cudaMemcpyHostToDevice);
MNN_ASSERT(0 == status);
auto Info = plugin->main_as_OneHotInfo();
mOutterSize = Info->outerSize();
mInnerSize = Info->innerSize();
}
LayerNormPlugin::~LayerNormPlugin() {
cudaFree(mBeta);
cudaFree(mGamma);
}
int LayerNormPlugin::onEnqueue(int batchSize, const void* const* inputs, void** outputs, void*, nvinfer1::DataType dataType, cudaStream_t stream) {
const float* bottom_data = reinterpret_cast<const float*>(inputs[0]);
float* top_data = reinterpret_cast<float*>(outputs[0]);
return LayerNormExecute(dataType, mOutterSize, mInnerSize, bottom_data, top_data, (const float*)mGamma, (const float*)mBeta,
stream);
}
} // namespace MNN