#pragma once #include #include "ck/utility/data_type.hpp" #include "ck/utility/sequence.hpp" #include "ck/utility/tuple.hpp" #include "ck/ck.hpp" enum class ImplementationDescriptorVersion { V1 }; enum class GemmPipelineVersion { Naive, ComputeFriendly, MemFriendly, ComputeFriendlyDoubleLDS, ComputeFriendlyDoubleGlobalPrefetch }; enum class GemmPipelineScheduler { Intrawave, Interwave }; enum class ConvolutionSpecialization { Default, Filter1x1Pad0, Filter1x1Stride1Pad0, Filter3x3 }; enum class MFMAInstructionSize { M16N16, M32N32 }; template concept ImplementationDescriptorV1 = requires { {T::ImplementationDescriptorVersion_} -> std::convertible_to; {T::ConvolutionSpecialization_} -> std::convertible_to; {T::GemmPipelineVersion_} -> std::convertible_to; {T::GemmPipelineScheduler_} -> std::convertible_to; {T::BlockSize_} -> std::convertible_to; {T::TileSizes_} -> std::convertible_to>; {T::K1_} -> std::convertible_to; {T::MFMAInstructionSize_} -> std::convertible_to; {T::XdlPerWave_} -> std::convertible_to>; {T::GlobalTransferVectorSize_} -> std::convertible_to>; {T::LDSStoreVectorSize_} -> std::convertible_to>; } && (T::ImplementationDescriptorVersion_ == ImplementationDescriptorVersion::V1); struct ImplementationDefaultV1 { static constexpr ImplementationDescriptorVersion ImplementationDescriptorVersion_ = ImplementationDescriptorVersion::V1; static constexpr ConvolutionSpecialization ConvolutionSpecialization_ = ConvolutionSpecialization::Default; static constexpr GemmPipelineVersion GemmPipelineVersion_ = GemmPipelineVersion::Naive; static constexpr GemmPipelineScheduler GemmPipelineScheduler_ = GemmPipelineScheduler::Intrawave; };