@@ -68,6 +68,24 @@ enum class KernelInputTransformType {
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace kernel::detail {
|
||||
|
||||
// Has_SwapAB<T>::value will be true only if:
|
||||
// class T has member SwapAB and T::SwapAB is true
|
||||
template <typename T, typename = void>
|
||||
struct Has_SwapAB { static constexpr bool value = false; };
|
||||
|
||||
template <typename T>
|
||||
struct Has_SwapAB <T, CUTE_STL_NAMESPACE::void_t<decltype(T::SwapAB)>>
|
||||
{ static constexpr bool value = T::SwapAB; };
|
||||
|
||||
template <typename T>
|
||||
static constexpr bool Has_SwapAB_v = Has_SwapAB<T>::value;
|
||||
|
||||
} // namespace kernel::detail
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//
|
||||
// Kernel schedule policies (the base class tags, one for each kernel layer file)
|
||||
//
|
||||
@@ -137,12 +155,15 @@ struct MainloopSm80CpAsyncUnpredicated {
|
||||
};
|
||||
|
||||
// n-buffer in smem (cp.async), pipelined with registers, with predicated gmem loads
|
||||
template<int Stages_>
|
||||
template<
|
||||
int Stages_,
|
||||
class ClusterShape_ = Shape<_1,_1,_1>
|
||||
>
|
||||
struct MainloopSm80CpAsync {
|
||||
constexpr static int Stages = Stages_;
|
||||
using ArchTag = arch::Sm80;
|
||||
using ArchTag = cute::conditional_t<(size(ClusterShape_{}) > 1), arch::Sm90, arch::Sm80>;
|
||||
using Schedule = KernelMultistage;
|
||||
using ClusterShape = Shape<_1,_1,_1>;
|
||||
using ClusterShape = ClusterShape_;
|
||||
};
|
||||
|
||||
// n-buffer in smem (cp.async), pipelined with Hopper GMMA, with predicated gmem loads, warp specialized dynamic schedule
|
||||
|
||||
Reference in New Issue
Block a user