/* * SPDX-FileCopyrightText: Copyright (c) 1993-2026 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 _BERT_FMHA_FMHA #define _BERT_FMHA_FMHA #include "common/bertCommon.h" #include "common/cudaDriverWrapper.h" #include "common/plugin.h" #include "cuda_runtime_api.h" #include "fused_multihead_attention_common.h" #include #include #include #include #include #include #include namespace nvinfer1 { namespace pluginInternal { template class TFusedMultiHeadAttentionXMMAKernel { public: using KernelMeta = TKernelMeta; using KernelParam = TKernelParam; inline uint64_t hashID(uint32_t s, uint32_t d) const { return (uint64_t) s << 32 | d; } virtual uint64_t hashID(const KernelMeta& kernelMeta) const { return hashID(kernelMeta.mS, kernelMeta.mD); } TFusedMultiHeadAttentionXMMAKernel( const TKernelMeta* pMetaStart, uint32_t nMetaCount, plugin::bert::Data_type type, uint32_t sm) : mDataType(type) , mKernelMeta(pMetaStart) , mKernelMetaCount(nMetaCount) , mSM(sm) { PLUGIN_ASSERT(mKernelMetaCount && "No kernels were loaded correctly."); } void loadXMMAKernels(uint32_t smVersion) { for (uint32_t i = 0; i < mKernelMetaCount; ++i) { const auto& kernelMeta = mKernelMeta[i]; const auto kernelKey = hashID(kernelMeta); if (kernelMeta.mSM == smVersion && kernelMeta.mDataType == mDataType && mFunctions.find(kernelKey) == mFunctions.end()) { const uint32_t DEFAULT_SMEM_SIZE{48 * 1024}; if (kernelMeta.mSharedMemBytes >= DEFAULT_SMEM_SIZE) { int32_t deviceID{0}; cudaGetDevice(&deviceID); int32_t sharedMemPerMultiprocessor{0}; if (cudaDeviceGetAttribute( &sharedMemPerMultiprocessor, cudaDevAttrMaxSharedMemoryPerBlockOptin, deviceID) != cudaSuccess || sharedMemPerMultiprocessor < static_cast(kernelMeta.mSharedMemBytes)) { // skip load function because not enough shared memory to launch the kernel continue; } } CUmodule hmod{0}; auto findModuleIter = mModules.find(kernelMeta.mCubin); if (findModuleIter != mModules.end()) { hmod = findModuleIter->second; } else { cuErrCheck(mDriver.cuModuleLoadData(&hmod, kernelMeta.mCubin), mDriver); mModules.insert(std::make_pair(kernelMeta.mCubin, hmod)); } FusedMultiHeadAttentionKernelInfo funcInfo; funcInfo.mMetaInfoIndex = i; cuErrCheck(mDriver.cuModuleGetFunction(&funcInfo.mDeviceFunction, hmod, kernelMeta.mFuncName), mDriver); if (kernelMeta.mSharedMemBytes >= DEFAULT_SMEM_SIZE) { if (mDriver.cuFuncSetAttribute(funcInfo.mDeviceFunction, CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES, kernelMeta.mSharedMemBytes) != CUDA_SUCCESS) { // some chip may not have enough shared memory to launch the kernel continue; } } mFunctions.insert({kernelKey, funcInfo}); uint64_t const s = kernelMeta.mS; uint64_t const headSize = kernelMeta.mD; uint64_t key = (headSize << 32 | s); if (mValidSequences.find(key) == mValidSequences.end()) { mValidSequences.insert(key); } } } } void loadXMMAKernels() { if (!mFunctions.empty()) { return; } loadXMMAKernels(mSM); // sm_86 chips prefer sm_86 sass, but can also use sm_80 sass if sm_86 not exist. // sm_87 cannot run sm_80 sass if (mSM == kSM_86) { loadXMMAKernels(kSM_80); } // sm_89 will reuse sm_80 and sm_86 kernels if (mSM == kSM_89) { loadXMMAKernels(kSM_86); loadXMMAKernels(kSM_80); } } bool isValid(int32_t headSize, int32_t s) const { uint64_t key = (static_cast(headSize) << 32 | static_cast(s)); return (mValidSequences.find(key) != mValidSequences.end()); } virtual void run(TKernelParam& params, cudaStream_t ss) const { const auto findIter = mFunctions.find(hashID(params.s, params.d)); std::stringstream errMsg; errMsg << "Could not find kernel for:\n" << "\t s: " << params.s << "\n" << "\t d: " << params.d << "\n" << "Was the plugin compiled on a compatible CUDA and SM version?\n" << "\t Compiled on CUDA " << CUDA_VERSION << "\n" << "\t Current SM version: " << mSM << "\n" << "\t SM versions enabled during compilation: " #if defined(ENABLE_SM72) << "72 " #endif #if defined(ENABLE_SM75) << "75 " #endif #if defined(ENABLE_SM80) << "80 " #endif #if defined(ENABLE_SM86) << "86 " #endif #if defined(ENABLE_SM87) << "87 " #endif #if defined(ENABLE_SM89) << "89 " #endif #if defined(ENABLE_SM90) << "90 " #endif << "\n"; PLUGIN_VALIDATE(findIter != mFunctions.end(), errMsg.str().c_str()); const auto& kernelMeta = mKernelMeta[findIter->second.mMetaInfoIndex]; const CUfunction func = findIter->second.mDeviceFunction; void* kernelParams[] = {¶ms, nullptr}; cuErrCheck(mDriver.cuLaunchKernel(func, params.h, params.b, 1, kernelMeta.mThreadsPerCTA, 1, 1, kernelMeta.mSharedMemBytes, ss, kernelParams, nullptr), mDriver); } virtual ~TFusedMultiHeadAttentionXMMAKernel() = default; protected: nvinfer1::CUDADriverWrapper mDriver; plugin::bert::Data_type mDataType; const TKernelMeta* mKernelMeta; uint32_t mKernelMetaCount; uint32_t mSM; std::unordered_map mModules; struct FusedMultiHeadAttentionKernelInfo { uint32_t mMetaInfoIndex; CUfunction mDeviceFunction; }; std::unordered_map mFunctions; // Set of valid sequence and head size combination. We use (headSize << 32 | sequence) as key here. std::unordered_set mValidSequences; }; template class TFusedMHAKernelFactory { public: TFusedMHAKernelList const* getXMMAKernels(typename TFusedMHAKernelList::KernelMeta const* pKernelList, uint32_t nbKernels, plugin::bert::Data_type type, uint32_t sm) { static std::mutex s_mutex; std::lock_guard lg(s_mutex); auto const id = hashID(type, sm); auto it = mKernels.find(id); if (it == mKernels.end()) { auto newKernel = std::make_unique(pKernelList, nbKernels, type, sm); newKernel->loadXMMAKernels(); it = mKernels.emplace(id, std::move(newKernel)).first; } return it->second.get(); } static TFusedMHAKernelFactory& Get() { static TFusedMHAKernelFactory s_factory; return s_factory; } private: TFusedMHAKernelFactory() = default; inline uint64_t hashID(plugin::bert::Data_type type, uint32_t sm) const { // use deviceID in hasID for multi GPU support before driver support context-less loading of cubin int32_t deviceID{0}; CSC(cudaGetDevice(&deviceID), STATUS_FAILURE); PLUGIN_ASSERT((deviceID & 0xFFFF) == deviceID); PLUGIN_ASSERT((type & 0xFFFF) == type); PLUGIN_ASSERT((sm & 0xFFFFFFFF) == sm); return (uint64_t) type << 48 | (uint64_t) deviceID << 32 | sm; } std::unordered_map> mKernels; }; } // namespace pluginInternal namespace plugin { namespace bert { static inline size_t get_size_in_bytes(size_t n, Data_type dtype) { switch (dtype) { case DATA_TYPE_E8M10: return n * 4; case DATA_TYPE_FP32: return n * 4; case DATA_TYPE_FP16: return n * 2; case DATA_TYPE_INT32: return n * 4; case DATA_TYPE_INT8: return n; case DATA_TYPE_INT4: return n / 2U; case DATA_TYPE_BOOL: return n / 8U; case DATA_TYPE_E8M7: return n * 2; default: PLUGIN_ASSERT(false); return 0; } } //////////////////////////////////////////////////////////////////////////////////////////////////// struct Fused_multihead_attention_params { // The QKV matrices. void* qkv_ptr{}; // The mask to implement drop-out. void* packed_mask_ptr{}; // The O matrix (output). void* o_ptr{}; // The stride between rows of the Q, K and V matrices. int64_t qkv_stride_in_bytes{}; // The stride between matrices of packed mask. int64_t packed_mask_stride_in_bytes{}; // The stride between rows of O. int64_t o_stride_in_bytes{}; #if defined(STORE_P) // The pointer to the P matrix (for debugging). void* p_ptr{}; // The stride between rows of the P matrix (for debugging). int64_t p_stride_in_bytes{}; #endif // defined(STORE_P) #if defined(STORE_S) // The pointer to the S matrix (for debugging). void* s_ptr{}; // The stride between rows of the S matrix (for debugging). int64_t s_stride_in_bytes{}; #endif // defined(STORE_S) // The dimensions. int32_t b{}; int32_t h{}; int32_t s{}; int32_t d{}; // The scaling factors for the kernel. uint32_t scale_bmm1{}; uint32_t scale_softmax{}; uint32_t scale_bmm2{}; // Do we use Niall's trick to avoid I2F/F2I in the INT8 kernel. // See https://confluence.nvidia.com/pages/viewpage.action?pageId=302779721 for details. bool enable_i2f_trick{}; // The number of heads computed by one iteration of the wave. int32_t heads_per_wave{}; // Buffers to perform a global sync and a critical section. int32_t* counters{}; int32_t* max_barriers{}; int32_t* sum_barriers{}; int32_t* locks{}; // Scratch buffers to finalize softmax. float* max_scratch_ptr{}; float* sum_scratch_ptr{}; // Scratch buffer to finalize the output (not needed for FP16). int32_t* o_scratch_ptr{}; }; //////////////////////////////////////////////////////////////////////////////////////////////////// #if defined(ENABLE_SM75) extern unsigned char fused_multihead_attention_fp16_64_64_kernel_sm75_cu_o[]; extern unsigned char fused_multihead_attention_fp16_96_64_kernel_sm75_cu_o[]; extern unsigned char fused_multihead_attention_fp16_128_64_kernel_sm75_cu_o[]; extern unsigned char fused_multihead_attention_fp16_384_64_kernel_sm75_cu_o[]; extern unsigned char fused_multihead_attention_int8_128_64_kernel_sm75_cu_o[]; extern unsigned char fused_multihead_attention_int8_384_64_kernel_sm75_cu_o[]; #endif // defined(ENABLE_SM75) #if defined(ENABLE_SM80) || defined(ENABLE_SM86) || defined(ENABLE_SM89) extern unsigned char fused_multihead_attention_fp16_64_64_kernel_sm80_cu_o[]; extern unsigned char fused_multihead_attention_fp16_96_64_kernel_sm80_cu_o[]; extern unsigned char fused_multihead_attention_int8_384_64_kernel_sm80_cu_o[]; extern unsigned char fused_multihead_attention_int8_128_64_kernel_sm80_cu_o[]; extern unsigned char fused_multihead_attention_fp16_128_64_kernel_sm80_cu_o[]; extern unsigned char fused_multihead_attention_fp16_384_64_kernel_sm80_cu_o[]; extern unsigned char cubin_fmha_v1_int8_64_64_sm80_cu_cubin[]; extern unsigned char cubin_fmha_v1_int8_96_64_sm80_cu_cubin[]; #endif // defined(ENABLE_SM80) || defined(SM86) || defined(ENABLE_SM89) #if defined(ENABLE_SM86) || defined(ENABLE_SM89) extern unsigned char fused_multihead_attention_fp16_384_64_kernel_sm86_cu_o[]; #endif // defined(ENABLE_SM86) || defined(ENABLE_SM89) #if defined(ENABLE_SM87) extern unsigned char cubin_fmha_v1_int8_384_64_sm87_cu_cubin[]; extern unsigned char cubin_fmha_v1_int8_128_64_sm87_cu_cubin[]; extern unsigned char cubin_fmha_v1_fp16_384_64_sm87_cu_cubin[]; extern unsigned char cubin_fmha_v1_fp16_128_64_sm87_cu_cubin[]; extern unsigned char cubin_fmha_v1_fp16_96_64_sm87_cu_cubin[]; extern unsigned char cubin_fmha_v1_fp16_64_64_sm87_cu_cubin[]; #endif // defined(ENABLE_SM87) #if defined(ENABLE_SM90) extern unsigned char cubin_fmha_v1_int8_512_64_sm90_cu_cubin[]; extern unsigned char cubin_fmha_v1_int8_384_64_sm90_cu_cubin[]; extern unsigned char cubin_fmha_v1_int8_128_64_sm90_cu_cubin[]; extern unsigned char cubin_fmha_v1_fp16_512_64_sm90_cu_cubin[]; extern unsigned char cubin_fmha_v1_fp16_384_64_sm90_cu_cubin[]; extern unsigned char cubin_fmha_v1_fp16_128_64_sm90_cu_cubin[]; extern unsigned char cubin_fmha_v1_fp16_96_64_sm90_cu_cubin[]; extern unsigned char cubin_fmha_v1_fp16_64_64_sm90_cu_cubin[]; #endif // defined(ENABLE_SM90) #if defined(ENABLE_SM100) extern unsigned char cubin_fmha_v1_int8_512_64_sm100_cu_cubin[]; extern unsigned char cubin_fmha_v1_int8_384_64_sm100_cu_cubin[]; extern unsigned char cubin_fmha_v1_int8_128_64_sm100_cu_cubin[]; extern unsigned char cubin_fmha_v1_fp16_512_64_sm100_cu_cubin[]; extern unsigned char cubin_fmha_v1_fp16_384_64_sm100_cu_cubin[]; extern unsigned char cubin_fmha_v1_fp16_128_64_sm100_cu_cubin[]; extern unsigned char cubin_fmha_v1_fp16_96_64_sm100_cu_cubin[]; extern unsigned char cubin_fmha_v1_fp16_64_64_sm100_cu_cubin[]; #endif // defined(ENABLE_SM100) #if defined(ENABLE_SM120) extern unsigned char cubin_fmha_v1_int8_512_64_sm120_cu_cubin[]; extern unsigned char cubin_fmha_v1_int8_384_64_sm120_cu_cubin[]; extern unsigned char cubin_fmha_v1_int8_128_64_sm120_cu_cubin[]; extern unsigned char cubin_fmha_v1_fp16_512_64_sm120_cu_cubin[]; extern unsigned char cubin_fmha_v1_fp16_384_64_sm120_cu_cubin[]; extern unsigned char cubin_fmha_v1_fp16_128_64_sm120_cu_cubin[]; extern unsigned char cubin_fmha_v1_fp16_96_64_sm120_cu_cubin[]; extern unsigned char cubin_fmha_v1_fp16_64_64_sm120_cu_cubin[]; #endif // defined(ENABLE_SM120) #if defined(ENABLE_SM75) extern uint32_t fused_multihead_attention_fp16_64_64_kernel_sm75_cu_o_len; extern uint32_t fused_multihead_attention_fp16_96_64_kernel_sm75_cu_o_len; extern uint32_t fused_multihead_attention_fp16_128_64_kernel_sm75_cu_o_len; extern uint32_t fused_multihead_attention_fp16_384_64_kernel_sm75_cu_o_len; extern uint32_t fused_multihead_attention_int8_128_64_kernel_sm75_cu_o_len; extern uint32_t fused_multihead_attention_int8_384_64_kernel_sm75_cu_o_len; #endif // defined(ENABLE_SM75) #if defined(ENABLE_SM80) || defined(ENABLE_SM86) || defined(ENABLE_SM89) extern uint32_t fused_multihead_attention_fp16_64_64_kernel_sm80_cu_o_len; extern uint32_t fused_multihead_attention_fp16_96_64_kernel_sm80_cu_o_len; extern uint32_t fused_multihead_attention_int8_384_64_kernel_sm80_cu_o_len; extern uint32_t fused_multihead_attention_int8_128_64_kernel_sm80_cu_o_len; extern uint32_t fused_multihead_attention_fp16_128_64_kernel_sm80_cu_o_len; extern uint32_t fused_multihead_attention_fp16_384_64_kernel_sm80_cu_o_len; extern uint32_t cubin_fmha_v1_int8_64_64_sm80_cu_cubin_len; extern uint32_t cubin_fmha_v1_int8_96_64_sm80_cu_cubin_len; #endif // defined(ENABLE_SM80) || defined(SM86) || defined(ENABLE_SM89) #if defined(ENABLE_SM86) || defined(ENABLE_SM89) extern uint32_t fused_multihead_attention_fp16_384_64_kernel_sm86_cu_o_len; #endif // defined(ENABLE_SM86) || defined(ENABLE_SM89) #if defined(ENABLE_SM87) extern uint32_t cubin_fmha_v1_int8_384_64_sm87_cu_cubin_len; extern uint32_t cubin_fmha_v1_int8_128_64_sm87_cu_cubin_len; extern uint32_t cubin_fmha_v1_fp16_384_64_sm87_cu_cubin_len; extern uint32_t cubin_fmha_v1_fp16_128_64_sm87_cu_cubin_len; extern uint32_t cubin_fmha_v1_fp16_96_64_sm87_cu_cubin_len; extern uint32_t cubin_fmha_v1_fp16_64_64_sm87_cu_cubin_len; #endif // defined(ENABLE_SM87) #if defined(ENABLE_SM90) extern uint32_t cubin_fmha_v1_int8_512_64_sm90_cu_cubin_len; extern uint32_t cubin_fmha_v1_int8_384_64_sm90_cu_cubin_len; extern uint32_t cubin_fmha_v1_int8_128_64_sm90_cu_cubin_len; extern uint32_t cubin_fmha_v1_fp16_512_64_sm90_cu_cubin_len; extern uint32_t cubin_fmha_v1_fp16_384_64_sm90_cu_cubin_len; extern uint32_t cubin_fmha_v1_fp16_128_64_sm90_cu_cubin_len; extern uint32_t cubin_fmha_v1_fp16_96_64_sm90_cu_cubin_len; extern uint32_t cubin_fmha_v1_fp16_64_64_sm90_cu_cubin_len; #endif // defined(ENABLE_SM90) #if defined(ENABLE_SM100) extern uint32_t cubin_fmha_v1_int8_512_64_sm100_cu_cubin_len; extern uint32_t cubin_fmha_v1_int8_384_64_sm100_cu_cubin_len; extern uint32_t cubin_fmha_v1_int8_128_64_sm100_cu_cubin_len; extern uint32_t cubin_fmha_v1_fp16_512_64_sm100_cu_cubin_len; extern uint32_t cubin_fmha_v1_fp16_384_64_sm100_cu_cubin_len; extern uint32_t cubin_fmha_v1_fp16_128_64_sm100_cu_cubin_len; extern uint32_t cubin_fmha_v1_fp16_96_64_sm100_cu_cubin_len; extern uint32_t cubin_fmha_v1_fp16_64_64_sm100_cu_cubin_len; #endif // defined(ENABLE_SM100) #if defined(ENABLE_SM120) extern uint32_t cubin_fmha_v1_int8_512_64_sm120_cu_cubin_len; extern uint32_t cubin_fmha_v1_int8_384_64_sm120_cu_cubin_len; extern uint32_t cubin_fmha_v1_int8_128_64_sm120_cu_cubin_len; extern uint32_t cubin_fmha_v1_fp16_512_64_sm120_cu_cubin_len; extern uint32_t cubin_fmha_v1_fp16_384_64_sm120_cu_cubin_len; extern uint32_t cubin_fmha_v1_fp16_128_64_sm120_cu_cubin_len; extern uint32_t cubin_fmha_v1_fp16_96_64_sm120_cu_cubin_len; extern uint32_t cubin_fmha_v1_fp16_64_64_sm120_cu_cubin_len; #endif // defined(ENABLE_SM120) #if !(defined(ENABLE_SM72) || defined(ENABLE_SM75) || defined(ENABLE_SM80) || defined(ENABLE_SM86) \ || defined(ENABLE_SM87) || defined(ENABLE_SM89) || defined(ENABLE_SM90) || defined(ENABLE_SM100) \ || defined(ENABLE_SM120)) #error This file can only be included if one of sm 72, 75, 80, 86, 87, 89, 90, 100 or 120 is defined. #endif static const struct FusedMultiHeadAttentionKernelMetaInfoV1 { Data_type mDataType; uint32_t mS; uint32_t mD; uint32_t mSM; const unsigned char* mCubin; uint32_t mCubinSize; const char* mFuncName; uint32_t mSharedMemBytes; uint32_t mThreadsPerCTA; } sMhaKernelMetaInfos[] = { #if defined(ENABLE_SM75) // Turing {DATA_TYPE_FP16, 64, 64, kSM_75, fused_multihead_attention_fp16_64_64_kernel_sm75_cu_o, fused_multihead_attention_fp16_64_64_kernel_sm75_cu_o_len, "fused_multihead_attention_v2_fp16_64_64_kernel_sm75", 24576, 128}, {DATA_TYPE_FP16, 96, 64, kSM_75, fused_multihead_attention_fp16_96_64_kernel_sm75_cu_o, fused_multihead_attention_fp16_96_64_kernel_sm75_cu_o_len, "fused_multihead_attention_v2_fp16_96_64_kernel_sm75", 24576, 128}, {DATA_TYPE_FP16, 128, 64, kSM_75, fused_multihead_attention_fp16_128_64_kernel_sm75_cu_o, fused_multihead_attention_fp16_128_64_kernel_sm75_cu_o_len, "fused_multihead_attention_fp16_128_64_kernel_sm75", 32768, 128}, {DATA_TYPE_FP16, 384, 64, kSM_75, fused_multihead_attention_fp16_384_64_kernel_sm75_cu_o, fused_multihead_attention_fp16_384_64_kernel_sm75_cu_o_len, "fused_multihead_attention_fp16_384_64_kernel_sm75", 57344, 256}, {DATA_TYPE_INT8, 128, 64, kSM_75, fused_multihead_attention_int8_128_64_kernel_sm75_cu_o, fused_multihead_attention_int8_128_64_kernel_sm75_cu_o_len, "fused_multihead_attention_int8_128_64_kernel_sm75", 16384, 128}, {DATA_TYPE_INT8, 384, 64, kSM_75, fused_multihead_attention_int8_384_64_kernel_sm75_cu_o, fused_multihead_attention_int8_384_64_kernel_sm75_cu_o_len, "fused_multihead_attention_int8_384_64_kernel_sm75", 53284, 256}, #endif // defined(ENABLE_SM75) #if defined(ENABLE_SM80) || defined(ENABLE_SM86) || defined(ENABLE_SM89) // Ampere {DATA_TYPE_FP16, 64, 64, kSM_80, fused_multihead_attention_fp16_64_64_kernel_sm80_cu_o, fused_multihead_attention_fp16_64_64_kernel_sm80_cu_o_len, "fused_multihead_attention_v2_fp16_64_64_kernel_sm80", 32768, 128}, {DATA_TYPE_FP16, 96, 64, kSM_80, fused_multihead_attention_fp16_96_64_kernel_sm80_cu_o, fused_multihead_attention_fp16_96_64_kernel_sm80_cu_o_len, "fused_multihead_attention_v2_fp16_96_64_kernel_sm80", 49152, 128}, {DATA_TYPE_FP16, 128, 64, kSM_80, fused_multihead_attention_fp16_128_64_kernel_sm80_cu_o, fused_multihead_attention_fp16_128_64_kernel_sm80_cu_o_len, "fused_multihead_attention_fp16_128_64_kernel_sm80", 49152, 128}, {DATA_TYPE_FP16, 384, 64, kSM_80, fused_multihead_attention_fp16_384_64_kernel_sm80_cu_o, fused_multihead_attention_fp16_384_64_kernel_sm80_cu_o_len, "fused_multihead_attention_fp16_384_64_kernel_sm80", 114688, 256}, {DATA_TYPE_INT8, 64, 64, kSM_80, cubin_fmha_v1_int8_64_64_sm80_cu_cubin, cubin_fmha_v1_int8_64_64_sm80_cu_cubin_len, "fmha_v1_int8_64_64_sm80_kernel", 24576, 128}, {DATA_TYPE_INT8, 96, 64, kSM_80, cubin_fmha_v1_int8_96_64_sm80_cu_cubin, cubin_fmha_v1_int8_96_64_sm80_cu_cubin_len, "fmha_v1_int8_96_64_sm80_kernel", 28672, 128}, {DATA_TYPE_INT8, 128, 64, kSM_80, fused_multihead_attention_int8_128_64_kernel_sm80_cu_o, fused_multihead_attention_int8_128_64_kernel_sm80_cu_o_len, "fused_multihead_attention_int8_128_64_kernel_sm80", 24576, 128}, {DATA_TYPE_INT8, 384, 64, kSM_80, fused_multihead_attention_int8_384_64_kernel_sm80_cu_o, fused_multihead_attention_int8_384_64_kernel_sm80_cu_o_len, "fused_multihead_attention_int8_384_64_kernel_sm80", 57344, 256}, #endif // defined(ENABLE_SM80) || defined(SM86) || defined(ENABLE_SM89) #if defined(ENABLE_SM86) || defined(ENABLE_SM89) // GA10x // Note: For GA10X keep only kernels whose sharedMemBytes < 100KiB {DATA_TYPE_FP16, 64, 64, kSM_86, fused_multihead_attention_fp16_64_64_kernel_sm80_cu_o, fused_multihead_attention_fp16_64_64_kernel_sm80_cu_o_len, "fused_multihead_attention_v2_fp16_64_64_kernel_sm80", 32768, 128}, {DATA_TYPE_FP16, 96, 64, kSM_86, fused_multihead_attention_fp16_96_64_kernel_sm80_cu_o, fused_multihead_attention_fp16_96_64_kernel_sm80_cu_o_len, "fused_multihead_attention_v2_fp16_96_64_kernel_sm80", 49152, 128}, {DATA_TYPE_FP16, 128, 64, kSM_86, fused_multihead_attention_fp16_128_64_kernel_sm80_cu_o, fused_multihead_attention_fp16_128_64_kernel_sm80_cu_o_len, "fused_multihead_attention_fp16_128_64_kernel_sm80", 49152, 128}, {DATA_TYPE_FP16, 384, 64, kSM_86, fused_multihead_attention_fp16_384_64_kernel_sm86_cu_o, fused_multihead_attention_fp16_384_64_kernel_sm86_cu_o_len, "fused_multihead_attention_fp16_384_64_kernel_sm80", 65536, 256}, {DATA_TYPE_INT8, 128, 64, kSM_86, fused_multihead_attention_int8_128_64_kernel_sm80_cu_o, fused_multihead_attention_int8_128_64_kernel_sm80_cu_o_len, "fused_multihead_attention_int8_128_64_kernel_sm80", 24576, 128}, {DATA_TYPE_INT8, 384, 64, kSM_86, fused_multihead_attention_int8_384_64_kernel_sm80_cu_o, fused_multihead_attention_int8_384_64_kernel_sm80_cu_o_len, "fused_multihead_attention_int8_384_64_kernel_sm80", 57344, 256}, #endif // defined(ENABLE_SM86) || defined(ENABLE_SM89) #if defined(ENABLE_SM87) // GA10b (Orin-Auto) {DATA_TYPE_INT8, 384, 64, kSM_87, cubin_fmha_v1_int8_384_64_sm87_cu_cubin, cubin_fmha_v1_int8_384_64_sm87_cu_cubin_len, "fmha_v1_int8_384_64_sm87_kernel", 40960, 256}, {DATA_TYPE_INT8, 128, 64, kSM_87, cubin_fmha_v1_int8_128_64_sm87_cu_cubin, cubin_fmha_v1_int8_128_64_sm87_cu_cubin_len, "fmha_v1_int8_128_64_sm87_kernel", 24576, 128}, {DATA_TYPE_FP16, 384, 64, kSM_87, cubin_fmha_v1_fp16_384_64_sm87_cu_cubin, cubin_fmha_v1_fp16_384_64_sm87_cu_cubin_len, "fmha_v1_fp16_384_64_sm87_kernel", 65536, 256}, {DATA_TYPE_FP16, 128, 64, kSM_87, cubin_fmha_v1_fp16_128_64_sm87_cu_cubin, cubin_fmha_v1_fp16_128_64_sm87_cu_cubin_len, "fmha_v1_fp16_128_64_sm87_kernel", 49152, 128}, {DATA_TYPE_FP16, 96, 64, kSM_87, cubin_fmha_v1_fp16_96_64_sm87_cu_cubin, cubin_fmha_v1_fp16_96_64_sm87_cu_cubin_len, "fmha_v1_fp16_96_64_sm87_kernel", 49152, 128}, {DATA_TYPE_FP16, 64, 64, kSM_87, cubin_fmha_v1_fp16_64_64_sm87_cu_cubin, cubin_fmha_v1_fp16_64_64_sm87_cu_cubin_len, "fmha_v1_fp16_64_64_sm87_kernel", 32768, 128}, #endif // defined(ENABLE_SM87) #if defined(ENABLE_SM90) // GH100 hopper {DATA_TYPE_INT8, 512, 64, kSM_90, cubin_fmha_v1_int8_512_64_sm90_cu_cubin, cubin_fmha_v1_int8_512_64_sm90_cu_cubin_len, "fmha_v1_int8_512_64_sm90_kernel", 73728, 256}, {DATA_TYPE_INT8, 384, 64, kSM_90, cubin_fmha_v1_int8_384_64_sm90_cu_cubin, cubin_fmha_v1_int8_384_64_sm90_cu_cubin_len, "fmha_v1_int8_384_64_sm90_kernel", 73728, 256}, {DATA_TYPE_INT8, 128, 64, kSM_90, cubin_fmha_v1_int8_128_64_sm90_cu_cubin, cubin_fmha_v1_int8_128_64_sm90_cu_cubin_len, "fmha_v1_int8_128_64_sm90_kernel", 24576, 128}, {DATA_TYPE_FP16, 512, 64, kSM_90, cubin_fmha_v1_fp16_512_64_sm90_cu_cubin, cubin_fmha_v1_fp16_512_64_sm90_cu_cubin_len, "fmha_v1_fp16_512_64_sm90_kernel", 73728, 256}, {DATA_TYPE_FP16, 384, 64, kSM_90, cubin_fmha_v1_fp16_384_64_sm90_cu_cubin, cubin_fmha_v1_fp16_384_64_sm90_cu_cubin_len, "fmha_v1_fp16_384_64_sm90_kernel", 65536, 256}, {DATA_TYPE_FP16, 128, 64, kSM_90, cubin_fmha_v1_fp16_128_64_sm90_cu_cubin, cubin_fmha_v1_fp16_128_64_sm90_cu_cubin_len, "fmha_v1_fp16_128_64_sm90_kernel", 65536, 128}, {DATA_TYPE_FP16, 96, 64, kSM_90, cubin_fmha_v1_fp16_96_64_sm90_cu_cubin, cubin_fmha_v1_fp16_96_64_sm90_cu_cubin_len, "fmha_v1_fp16_96_64_sm90_kernel", 49152, 128}, {DATA_TYPE_FP16, 64, 64, kSM_90, cubin_fmha_v1_fp16_64_64_sm90_cu_cubin, cubin_fmha_v1_fp16_64_64_sm90_cu_cubin_len, "fmha_v1_fp16_64_64_sm90_kernel", 32768, 128}, #endif // defined(ENABLE_SM90) #if defined(ENABLE_SM100) {DATA_TYPE_INT8, 512, 64, kSM_100, cubin_fmha_v1_int8_512_64_sm100_cu_cubin, cubin_fmha_v1_int8_512_64_sm100_cu_cubin_len, "fmha_v1_int8_512_64_sm100_kernel", 73728, 256}, {DATA_TYPE_INT8, 384, 64, kSM_100, cubin_fmha_v1_int8_384_64_sm100_cu_cubin, cubin_fmha_v1_int8_384_64_sm100_cu_cubin_len, "fmha_v1_int8_384_64_sm100_kernel", 73728, 256}, {DATA_TYPE_INT8, 128, 64, kSM_100, cubin_fmha_v1_int8_128_64_sm100_cu_cubin, cubin_fmha_v1_int8_128_64_sm100_cu_cubin_len, "fmha_v1_int8_128_64_sm100_kernel", 24576, 128}, {DATA_TYPE_FP16, 512, 64, kSM_100, cubin_fmha_v1_fp16_512_64_sm100_cu_cubin, cubin_fmha_v1_fp16_512_64_sm100_cu_cubin_len, "fmha_v1_fp16_512_64_sm100_kernel", 73728, 256}, {DATA_TYPE_FP16, 384, 64, kSM_100, cubin_fmha_v1_fp16_384_64_sm100_cu_cubin, cubin_fmha_v1_fp16_384_64_sm100_cu_cubin_len, "fmha_v1_fp16_384_64_sm100_kernel", 65536, 256}, {DATA_TYPE_FP16, 128, 64, kSM_100, cubin_fmha_v1_fp16_128_64_sm100_cu_cubin, cubin_fmha_v1_fp16_128_64_sm100_cu_cubin_len, "fmha_v1_fp16_128_64_sm100_kernel", 65536, 128}, {DATA_TYPE_FP16, 96, 64, kSM_100, cubin_fmha_v1_fp16_96_64_sm100_cu_cubin, cubin_fmha_v1_fp16_96_64_sm100_cu_cubin_len, "fmha_v1_fp16_96_64_sm100_kernel", 49152, 128}, {DATA_TYPE_FP16, 64, 64, kSM_100, cubin_fmha_v1_fp16_64_64_sm100_cu_cubin, cubin_fmha_v1_fp16_64_64_sm100_cu_cubin_len, "fmha_v1_fp16_64_64_sm100_kernel", 32768, 128}, #endif // defined(ENABLE_SM100) #if defined(ENABLE_SM120) {DATA_TYPE_INT8, 512, 64, kSM_120, cubin_fmha_v1_int8_512_64_sm120_cu_cubin, cubin_fmha_v1_int8_512_64_sm120_cu_cubin_len, "fmha_v1_int8_512_64_sm120_kernel", 73728, 256}, {DATA_TYPE_INT8, 384, 64, kSM_120, cubin_fmha_v1_int8_384_64_sm120_cu_cubin, cubin_fmha_v1_int8_384_64_sm120_cu_cubin_len, "fmha_v1_int8_384_64_sm120_kernel", 73728, 256}, {DATA_TYPE_INT8, 128, 64, kSM_120, cubin_fmha_v1_int8_128_64_sm120_cu_cubin, cubin_fmha_v1_int8_128_64_sm120_cu_cubin_len, "fmha_v1_int8_128_64_sm120_kernel", 24576, 128}, {DATA_TYPE_FP16, 512, 64, kSM_120, cubin_fmha_v1_fp16_512_64_sm120_cu_cubin, cubin_fmha_v1_fp16_512_64_sm120_cu_cubin_len, "fmha_v1_fp16_512_64_sm120_kernel", 73728, 256}, {DATA_TYPE_FP16, 384, 64, kSM_120, cubin_fmha_v1_fp16_384_64_sm120_cu_cubin, cubin_fmha_v1_fp16_384_64_sm120_cu_cubin_len, "fmha_v1_fp16_384_64_sm120_kernel", 65536, 256}, {DATA_TYPE_FP16, 128, 64, kSM_120, cubin_fmha_v1_fp16_128_64_sm120_cu_cubin, cubin_fmha_v1_fp16_128_64_sm120_cu_cubin_len, "fmha_v1_fp16_128_64_sm120_kernel", 65536, 128}, {DATA_TYPE_FP16, 96, 64, kSM_120, cubin_fmha_v1_fp16_96_64_sm120_cu_cubin, cubin_fmha_v1_fp16_96_64_sm120_cu_cubin_len, "fmha_v1_fp16_96_64_sm120_kernel", 49152, 128}, {DATA_TYPE_FP16, 64, 64, kSM_120, cubin_fmha_v1_fp16_64_64_sm120_cu_cubin, cubin_fmha_v1_fp16_64_64_sm120_cu_cubin_len, "fmha_v1_fp16_64_64_sm120_kernel", 32768, 128}, #endif // defined(ENABLE_SM120) }; using FusedMultiHeadAttentionXMMAKernel = pluginInternal::TFusedMultiHeadAttentionXMMAKernel; using FusedMHAKernelFactory = pluginInternal::TFusedMHAKernelFactory; inline const FusedMultiHeadAttentionXMMAKernel* getXMMAKernels(Data_type type, uint32_t sm) { return FusedMHAKernelFactory::Get().getXMMAKernels( sMhaKernelMetaInfos, sizeof(sMhaKernelMetaInfos) / sizeof(sMhaKernelMetaInfos[0]), type, sm); } } // namespace bert } // namespace plugin } // namespace nvinfer1 #endif // _BERT_FMHA_FMHA