Collection of changes to fix clang build. (#1200)
* Remove unused variables * Qualify calls to make_fragment_? from templated base class. Fixes clang build error. * Add missing `#include <cstdio>` * Various changes to fix clang compile errors. * More changes to fix clang build. Remaining issues: - `params` initializer of `CollectiveEpilogue`. - `ops` initializer of `Sm90VisitorImplBase`. - `__usAtomicCAS` needs to be added to clang upstream. * Fix remaining clang build issues. * Qualify `cute::rank()` calls. * Qualify some more calls that are otherwise ambiguous between `cute` and `std` namespace. * Double-escape special registers in inline asm. * small change --------- Co-authored-by: Haicheng Wu <haichengw@nvidia.com>
This commit is contained in:
co-authored by
Haicheng Wu
parent
f4a0216601
commit
e1483d5fa0
@@ -186,15 +186,15 @@ main(int argc, char const* argv[]) {
|
||||
using ElementEpilogue = float;
|
||||
|
||||
// The following constexpr values set the max number of modes in each MNKL mode
|
||||
constexpr int MaxRank_M = rank(RowModeStridesA{}); // Max row modes
|
||||
constexpr int MaxRank_N = rank(ColModeStridesB{}); // Max column modes
|
||||
constexpr int MaxRank_K = rank(RedModeStridesA{}); // Max contraction modes
|
||||
constexpr int MaxRank_L = rank(BatModeStridesA{}); // Max batch modes
|
||||
static_assert(rank(RowModeStridesA{}) == rank(RowModeStridesC{}));
|
||||
static_assert(rank(ColModeStridesB{}) == rank(RowModeStridesC{}));
|
||||
static_assert(rank(RedModeStridesA{}) == rank(RedModeStridesB{}));
|
||||
static_assert(rank(BatModeStridesA{}) == rank(BatModeStridesC{}));
|
||||
static_assert(rank(BatModeStridesB{}) == rank(BatModeStridesC{}));
|
||||
constexpr int MaxRank_M = cute::rank(RowModeStridesA{}); // Max row modes
|
||||
constexpr int MaxRank_N = cute::rank(ColModeStridesB{}); // Max column modes
|
||||
constexpr int MaxRank_K = cute::rank(RedModeStridesA{}); // Max contraction modes
|
||||
constexpr int MaxRank_L = cute::rank(BatModeStridesA{}); // Max batch modes
|
||||
static_assert(cute::rank(RowModeStridesA{}) == cute::rank(RowModeStridesC{}));
|
||||
static_assert(cute::rank(ColModeStridesB{}) == cute::rank(RowModeStridesC{}));
|
||||
static_assert(cute::rank(RedModeStridesA{}) == cute::rank(RedModeStridesB{}));
|
||||
static_assert(cute::rank(BatModeStridesA{}) == cute::rank(BatModeStridesC{}));
|
||||
static_assert(cute::rank(BatModeStridesB{}) == cute::rank(BatModeStridesC{}));
|
||||
|
||||
// Parse command line to get modes, extents, and strides
|
||||
cutlass::GettCommandLine cmd;
|
||||
|
||||
@@ -58,7 +58,7 @@ public:
|
||||
// Type Aliases
|
||||
//
|
||||
using ProblemShape = ProblemShape_;
|
||||
static_assert(rank(ProblemShape{}) == 3 or rank(ProblemShape{}) == 4,
|
||||
static_assert(cute::rank(ProblemShape{}) == 3 or cute::rank(ProblemShape{}) == 4,
|
||||
"ProblemShape{} should be <M,N,K> or <M,N,K,L>");
|
||||
|
||||
// Mainloop derived types
|
||||
@@ -180,7 +180,7 @@ public:
|
||||
bool
|
||||
can_implement(Arguments const& args) {
|
||||
bool implementable = (args.mode == GemmUniversalMode::kGemm) or
|
||||
(args.mode == GemmUniversalMode::kBatched && rank(ProblemShape{}) == 4);
|
||||
(args.mode == GemmUniversalMode::kBatched && cute::rank(ProblemShape{}) == 4);
|
||||
if (!implementable) {
|
||||
CUTLASS_TRACE_HOST(" CAN IMPLEMENT: Arguments or Problem Shape don't meet the requirements.\n");
|
||||
return implementable;
|
||||
@@ -288,10 +288,10 @@ public:
|
||||
PipelineState epi_store_pipe_producer_state = cutlass::make_producer_start_state<EpiStorePipeline>();
|
||||
|
||||
// Preconditions
|
||||
static_assert(rank(StrideA{}) == 3, "StrideA must be rank-3: [M, K, L]. If batch mode is not needed, set L stride to Int<0>.");
|
||||
static_assert(rank(StrideB{}) == 3, "StrideB must be rank-3: [N, K, L]. If batch mode is not needed, set L stride to Int<0>.");
|
||||
static_assert(rank(StrideC{}) == 3, "StrideC must be rank-3: [M, N, L]. If batch mode is not needed, set L stride to Int<0>.");
|
||||
static_assert(rank(StrideD{}) == 3, "StrideD must be rank-3: [M, N, L]. If batch mode is not needed, set L stride to Int<0>.");
|
||||
static_assert(cute::rank(StrideA{}) == 3, "StrideA must be rank-3: [M, K, L]. If batch mode is not needed, set L stride to Int<0>.");
|
||||
static_assert(cute::rank(StrideB{}) == 3, "StrideB must be rank-3: [N, K, L]. If batch mode is not needed, set L stride to Int<0>.");
|
||||
static_assert(cute::rank(StrideC{}) == 3, "StrideC must be rank-3: [M, N, L]. If batch mode is not needed, set L stride to Int<0>.");
|
||||
static_assert(cute::rank(StrideD{}) == 3, "StrideD must be rank-3: [M, N, L]. If batch mode is not needed, set L stride to Int<0>.");
|
||||
|
||||
// Separate out problem shape for convenience
|
||||
// Optionally append 1s until problem shape is rank-4 in case its is only rank-3 (MNK)
|
||||
|
||||
@@ -86,8 +86,8 @@ public:
|
||||
static const int kOutputAlignment = ThreadEpilogueOp::kCount;
|
||||
using AlignmentType = typename cute::uint_bit<sizeof_bits<ElementOutput>::value * kOutputAlignment>::type;
|
||||
|
||||
static_assert(rank(StrideC{}) == 3, "StrideCD must be rank-3: [M, N, L]");
|
||||
static_assert(rank(StrideD{}) == 3, "StrideCD must be rank-3: [M, N, L]");
|
||||
static_assert(cute::rank(StrideC{}) == 3, "StrideCD must be rank-3: [M, N, L]");
|
||||
static_assert(cute::rank(StrideD{}) == 3, "StrideCD must be rank-3: [M, N, L]");
|
||||
|
||||
struct SharedStorage { };
|
||||
|
||||
@@ -151,10 +151,10 @@ public:
|
||||
using namespace cute;
|
||||
using X = Underscore;
|
||||
|
||||
static_assert(rank(ProblemShapeMNKL{}) == 4, "ProblemShapeMNKL must be rank 4");
|
||||
static_assert(cute::rank(ProblemShapeMNKL{}) == 4, "ProblemShapeMNKL must be rank 4");
|
||||
static_assert(is_static<BlockShapeMNK>::value, "ThreadBlock tile shape must be static");
|
||||
static_assert(rank(BlockShapeMNK{}) == 3, "BlockShapeMNK must be rank 3");
|
||||
static_assert(rank(BlockCoordMNKL{}) == 4, "BlockCoordMNKL must be rank 3");
|
||||
static_assert(cute::rank(BlockShapeMNK{}) == 3, "BlockShapeMNK must be rank 3");
|
||||
static_assert(cute::rank(BlockCoordMNKL{}) == 4, "BlockCoordMNKL must be rank 3");
|
||||
|
||||
(void) smem_buf;
|
||||
ThreadEpilogueOp epilogue_op{params.thread_params};
|
||||
|
||||
@@ -197,14 +197,14 @@ template<class ... Shapes>
|
||||
auto
|
||||
select_mode_shape(Shapes const & ... shapes) {
|
||||
auto permuted_shapes = filter_tuple(cute::make_tuple(shapes...), [](auto shape) {
|
||||
if constexpr (rank(shape) > 1) {
|
||||
if constexpr (cute::rank(shape) > 1) {
|
||||
return cute::make_tuple(shape);
|
||||
}
|
||||
else {
|
||||
return cute::make_tuple();
|
||||
}
|
||||
});
|
||||
if constexpr (rank(permuted_shapes) == 0) {
|
||||
if constexpr (cute::rank(permuted_shapes) == 0) {
|
||||
return get<0>(cute::make_tuple(shapes...));
|
||||
}
|
||||
else {
|
||||
@@ -251,7 +251,7 @@ auto
|
||||
select_tile_shape(TileSize size, Shape const& shape)
|
||||
{
|
||||
static_assert(is_static<TileSize>::value, "Tile size must be static");
|
||||
if constexpr (rank(Shape{}) == 0) {
|
||||
if constexpr (cute::rank(Shape{}) == 0) {
|
||||
return cute::make_tuple(size);
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -78,7 +78,7 @@ reshape(Shape const& shape, TargetShape const& target_shape)
|
||||
template<class Permute, bool Transpose, class Shape, class Stride>
|
||||
constexpr auto
|
||||
make_permute_layout(Layout<Shape,Stride> const& layout) {
|
||||
static_assert(rank(Shape{}) == 3, "Only rank-3 layouts are supported");
|
||||
static_assert(cute::rank(Shape{}) == 3, "Only rank-3 layouts are supported");
|
||||
if constexpr (Transpose) {
|
||||
// Deal with tensor B by transposing appropriately before and after computing the permute layout.
|
||||
// Its CuTe-canonical mode order is [N,K,L], while permute operations expect [row,col,batch].
|
||||
@@ -135,7 +135,7 @@ using inverse_t = decltype(inverse(T{}));
|
||||
template<class Permute, bool Transpose, class Shape, class Stride>
|
||||
constexpr auto
|
||||
make_original_layout(Layout<Shape,Stride> const& layout) {
|
||||
static_assert(rank(Shape{}) == 3, "Only rank-3 layouts are supported");
|
||||
static_assert(cute::rank(Shape{}) == 3, "Only rank-3 layouts are supported");
|
||||
if constexpr (Transpose) {
|
||||
// Deal with tensor B by transposing appropriately before and after computing the permute layout.
|
||||
// Its CuTe-canonical mode order is [N,K,L], while permute operations expect [row,col,batch].
|
||||
|
||||
Reference in New Issue
Block a user