mirror of
https://github.com/ROCm/composable_kernel.git
synced 2026-07-14 11:07:44 +00:00
update code
This commit is contained in:
@@ -23,6 +23,7 @@
|
||||
#include "ck_tile/host/reference/reference_gemm.hpp"
|
||||
#include "ck_tile/host/reference/reference_im2col.hpp"
|
||||
#include "ck_tile/host/reference/reference_layernorm2d_fwd.hpp"
|
||||
#include "ck_tile/host/reference/reference_moe_sorting.hpp"
|
||||
#include "ck_tile/host/reference/reference_permute.hpp"
|
||||
#include "ck_tile/host/reference/reference_reduce.hpp"
|
||||
#include "ck_tile/host/reference/reference_rmsnorm2d_fwd.hpp"
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <stdint.h>
|
||||
#include <stdexcept>
|
||||
#include "ck_tile/host/hip_check_error.hpp"
|
||||
#include "ck_tile/host/host_tensor.hpp"
|
||||
|
||||
namespace ck_tile {
|
||||
template <typename T>
|
||||
@@ -36,6 +37,19 @@ struct DeviceMem
|
||||
mpDeviceBuf = nullptr;
|
||||
}
|
||||
}
|
||||
template <T>
|
||||
DeviceMem(const HostTensor<T>& t) : mMemSize(t.get_element_space_size_in_bytes())
|
||||
{
|
||||
if(mMemSize != 0)
|
||||
{
|
||||
HIP_CHECK_ERROR(hipMalloc(static_cast<void**>(&mpDeviceBuf), mMemSize));
|
||||
}
|
||||
else
|
||||
{
|
||||
mpDeviceBuf = nullptr;
|
||||
}
|
||||
ToDevice(t.data());
|
||||
}
|
||||
void Realloc(std::size_t mem_size)
|
||||
{
|
||||
if(mpDeviceBuf)
|
||||
@@ -92,6 +106,22 @@ struct DeviceMem
|
||||
HIP_CHECK_ERROR(hipMemcpy(p, mpDeviceBuf, cpySize, hipMemcpyDeviceToHost));
|
||||
}
|
||||
}
|
||||
|
||||
// construct a host tensor with type T
|
||||
template <typename T>
|
||||
HostTensor<T> ToHost(std::size_t cpySize = mMemSize)
|
||||
{
|
||||
// TODO: host tensor could be slightly larger than the device tensor
|
||||
// we just copy all data from GPU buffer
|
||||
std::size_t host_elements =
|
||||
(cpySize + sizeof(T) - 1) / sizeof(T) HostTensor<T> h_({host_elements});
|
||||
if(mpDeviceBuf)
|
||||
{
|
||||
HIP_CHECK_ERROR(hipMemcpy(h_.data(), mpDeviceBuf, cpySize, hipMemcpyDeviceToHost));
|
||||
}
|
||||
return h_;
|
||||
}
|
||||
|
||||
void SetZero() const
|
||||
{
|
||||
if(mpDeviceBuf)
|
||||
|
||||
78
include/ck_tile/host/reference/reference_moe_sorting.hpp
Normal file
78
include/ck_tile/host/reference/reference_moe_sorting.hpp
Normal file
@@ -0,0 +1,78 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// Copyright (c) 2024, Advanced Micro Devices, Inc. All rights reserved.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "ck_tile/core.hpp"
|
||||
#include "ck_tile/host/host_tensor.hpp"
|
||||
|
||||
namespace ck_tile {
|
||||
|
||||
template <typename WeightType, typename IndexType = index_t>
|
||||
CK_TILE_HOST void reference_moe_sorting(const HostTensor<IndexType>& topk_ids,
|
||||
const HostTensor<WeightType>& weights,
|
||||
HostTensor<IndexType>& sorted_token_ids,
|
||||
HostTensor<WeightType>& sorted_weight,
|
||||
HostTensor<IndexType>& sorted_expert_ids,
|
||||
index_t& unit_cnt,
|
||||
const index_t experts,
|
||||
const index_t unit_size)
|
||||
{
|
||||
const index_t num_token = topk_ids.mDesc.get_lengths()[0];
|
||||
const index_t topk = topk_ids.mDesc.get_lengths()[1];
|
||||
std::vector<std::vector<IndexType>> expert_tokens(experts,
|
||||
std::vector<IndexType>(unit_size, num_token));
|
||||
std::vector<std::vector<WeightType>> expert_token_weights(
|
||||
experts, std::vector<WeightType>(unit_size, 0));
|
||||
std::vector<IndexType> expert_slices(experts, 1);
|
||||
std::vector<IndexType> expert_slice_idxs(experts, 0);
|
||||
|
||||
for(index_t t = 0; t < num_token; t++)
|
||||
{
|
||||
for(index_t k = 0; k < topk; k++)
|
||||
{
|
||||
IndexType e = topk_ids(t, k);
|
||||
WeightType w = weights(t, k);
|
||||
index_t idx = expert_slice_idxs[e];
|
||||
if(idx > expert_slices[e] * unit_size - 1)
|
||||
{
|
||||
expert_slices[e]++;
|
||||
index_t new_size = expert_slices[e] * unit_size;
|
||||
expert_tokens[e].resize(new_size);
|
||||
expert_token_weights[e].resize(new_size);
|
||||
for(index_t i = (expert_slices[e] - 1) * unit_size; i < new_size; i++)
|
||||
{
|
||||
expert_tokens[e][i] = num_token;
|
||||
expert_token_weights[e][i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
expert_tokens[e][idx] = t;
|
||||
expert_token_weights[e][idx] = w;
|
||||
expert_slice_idxs[e]++;
|
||||
}
|
||||
}
|
||||
|
||||
IndexType* out_tokens = sorted_token_ids.data();
|
||||
WeightType* out_weights = sorted_weight.data();
|
||||
IndexType* out_expert_id = sorted_expert_ids.data();
|
||||
for(index_t e = 0; e < experts; e++)
|
||||
{
|
||||
memcpy(out_tokens, expert_tokens[e].data(), sizeof(index_t) * expert_slices[e] * unit_size);
|
||||
out_tokens += expert_slices[e] * unit_size;
|
||||
memcpy(out_weights,
|
||||
expert_token_weights[e].data(),
|
||||
sizeof(WeightType) * expert_slices[e] * unit_size);
|
||||
out_weights += expert_slices[e] * unit_size;
|
||||
|
||||
for(index_t s = 0; s < expert_slices[e]; s++)
|
||||
{
|
||||
out_expert_id[s] = e;
|
||||
unit_cnt++;
|
||||
}
|
||||
out_expert_id += expert_slices[e];
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
} // namespace ck_tile
|
||||
@@ -56,11 +56,10 @@ reference_permute(const HostTensor<DataType>& x, HostTensor<DataType>& y, std::v
|
||||
}
|
||||
|
||||
template <typename DataType>
|
||||
CK_TILE_HOST auto
|
||||
reference_permute(const HostTensor<DataType>& x, std::vector<index_t> perm)
|
||||
CK_TILE_HOST auto reference_permute(const HostTensor<DataType>& x, std::vector<index_t> perm)
|
||||
{
|
||||
auto x_shape = x.get_lengths();
|
||||
ck_tile::index_t rank = perm.size();
|
||||
auto x_shape = x.get_lengths();
|
||||
ck_tile::index_t rank = perm.size();
|
||||
std::vector<ck_tile::index_t> y_shape = [&]() {
|
||||
std::vector<ck_tile::index_t> tmp(rank, 0);
|
||||
for(int i = 0; i < static_cast<int>(rank); i++)
|
||||
|
||||
@@ -3,12 +3,12 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "ck_tile/ops/fused_moe/kernel/fused_moe_kernel.hpp"
|
||||
#include "ck_tile/ops/fused_moe/kernel/fused_moe_shape.hpp"
|
||||
#include "ck_tile/ops/fused_moe/kernel/fused_moe_tile_partitioner.hpp"
|
||||
#include "ck_tile/ops/fused_moe/pipeline/fused_moe_pipeline_flatmm.hpp"
|
||||
#include "ck_tile/ops/fused_moe/pipeline/fused_moe_pipeline_flatmm_policy.hpp"
|
||||
#include "ck_tile/ops/fused_moe/pipeline/fused_moe_pipeline_problem.hpp"
|
||||
#include "ck_tile/ops/fused_moe/pipeline/fused_moe_traits.hpp"
|
||||
#include "ck_tile/ops/fused_moe/kernel/fused_moegemm_kernel.hpp"
|
||||
#include "ck_tile/ops/fused_moe/kernel/fused_moegemm_shape.hpp"
|
||||
#include "ck_tile/ops/fused_moe/kernel/fused_moegemm_tile_partitioner.hpp"
|
||||
#include "ck_tile/ops/fused_moe/pipeline/fused_moegemm_pipeline_flatmm.hpp"
|
||||
#include "ck_tile/ops/fused_moe/pipeline/fused_moegemm_pipeline_flatmm_policy.hpp"
|
||||
#include "ck_tile/ops/fused_moe/pipeline/fused_moegemm_pipeline_problem.hpp"
|
||||
#include "ck_tile/ops/fused_moe/pipeline/fused_moegemm_traits.hpp"
|
||||
#include "ck_tile/ops/common/generic_2d_block_shape.hpp"
|
||||
#include "ck_tile/ops/common/tensor_layout.hpp"
|
||||
|
||||
@@ -22,17 +22,17 @@
|
||||
// (only for reference) exp-0 exp-1 exp-2 exp-3 exp-4 exp-5
|
||||
// weight_id_per_expert is: [[a], [g, j, m], [d, k], [b, e, h, l, n], [], [c, f, i, o]]
|
||||
//
|
||||
// max_tokens_post_padded : top_k * input_tokens + num_experts * (M_a - 1)
|
||||
// max_num_tokens_padded : top_k * input_tokens + num_experts * (M_a - 1)
|
||||
// * this could be larger than actual, since actual tokens are on GPU
|
||||
//
|
||||
// sorted_token_ids_ptr : [0, 6, 6, 6, 2, 3, 4, 6, 1, 3, 6, 6, 0, 1, 2, 3, 4, 6, 6, 6, 6, 6, 6, 6, 0, 1, 2, 5]
|
||||
// |- exp-0 -|- exp-1 -|- exp-2 -|- exp-3 -|- exp-4 -|- exp-5 -|
|
||||
// sorted_weight_ptr : [a, *, *, *, g, j, m, *, d, k, *, *, b, e, h, l, n, *, *, *, *, *, *, *, c, f, i, o]
|
||||
//
|
||||
// * length is max_tokens_post_padded, actual size is num_tokens_post_padded_ptr
|
||||
// * length is max_num_tokens_padded, actual size is num_tokens_post_padded_ptr
|
||||
//
|
||||
// sorted_expert_ids_ptr : [0, 1, 2, 3, 3, 4, 5]
|
||||
// * length is (max_tokens_post_padded + block_size - 1) / block_size
|
||||
// * length is (max_num_tokens_padded + block_size - 1) / block_size
|
||||
//
|
||||
// num_tokens_post_padded_ptr : [28]
|
||||
// num_sorted_tiles_ptr : [7]
|
||||
@@ -43,11 +43,12 @@
|
||||
// 3) use num_sorted_tiles_ptr, already divided by M_a
|
||||
//
|
||||
// * below used for indexing
|
||||
// 1) sorted_token_ids_ptr
|
||||
// 1) sorted_token_ids_ptr [max_num_tokens_padded]
|
||||
// 2) sorted_weight_ptr
|
||||
// 3) sorted_expert_ids_ptr
|
||||
// 4)num_tokens_post_padded_ptr/num_sorted_tiles_ptr (select one)
|
||||
//
|
||||
// max_num_tokens_padded: opk_ids.numel() + num_experts * (block_size - 1)
|
||||
//
|
||||
// [indexing implementation-2]
|
||||
// before sort, topk_ids is : [[0, 3, 5], [2, 3, 5], [1, 3, 5], [1, 2, 3], [1, 3, 5]]
|
||||
@@ -92,15 +93,15 @@ struct FusedMoeGemmHostArgs
|
||||
const void* y_smooth_scale_ptr; // [e, 1, n], smooth-quant-scale for 2nd gemm input
|
||||
void* o_ptr; // [m, k], output token
|
||||
|
||||
const void* sorted_token_ids_ptr;
|
||||
const void* sorted_weight_ptr;
|
||||
const void* sorted_expert_ids_ptr;
|
||||
const void* num_sorted_tiles_ptr;
|
||||
const void* sorted_token_ids_ptr; // [max_num_tokens_padded]
|
||||
const void* sorted_weight_ptr; // [max_num_tokens_padded]
|
||||
const void* sorted_expert_ids_ptr; // [(max_num_tokens_padded + block_size - 1) / block_size]
|
||||
const void* num_sorted_tiles_ptr; // [1]
|
||||
|
||||
index_t hidden_size; // k
|
||||
index_t hidden_size; // k
|
||||
index_t intermediate_size; // n (TP slice this)
|
||||
index_t num_tokens; // input number of tokens for current iteration
|
||||
index_t num_experts; // number of groups
|
||||
index_t num_tokens; // input number of tokens for current iteration
|
||||
index_t num_experts; // number of groups
|
||||
// index_t top_k; // need this?
|
||||
|
||||
index_t stride_token; // for input/output, stride for each row, should >= hidden_size
|
||||
@@ -134,10 +135,10 @@ struct FusedMoeGemmKernel
|
||||
|
||||
using Traits = typename Pipeline::Problem::Traits;
|
||||
|
||||
static constexpr bool IsGateOnly = Traits::IsGateOnly;
|
||||
static constexpr bool UseSmoothQuant = Traits::UseSmoothQuant;
|
||||
static constexpr bool PadHiddenSize = Traits::PadHiddenSize;
|
||||
static constexpr bool PadIntermediateSize = Traits::PadIntermediateSize;
|
||||
static constexpr bool IsGateOnly = Traits::IsGateOnly;
|
||||
static constexpr bool UseSmoothQuant = Traits::UseSmoothQuant;
|
||||
static constexpr bool PadHiddenSize = Traits::PadHiddenSize;
|
||||
static constexpr bool PadIntermediateSize = Traits::PadIntermediateSize;
|
||||
|
||||
// clang-format off
|
||||
template <typename T> struct t2s;
|
||||
@@ -173,10 +174,10 @@ struct FusedMoeGemmKernel
|
||||
const void* sorted_expert_ids_ptr;
|
||||
const void* num_sorted_tiles_ptr;
|
||||
|
||||
index_t hidden_size; // k
|
||||
index_t hidden_size; // k
|
||||
index_t intermediate_size; // n (TP slice this)
|
||||
index_t num_tokens; // input number of tokens for current iteration
|
||||
index_t num_experts; // number of groups
|
||||
index_t num_tokens; // input number of tokens for current iteration
|
||||
index_t num_experts; // number of groups
|
||||
// index_t top_k; // need this?
|
||||
|
||||
index_t stride_token; // for input/output, stride for each row, should >= hidden_size
|
||||
@@ -214,7 +215,7 @@ struct FusedMoeGemmKernel
|
||||
|
||||
index_t nr_0 = kargs.intermediate_size / Pipeline::Block_Nr0;
|
||||
index_t kr_0 = kargs.hidden_size / Pipeline::Block_Kr0;
|
||||
index_t nr_1 = kargs.hidden_size / Pipeline::Block_Nr1; // should be same as kr_0
|
||||
index_t nr_1 = kargs.hidden_size / Pipeline::Block_Nr1; // should be same as kr_0
|
||||
index_t kr_1 = kargs.intermediate_size / Pipeline::Block_Kr1; // should be same as nr_0
|
||||
|
||||
index_t expert_stride_0 = kargs.intermediate_size * hidden_radio_0 * kargs.hidden_size;
|
||||
@@ -280,11 +281,12 @@ struct FusedMoeGemmKernel
|
||||
make_tuple(kr_0 * BlockShape::Block_W0, number<Pipeline::Block_W0>{}, 1),
|
||||
number<Pipeline::kAlignmentG>{},
|
||||
number<1>{});
|
||||
const auto g_view_1_ = pad_tensor_view(g_view_,
|
||||
make_tuple(number<Pipeline::Block_Nr0>{},
|
||||
number<Pipeline::Block_Kr0>{},
|
||||
number<Pipeline::Block_W0>{}),
|
||||
sequence<PadIntermediateSize, PadHiddenSize, 0>{});
|
||||
const auto g_view_1_ =
|
||||
pad_tensor_view(g_view_,
|
||||
make_tuple(number<Pipeline::Block_Nr0>{},
|
||||
number<Pipeline::Block_Kr0>{},
|
||||
number<Pipeline::Block_W0>{}),
|
||||
sequence<PadIntermediateSize, PadHiddenSize, 0>{});
|
||||
|
||||
const auto g_window_ = make_tile_window(g_view_1_,
|
||||
make_tuple(number<BlockShape::Block_Nr0>{},
|
||||
@@ -308,11 +310,12 @@ struct FusedMoeGemmKernel
|
||||
make_tuple(kr_1 * Pipeline::Block_W1, Pipeline::Block_W1, 1),
|
||||
number<Pipeline::kAlignmentD>{},
|
||||
number<1>{});
|
||||
const auto d_view_1_ = pad_tensor_view(d_view_,
|
||||
make_tuple(number<Pipeline::kBlockNr_1>{},
|
||||
number<Pipeline::kBlockKr_1>{},
|
||||
number<Pipeline::Block_W1>{}),
|
||||
sequence<PadHiddenSize, PadIntermediateSize, 0>{});
|
||||
const auto d_view_1_ =
|
||||
pad_tensor_view(d_view_,
|
||||
make_tuple(number<Pipeline::kBlockNr_1>{},
|
||||
number<Pipeline::kBlockKr_1>{},
|
||||
number<Pipeline::Block_W1>{}),
|
||||
sequence<PadHiddenSize, PadIntermediateSize, 0>{});
|
||||
|
||||
const auto d_window_ = make_tile_window(d_view_1_,
|
||||
make_tuple(number<Pipeline::kBlockNr_1>{},
|
||||
|
||||
@@ -44,10 +44,10 @@ struct FusedMoeGemmPipeline_Flatmm
|
||||
|
||||
using Traits = typename Pipeline::Problem::Traits;
|
||||
|
||||
static constexpr bool IsGateOnly = Traits::IsGateOnly;
|
||||
static constexpr bool UseSmoothQuant = Traits::UseSmoothQuant;
|
||||
static constexpr bool PadHiddenSize = Traits::PadHiddenSize;
|
||||
static constexpr bool PadIntermediateSize = Traits::PadIntermediateSize;
|
||||
static constexpr bool IsGateOnly = Traits::IsGateOnly;
|
||||
static constexpr bool UseSmoothQuant = Traits::UseSmoothQuant;
|
||||
static constexpr bool PadHiddenSize = Traits::PadHiddenSize;
|
||||
static constexpr bool PadIntermediateSize = Traits::PadIntermediateSize;
|
||||
|
||||
static constexpr index_t kAlignmentA = Policy::GetAlignment_A<Problem>();
|
||||
static constexpr index_t kAlignmentG = Policy::GetAlignment_G<Problem>();
|
||||
@@ -133,11 +133,12 @@ struct FusedMoeGemmPipeline_Flatmm
|
||||
make_tuple(kr_0 * BlockShape::Block_W0, number<BlockShape::Block_W0>{}, 1),
|
||||
number<kAlignmentG>{},
|
||||
number<1>{});
|
||||
const auto u_view_1_ = pad_tensor_view(u_view_,
|
||||
make_tuple(number<BlockShape::Block_Nr0>{},
|
||||
number<BlockShape::Block_Kr0>{},
|
||||
number<BlockShape::Block_W0>{}),
|
||||
sequence<PadIntermediateSize, PadHiddenSize, 0>{});
|
||||
const auto u_view_1_ =
|
||||
pad_tensor_view(u_view_,
|
||||
make_tuple(number<BlockShape::Block_Nr0>{},
|
||||
number<BlockShape::Block_Kr0>{},
|
||||
number<BlockShape::Block_W0>{}),
|
||||
sequence<PadIntermediateSize, PadHiddenSize, 0>{});
|
||||
return u_view_1_;
|
||||
}
|
||||
}();
|
||||
|
||||
@@ -225,7 +225,8 @@ struct FusedMoeGemmPipelineFlatmmPolicy
|
||||
template <typename Problem>
|
||||
CK_TILE_HOST_DEVICE static constexpr auto GetMatrixCoreSwizzledBlockTIle_0()
|
||||
{
|
||||
if constexpr(Problem::Traits::PermuteEnum == FusedMoeGemmWeightPermuteEnum::b_nr_kr_waveflatten)
|
||||
if constexpr(Problem::Traits::PermuteEnum ==
|
||||
FusedMoeGemmWeightPermuteEnum::b_nr_kr_waveflatten)
|
||||
{
|
||||
using WarpGemm = GetWarpGemm0<Problem>{}; // assume warpgemm0/1 are the same
|
||||
constexpr index_t NPerBlock = Problem::BlockShape::Block_N0;
|
||||
@@ -703,7 +704,8 @@ struct FusedMoeGemmPipelineFlatmmPolicy
|
||||
template <typename Problem>
|
||||
CK_TILE_HOST_DEVICE static constexpr auto GetMatrixCoreSwizzledBlockTIle_0()
|
||||
{
|
||||
if constexpr(Problem::Traits::PermuteEnum == FusedMoeGemmWeightPermuteEnum::b_nr_kr_waveflatten)
|
||||
if constexpr(Problem::Traits::PermuteEnum ==
|
||||
FusedMoeGemmWeightPermuteEnum::b_nr_kr_waveflatten)
|
||||
{
|
||||
using WarpGemm = GetWarpGemm0<Problem>{}; // assume warpgemm0/1 are the same
|
||||
constexpr index_t NPerBlock = Problem::BlockShape::Block_N0;
|
||||
@@ -723,7 +725,8 @@ struct FusedMoeGemmPipelineFlatmmPolicy
|
||||
template <typename Problem>
|
||||
CK_TILE_HOST_DEVICE static constexpr auto GetMatrixCoreSwizzledBlockTIle_1()
|
||||
{
|
||||
if constexpr(Problem::Traits::PermuteEnum == FusedMoeGemmWeightPermuteEnum::b_nr_kr_waveflatten)
|
||||
if constexpr(Problem::Traits::PermuteEnum ==
|
||||
FusedMoeGemmWeightPermuteEnum::b_nr_kr_waveflatten)
|
||||
{
|
||||
using WarpGemm = GetWarpGemm1<Problem>{}; // assume warpgemm0/1 are the same
|
||||
constexpr index_t NPerBlock = Problem::BlockShape::kBlockN_1;
|
||||
|
||||
@@ -14,8 +14,8 @@ template <typename ADataType_,
|
||||
typename AccDataType_,
|
||||
typename ODataType_,
|
||||
typename AScaleDataType_,
|
||||
typename W0ScaleDataType_,
|
||||
typename W1ScaleDataType_,
|
||||
typename GScaleDataType_,
|
||||
typename DScaleDataType_,
|
||||
typename YSmoothScaleDataType_,
|
||||
typename TopkWeightDataType_,
|
||||
typename IndexDataType_, // data type for all indexing
|
||||
|
||||
@@ -19,14 +19,18 @@ enum class FusedMoeGemmWeightPermuteEnum
|
||||
template <bool IsGateOnly_,
|
||||
bool UseSmoothQuant_,
|
||||
index_t OAtomic_, // 0-no atomic, 1-atomic-pk-f16/bf16, 2-atomic-f32
|
||||
FusedMoeGemmWeightPermuteEnum PermuteEnum_ = FusedMoeGemmWeightPermuteEnum::b_nr_kr_waveflatten;
|
||||
bool PadHiddenSize_ = false, bool PadIntermediateSize_ = false > struct FusedMoeGemmTraits
|
||||
FusedMoeGemmWeightPermuteEnum PermuteEnum_ =
|
||||
FusedMoeGemmWeightPermuteEnum::b_nr_kr_waveflatten,
|
||||
bool PadHiddenSize_ = false,
|
||||
bool PadIntermediateSize_ = false>
|
||||
struct FusedMoeGemmTraits
|
||||
{
|
||||
// Gate+Up or Gate only
|
||||
static constexpr bool IsGateOnly = IsGateOnly_;
|
||||
static constexpr bool UseSmoothQuant = UseSmoothQuant_;
|
||||
static constexpr index_t OAtomic = OAtomic_;
|
||||
static constexpr bool PadHiddenSize = PadHiddenSize_;
|
||||
static constexpr bool PadIntermediateSize = PadIntermediateSize_;
|
||||
static constexpr bool IsGateOnly = IsGateOnly_;
|
||||
static constexpr bool UseSmoothQuant = UseSmoothQuant_;
|
||||
static constexpr index_t OAtomic = OAtomic_;
|
||||
static constexpr FusedMoeGemmWeightPermuteEnum PermuteEnum = PermuteEnum_;
|
||||
static constexpr bool PadHiddenSize = PadHiddenSize_;
|
||||
static constexpr bool PadIntermediateSize = PadIntermediateSize_;
|
||||
};
|
||||
} // namespace ck_tile
|
||||
|
||||
Reference in New Issue
Block a user