blob: 80f631139132fe533354cff617a72ed15c391926 [file]
// Copyright 2024 The IREE Authors
//
// Licensed under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#ifndef IREE_COMPILER_CODEGEN_DIALECT_GPU_IREEGPUENUMS
#define IREE_COMPILER_CODEGEN_DIALECT_GPU_IREEGPUENUMS
include "iree/compiler/Codegen/Dialect/GPU/IR/IREEGPUDialect.td"
include "mlir/IR/EnumAttr.td"
//===----------------------------------------------------------------------===//
// GPU Workgroup Processor (WGP) Level Feature/Limit Enums
//===----------------------------------------------------------------------===//
//===----------------------------------------------------------------------===//
// Compute
// IEEE 754 double precision floating point format in computation
def IREEGPU_CFBW_64 : I32BitEnumAttrCaseBit<"FP64", 0, "fp64">;
// IEEE 754 single precision floating point format in computation
def IREEGPU_CFBW_32 : I32BitEnumAttrCaseBit<"FP32", 1, "fp32">;
// IEEE 754 half precision floating point format in computation
def IREEGPU_CFBW_16 : I32BitEnumAttrCaseBit<"FP16", 2, "fp16">;
// Signed/unsigned 64-bit integer format in computation
def IREEGPU_CIBW_64 : I32BitEnumAttrCaseBit<"Int64", 3, "int64">;
// Signed/unsigned 32-bit integer format in computation
def IREEGPU_CIBW_32 : I32BitEnumAttrCaseBit<"Int32", 4, "int32">;
// Signed/unsigned 16-bit integer format in computation
def IREEGPU_CIBW_16 : I32BitEnumAttrCaseBit<"Int16", 5, "int16">;
// Signed/unsigned 8-bit integer format in computation
def IREEGPU_CIBW_8 : I32BitEnumAttrCaseBit<"Int8", 6, "int8">;
// Generic 8-bit floating point format in computation
def IREEGPU_CFBW_8 : I32BitEnumAttrCaseBit<"FP8", 7, "fp8">;
// Generic 6-bit floating point format in computation
def IREEGPU_CFBW_6 : I32BitEnumAttrCaseBit<"FP6", 8, "fp6">;
// Generic 4-bit floating point format in computation
def IREEGPU_CFBW_4 : I32BitEnumAttrCaseBit<"FP4", 9, "fp4">;
def IREEGPU_ComputeBitwidths : I32BitEnumAttr<
"ComputeBitwidths", "Supported bitwidths for compute",
[IREEGPU_CFBW_64, IREEGPU_CFBW_32, IREEGPU_CFBW_16,
IREEGPU_CIBW_64, IREEGPU_CIBW_32, IREEGPU_CIBW_16,
IREEGPU_CIBW_8, IREEGPU_CFBW_8, IREEGPU_CFBW_6,
IREEGPU_CFBW_4]> {
let cppNamespace = "::mlir::iree_compiler::IREE::GPU";
let genSpecializedAttr = 0;
}
//===----------------------------------------------------------------------===//
// Storage
// Direct 64-bit value access from/to memory storage
def IREEGPU_SBW_64 : I32BitEnumAttrCaseBit<"B64", 0, "b64">;
// Direct 32-bit value access from/to memory storage
def IREEGPU_SBW_32 : I32BitEnumAttrCaseBit<"B32", 1, "b32">;
// Direct 16-bit value access from/to memory storage
def IREEGPU_SBW_16 : I32BitEnumAttrCaseBit<"B16", 2, "b16">;
// Direct 8-bit value access from/to memory storage
def IREEGPU_SBW_8 : I32BitEnumAttrCaseBit<"B8", 3, "b8">;
def IREEGPU_StorageBitwidths : I32BitEnumAttr<
"StorageBitwidths", "Supported bitwidths for storage",
[IREEGPU_SBW_64, IREEGPU_SBW_32, IREEGPU_SBW_16, IREEGPU_SBW_8]> {
let cppNamespace = "::mlir::iree_compiler::IREE::GPU";
let genSpecializedAttr = 0;
}
//===----------------------------------------------------------------------===//
// Subgroup operations
def IREEGPU_SO_None : I32BitEnumAttrCaseNone<"None", "none">;
// Subgroup shuffle index/xor operation
def IREEGPU_SO_Shuffle : I32BitEnumAttrCaseBit<"Shuffle", 0, "shuffle">;
// Subgroup arithmetic add/mul/min/max/and/or/xor reduction operation
def IREEGPU_SO_Arithmetic : I32BitEnumAttrCaseBit<"Arithmetic", 1, "arithmetic">;
def IREEGPU_SubgroupOps : I32BitEnumAttr<
"SubgroupOps", "Supported subgroup ops",
[IREEGPU_SO_None, IREEGPU_SO_Shuffle, IREEGPU_SO_Arithmetic]> {
let cppNamespace = "::mlir::iree_compiler::IREE::GPU";
let genSpecializedAttr = 0;
}
//===----------------------------------------------------------------------===//
// Dot product operations
def IREEGPU_DPO_None : I32BitEnumAttrCaseNone<"None", "none">;
// Dot product 4xi8 -> i32 operation
def IREEGPU_DPO_4xI8ToI32 : I32BitEnumAttrCaseBit<"DP4xI8ToI32", 0, "dp4xi8toi32">;
def IREEGPU_DotProductOps : I32BitEnumAttr<
"DotProductOps", "Supported dot product ops",
[IREEGPU_DPO_None, IREEGPU_DPO_4xI8ToI32]> {
let cppNamespace = "::mlir::iree_compiler::IREE::GPU";
let genSpecializedAttr = 0;
}
//===----------------------------------------------------------------------===//
// MMA intrinsic
class IREEGPU_I32EnumAttr<string name, string summary, list<I32EnumAttrCase> cases>
: I32EnumAttr<name, summary, cases> {
let cppNamespace = "::mlir::iree_compiler::IREE::GPU";
let genSpecializedAttr = 0;
}
class IREEGPU_I32Enum<string name, string summary, list<EnumCase> cases>
: I32Enum<name, summary, cases> {
let cppNamespace = "::mlir::iree_compiler::IREE::GPU";
}
// These enum values are loosely named to match the target intrinsics that they
// lower to, with wiggle room. The general name format used here is, similar to
// typical target intrinsics:
// <kind>_<elem-type-C>_<M>x<N>x<K>_<elem-type-A>[_<elem-type-B>]
//
// Deviations from target intrinsic naming include:
// * The same enum values are reused when the same intrinsic exists in different
// architecture versions with slightly different target intrinsic name. For
// instance, our MFMA_F32_16x16x4_F32 lowers to:
// - v_mfma_f32_16x16x4f32 on CDNA1/CDNA2.
// - v_mfma_f32_16x16x4_f32 on CDNA3.
// * Each enum value corresponds to one fully type-specialized intrinsic, in
// contrast to target intrinsics which are sometimes type-generic. For
// instance, on RDNA3, our WMMAR3_I32_16x16x16_I8 lowers to
// v_wmma_i32_16x16x16_iu8 specialized for signed int8 operands.
// * Since RDNA3 and RDNA4 have mutually-incompatible WMMA instructions that
// share a name, we use WMMAR3 and WMMAR4as their prefixes.
// * Each enum value uses IREE-style naming of element type. For example,
// our MFMA_F32_16x16x32_F8E5M2FNUZ_F8E4M3FNUZ lowers to
// v_mfma_f32_16x16x32_bf8_fp8.
//
// Values: 0xABCD where:
// * A = vendor:
// * 1 = AMD
// * 2 = NVIDIA
// * B = architecture. When an intrinsic exists in multiple architectures, this
// should be the architecture it was introduced in, as long as it still
// has the same semantics. If a new architecture breaks an existing
// intrinsic's semantics, we can use that field for versioning.
// * For AMD:
// * 0 = CDNA1
// * 1 = CDNA2
// * 2 = CDNA3
// * 3 = CDNA4
// * 8 = RDNA3
// * 9 = RDNA4
// * A = gfx1250
// * C = element type of A-matrix:
// * 0 = 64-bit float (e.g. IEEE754 double precision)
// * 1 = 32-bit float (e.g. IEEE754 single precision, and "xf32" fast variants)
// * 2 = 16-bit float (incl. IREE754 half and bf16)
// * 3 = 8-bit float (incl. f8E5M2, f8E4M3FN and "FNUZ" variants)
// * C = 8-bit integer (any signedness)
// * D enumerates intrinsics that share the same 0xABC* bits.
//
// Introduced in CDNA1.
def MFMA_F32_16x16x4_F32 : I32EnumAttrCase<"MFMA_F32_16x16x4_F32", 0x1010>;
def MFMA_F32_16x16x16_F16 : I32EnumAttrCase<"MFMA_F32_16x16x16_F16", 0x1020>;
def MFMA_F32_32x32x8_F16 : I32EnumAttrCase<"MFMA_F32_32x32x8_F16", 0x1021>;
def MFMA_I32_16x16x16_I8 : I32EnumAttrCase<"MFMA_I32_16x16x16_I8", 0x10C0>;
def MFMA_I32_32x32x8_I8 : I32EnumAttrCase<"MFMA_I32_32x32x8_I8", 0x10C1>;
// Introduced in CDNA2.
def MFMA_F32_16x16x8_BF16 : I32EnumAttrCase<"MFMA_F32_16x16x8_BF16", 0x1120>;
def MFMA_F32_32x32x4_BF16 : I32EnumAttrCase<"MFMA_F32_32x32x4_BF16", 0x1121>;
def MFMA_F64_16x16x4_F64 : I32EnumAttrCase<"MFMA_F64_16x16x4_F64", 0x1100>;
// Introduced in CDNA3.
def MFMA_F32_16x16x16_BF16 : I32EnumAttrCase<"MFMA_F32_16x16x16_BF16", 0x1220>;
def MFMA_F32_32x32x8_BF16 : I32EnumAttrCase<"MFMA_F32_32x32x8_BF16", 0x1221>;
def MFMA_F32_16x16x32_F8E5M2FNUZ : I32EnumAttrCase<"MFMA_F32_16x16x32_F8E5M2FNUZ", 0x1230>;
def MFMA_F32_16x16x32_F8E5M2FNUZ_F8E4M3FNUZ : I32EnumAttrCase<"MFMA_F32_16x16x32_F8E5M2FNUZ_F8E4M3FNUZ", 0x1231>;
def MFMA_F32_16x16x32_F8E4M3FNUZ : I32EnumAttrCase<"MFMA_F32_16x16x32_F8E4M3FNUZ", 0x1232>;
def MFMA_F32_16x16x32_F8E4M3FNUZ_F8E5M2FNUZ : I32EnumAttrCase<"MFMA_F32_16x16x32_F8E4M3FNUZ_F8E5M2FNUZ", 0x1233>;
def MFMA_F32_32x32x16_F8E5M2FNUZ : I32EnumAttrCase<"MFMA_F32_32x32x16_F8E5M2FNUZ", 0x1234>;
def MFMA_F32_32x32x16_F8E5M2FNUZ_F8E4M3FNUZ : I32EnumAttrCase<"MFMA_F32_32x32x16_F8E5M2FNUZ_F8E4M3FNUZ", 0x1235>;
def MFMA_F32_32x32x16_F8E4M3FNUZ : I32EnumAttrCase<"MFMA_F32_32x32x16_F8E4M3FNUZ", 0x1236>;
def MFMA_F32_32x32x16_F8E4M3FNUZ_F8E5M2FNUZ : I32EnumAttrCase<"MFMA_F32_32x32x16_F8E4M3FNUZ_F8E5M2FNUZ", 0x1237>;
def MFMA_I32_16x16x32_I8 : I32EnumAttrCase<"MFMA_I32_16x16x32_I8", 0x12C0>;
def MFMA_I32_32x32x16_I8 : I32EnumAttrCase<"MFMA_I32_32x32x16_I8", 0x12C1>;
// Block intrinsics
def MFMA_F32_4x4x4x16B_F16 : I32EnumAttrCase<"MFMA_F32_4x4x4x16B_F16", 0x1222>;
def MFMA_F32_16x16x4x4B_F16 : I32EnumAttrCase<"MFMA_F32_16x16x4x4B_F16", 0x1223>;
def MFMA_F32_32x32x4x2B_F16 : I32EnumAttrCase<"MFMA_F32_32x32x4x2B_F16", 0x1224>;
def MFMA_F32_4x4x4x16B_BF16 : I32EnumAttrCase<"MFMA_F32_4x4x4x16B_BF16", 0x1225>;
def MFMA_F32_16x16x4x4B_BF16 : I32EnumAttrCase<"MFMA_F32_16x16x4x4B_BF16", 0x1226>;
def MFMA_F32_32x32x4x2B_BF16 : I32EnumAttrCase<"MFMA_F32_32x32x4x2B_BF16", 0x1227>;
def MFMA_F32_4x4x1x16B_F32 : I32EnumAttrCase<"MFMA_F32_4x4x1x16B_F32", 0x1210>;
def MFMA_F32_16x16x1x4B_F32 : I32EnumAttrCase<"MFMA_F32_16x16x1x4B_F32", 0x1211>;
def MFMA_F32_32x32x1x2B_F32 : I32EnumAttrCase<"MFMA_F32_32x32x1x2B_F32", 0x1212>;
def MFMA_F64_4x4x4x4B_F64 : I32EnumAttrCase<"MFMA_F64_4x4x4x4B_F64", 0x1200>;
def MFMA_I32_4x4x4x16B_I8 : I32EnumAttrCase<"MFMA_I32_4x4x4x16B_I8", 0x12C2>;
def MFMA_I32_16x16x4x4B_I8 : I32EnumAttrCase<"MFMA_I32_16x16x4x4B_I8", 0x12C3>;
def MFMA_I32_32x32x4x2B_I8 : I32EnumAttrCase<"MFMA_I32_32x32x4x2B_I8", 0x12C4>;
// Introduced in CDNA4.
def MFMA_F32_16x16x32_F16 : I32EnumAttrCase<"MFMA_F32_16x16x32_F16", 0x1320>;
def MFMA_F32_32x32x16_F16 : I32EnumAttrCase<"MFMA_F32_32x32x16_F16", 0x1321>;
def MFMA_F32_16x16x32_BF16 : I32EnumAttrCase<"MFMA_F32_16x16x32_BF16", 0x1322>;
def MFMA_F32_32x32x16_BF16 : I32EnumAttrCase<"MFMA_F32_32x32x16_BF16", 0x1323>;
def MFMA_F32_16x16x32_F8E5M2 : I32EnumAttrCase<"MFMA_F32_16x16x32_F8E5M2", 0x1330>;
def MFMA_F32_16x16x32_F8E5M2_F8E4M3FN : I32EnumAttrCase<"MFMA_F32_16x16x32_F8E5M2_F8E4M3FN", 0x1331>;
def MFMA_F32_16x16x32_F8E4M3FN : I32EnumAttrCase<"MFMA_F32_16x16x32_F8E4M3FN", 0x1332>;
def MFMA_F32_16x16x32_F8E4M3FN_F8E5M2 : I32EnumAttrCase<"MFMA_F32_16x16x32_F8E4M3FN_F8E5M2", 0x1333>;
def MFMA_F32_32x32x16_F8E5M2 : I32EnumAttrCase<"MFMA_F32_32x32x16_F8E5M2", 0x1334>;
def MFMA_F32_32x32x16_F8E5M2_F8E4M3FN : I32EnumAttrCase<"MFMA_F32_32x32x16_F8E5M2_F8E4M3FN", 0x1335>;
def MFMA_F32_32x32x16_F8E4M3FN : I32EnumAttrCase<"MFMA_F32_32x32x16_F8E4M3FN", 0x1336>;
def MFMA_F32_32x32x16_F8E4M3FN_F8E5M2 : I32EnumAttrCase<"MFMA_F32_32x32x16_F8E4M3FN_F8E5M2", 0x1337>;
def MFMA_F32_16x16x128_F8E5M2 : I32EnumAttrCase<"MFMA_F32_16x16x128_F8E5M2", 0x1338>;
def MFMA_F32_16x16x128_F8E5M2_F8E4M3FN : I32EnumAttrCase<"MFMA_F32_16x16x128_F8E5M2_F8E4M3FN", 0x1339>;
def MFMA_F32_16x16x128_F8E4M3FN : I32EnumAttrCase<"MFMA_F32_16x16x128_F8E4M3FN", 0x133A>;
def MFMA_F32_16x16x128_F8E4M3FN_F8E5M2 : I32EnumAttrCase<"MFMA_F32_16x16x128_F8E4M3FN_F8E5M2", 0x133B>;
def MFMA_F32_32x32x64_F8E5M2 : I32EnumAttrCase<"MFMA_F32_32x32x64_F8E5M2", 0x133C>;
def MFMA_F32_32x32x64_F8E5M2_F8E4M3FN : I32EnumAttrCase<"MFMA_F32_32x32x64_F8E5M2_F8E4M3FN", 0x133D>;
def MFMA_F32_32x32x64_F8E4M3FN : I32EnumAttrCase<"MFMA_F32_32x32x64_F8E4M3FN", 0x133E>;
def MFMA_F32_32x32x64_F8E4M3FN_F8E5M2 : I32EnumAttrCase<"MFMA_F32_32x32x64_F8E4M3FN_F8E5M2", 0x133F>;
// TODO: add fp4, fp6, and their mixed-type variants.
def MFMA_I32_16x16x64_I8 : I32EnumAttrCase<"MFMA_I32_16x16x64_I8", 0x13C0>;
def MFMA_I32_32x32x32_I8 : I32EnumAttrCase<"MFMA_I32_32x32x32_I8", 0x13C1>;
// Introduced in RDNA3.
def WMMAR3_F32_16x16x16_F16 : I32EnumAttrCase<"WMMAR3_F32_16x16x16_F16", 0x1820>;
def WMMAR3_F16_16x16x16_F16 : I32EnumAttrCase<"WMMAR3_F16_16x16x16_F16", 0x1821>;
def WMMAR3_F32_16x16x16_BF16 : I32EnumAttrCase<"WMMAR3_F32_16x16x16_BF16", 0x1822>;
def WMMAR3_BF16_16x16x16_BF16 : I32EnumAttrCase<"WMMAR3_BF16_16x16x16_BF16", 0x1823>;
def WMMAR3_I32_16x16x16_I8 : I32EnumAttrCase<"WMMAR3_I32_16x16x16_I8", 0x18C0>;
// Introduced in RDNA4.
def WMMAR4_F32_16x16x16_F16 : I32EnumAttrCase<"WMMAR4_F32_16x16x16_F16", 0x1920>;
def WMMAR4_F16_16x16x16_F16 : I32EnumAttrCase<"WMMAR4_F16_16x16x16_F16", 0x1921>;
def WMMAR4_F32_16x16x16_BF16 : I32EnumAttrCase<"WMMAR4_F32_16x16x16_BF16", 0x1922>;
def WMMAR4_BF16_16x16x16_BF16 : I32EnumAttrCase<"WMMAR4_BF16_16x16x16_BF16", 0x1923>;
def WMMAR4_F32_16x16x16_F8E5M2 : I32EnumAttrCase<"WMMAR4_F32_16x16x16_F8E5M2", 0x1930>;
def WMMAR4_F32_16x16x16_F8E5M2_F8E4M3FN : I32EnumAttrCase<"WMMAR4_F32_16x16x16_F8E5M2_F8E4M3FN", 0x1931>;
def WMMAR4_F32_16x16x16_F8E4M3FN : I32EnumAttrCase<"WMMAR4_F32_16x16x16_F8E4M3FN", 0x1932>;
def WMMAR4_F32_16x16x16_F8E4M3FN_F8E5M2 : I32EnumAttrCase<"WMMAR4_F32_16x16x16_F8E4M3FN_F8E5M2", 0x1933>;
def WMMAR4_I32_16x16x16_I8 : I32EnumAttrCase<"WMMAR4_I32_16x16x16_I8", 0x19C0>;
// Introduced in gfx1250.
// K=4.
def WMMA_F32_16x16x4_F32 : I32EnumAttrCase<"WMMA_F32_16x16x4_F32", 0x1A10>;
// K=32.
def WMMA_F32_16x16x32_F16 : I32EnumAttrCase<"WMMA_F32_16x16x32_F16", 0x1A20>;
def WMMA_F32_16x16x32_BF16 : I32EnumAttrCase<"WMMA_F32_16x16x32_BF16", 0x1A21>;
def WMMA_F16_16x16x32_F16 : I32EnumAttrCase<"WMMA_F16_16x16x32_F16", 0x1A22>;
def WMMA_BF16_16x16x32_BF16 : I32EnumAttrCase<"WMMA_BF16_16x16x32_BF16", 0x1A23>;
// K=64.
def WMMA_F32_16x16x64_F8E4M3FN : I32EnumAttrCase<"WMMA_F32_16x16x64_F8E4M3FN", 0x1A30>;
def WMMA_F32_16x16x64_F8E4M3FN_F8E5M2 : I32EnumAttrCase<"WMMA_F32_16x16x64_F8E4M3FN_F8E5M2", 0x1A31>;
def WMMA_F32_16x16x64_F8E5M2 : I32EnumAttrCase<"WMMA_F32_16x16x64_F8E5M2", 0x1A32>;
def WMMA_F32_16x16x64_F8E5M2_F8E4M3FN : I32EnumAttrCase<"WMMA_F32_16x16x64_F8E5M2_F8E4M3FN", 0x1A33>;
def WMMA_F16_16x16x64_F8E4M3FN : I32EnumAttrCase<"WMMA_F16_16x16x64_F8E4M3FN", 0x1A34>;
def WMMA_F16_16x16x64_F8E4M3FN_F8E5M2 : I32EnumAttrCase<"WMMA_F16_16x16x64_F8E4M3FN_F8E5M2", 0x1A35>;
def WMMA_F16_16x16x64_F8E5M2 : I32EnumAttrCase<"WMMA_F16_16x16x64_F8E5M2", 0x1A36>;
def WMMA_F16_16x16x64_F8E5M2_F8E4M3FN : I32EnumAttrCase<"WMMA_F16_16x16x64_F8E5M2_F8E4M3FN", 0x1A37>;
def WMMA_I32_16x16x64_I8 : I32EnumAttrCase<"WMMA_I32_16x16x64_I8", 0x1AC0>;
// K=128.
def WMMA_F32_16x16x128_F8E5M2 : I32EnumAttrCase<"WMMA_F32_16x16x128_F8E5M2", 0x1A38>;
def WMMA_F32_16x16x128_F8E5M2_F8E4M3FN : I32EnumAttrCase<"WMMA_F32_16x16x128_F8E5M2_F8E4M3FN", 0x1A39>;
def WMMA_F32_16x16x128_F8E4M3FN : I32EnumAttrCase<"WMMA_F32_16x16x128_F8E4M3FN", 0x1A3A>;
def WMMA_F32_16x16x128_F8E4M3FN_F8E5M2 : I32EnumAttrCase<"WMMA_F32_16x16x128_F8E4M3FN_F8E5M2", 0x1A3B>;
def WMMA_F16_16x16x128_F8E5M2 : I32EnumAttrCase<"WMMA_F16_16x16x128_F8E5M2", 0x1A3C>;
def WMMA_F16_16x16x128_F8E5M2_F8E4M3FN : I32EnumAttrCase<"WMMA_F16_16x16x128_F8E5M2_F8E4M3FN", 0x1A3D>;
def WMMA_F16_16x16x128_F8E4M3FN : I32EnumAttrCase<"WMMA_F16_16x16x128_F8E4M3FN", 0x1A3E>;
def WMMA_F16_16x16x128_F8E4M3FN_F8E5M2 : I32EnumAttrCase<"WMMA_F16_16x16x128_F8E4M3FN_F8E5M2", 0x1A3F>;
// NV intrinsics with explicit layout (mma.sync)
def NV_MMA_SYNC_F32_16x8x16_F16 : I32EnumAttrCase<"NV_MMA_SYNC_F32_16x8x16_F16", 0x2020>;
def NV_MMA_SYNC_F16_16x8x16_F16 : I32EnumAttrCase<"NV_MMA_SYNC_F16_16x8x16_F16", 0x2021>;
def NV_MMA_SYNC_F32_16x8x16_BF16 : I32EnumAttrCase<"NV_MMA_SYNC_F32_16x8x16_BF16", 0x2022>;
// NV FP8
def NV_MMA_SYNC_F32_16x8x32_F8E4M3FN : I32EnumAttrCase<"NV_MMA_SYNC_F32_16x8x32_F8E4M3FN", 0x2023>;
def NV_MMA_SYNC_F32_16x8x32_F8E5M2 : I32EnumAttrCase<"NV_MMA_SYNC_F32_16x8x32_F8E5M2", 0x2024>;
// opaque NV intrinsics
def NV_WMMA_F32_16x16x16_F16 : I32EnumAttrCase<"NV_WMMA_F32_16x16x16_F16", 0x2120>;
def NV_WMMA_F16_16x16x16_F16 : I32EnumAttrCase<"NV_WMMA_F16_16x16x16_F16", 0x2121>;
def IREEGPU_MMAIntrinsic : IREEGPU_I32EnumAttr<"MMAIntrinsic",
"Descriptor for different MMA intrinsics", [
// Introduced in CDNA1.
MFMA_F32_16x16x4_F32,
MFMA_F32_16x16x16_F16,
MFMA_F32_32x32x8_F16,
MFMA_I32_16x16x16_I8,
MFMA_I32_32x32x8_I8,
// Introduced in CDNA2.
MFMA_F32_16x16x8_BF16,
MFMA_F32_32x32x4_BF16,
MFMA_F64_16x16x4_F64,
// Introduced in CDNA3.
MFMA_F32_16x16x16_BF16,
MFMA_F32_32x32x8_BF16,
MFMA_F32_16x16x32_F8E5M2FNUZ,
MFMA_F32_16x16x32_F8E5M2FNUZ_F8E4M3FNUZ,
MFMA_F32_16x16x32_F8E4M3FNUZ,
MFMA_F32_16x16x32_F8E4M3FNUZ_F8E5M2FNUZ,
MFMA_F32_32x32x16_F8E5M2FNUZ,
MFMA_F32_32x32x16_F8E5M2FNUZ_F8E4M3FNUZ,
MFMA_F32_32x32x16_F8E4M3FNUZ,
MFMA_F32_32x32x16_F8E4M3FNUZ_F8E5M2FNUZ,
MFMA_I32_16x16x32_I8,
MFMA_I32_32x32x16_I8,
// Block intrinsics.
MFMA_F32_4x4x4x16B_F16,
MFMA_F32_16x16x4x4B_F16,
MFMA_F32_32x32x4x2B_F16,
MFMA_F32_4x4x4x16B_BF16,
MFMA_F32_16x16x4x4B_BF16,
MFMA_F32_32x32x4x2B_BF16,
MFMA_F32_4x4x1x16B_F32,
MFMA_F32_16x16x1x4B_F32,
MFMA_F32_32x32x1x2B_F32,
MFMA_F64_4x4x4x4B_F64,
MFMA_I32_4x4x4x16B_I8,
MFMA_I32_16x16x4x4B_I8,
MFMA_I32_32x32x4x2B_I8,
// Introduced in CDNA4.
MFMA_F32_16x16x32_F16,
MFMA_F32_32x32x16_F16,
MFMA_F32_16x16x32_BF16,
MFMA_F32_32x32x16_BF16,
MFMA_F32_16x16x32_F8E5M2,
MFMA_F32_16x16x32_F8E5M2_F8E4M3FN,
MFMA_F32_16x16x32_F8E4M3FN,
MFMA_F32_16x16x32_F8E4M3FN_F8E5M2,
MFMA_F32_32x32x16_F8E5M2,
MFMA_F32_32x32x16_F8E5M2_F8E4M3FN,
MFMA_F32_32x32x16_F8E4M3FN,
MFMA_F32_32x32x16_F8E4M3FN_F8E5M2,
MFMA_F32_16x16x128_F8E5M2,
MFMA_F32_16x16x128_F8E5M2_F8E4M3FN,
MFMA_F32_16x16x128_F8E4M3FN,
MFMA_F32_16x16x128_F8E4M3FN_F8E5M2,
MFMA_F32_32x32x64_F8E5M2,
MFMA_F32_32x32x64_F8E5M2_F8E4M3FN,
MFMA_F32_32x32x64_F8E4M3FN,
MFMA_F32_32x32x64_F8E4M3FN_F8E5M2,
MFMA_I32_16x16x64_I8,
MFMA_I32_32x32x32_I8,
// RDNA3 intrinsics.
WMMAR3_F32_16x16x16_F16,
WMMAR3_F16_16x16x16_F16,
WMMAR3_F32_16x16x16_BF16,
WMMAR3_BF16_16x16x16_BF16,
WMMAR3_I32_16x16x16_I8,
// RDNA4 intrinsics
WMMAR4_F32_16x16x16_F16,
WMMAR4_F16_16x16x16_F16,
WMMAR4_F32_16x16x16_BF16,
WMMAR4_BF16_16x16x16_BF16,
WMMAR4_F32_16x16x16_F8E5M2,
WMMAR4_F32_16x16x16_F8E5M2_F8E4M3FN,
WMMAR4_F32_16x16x16_F8E4M3FN,
WMMAR4_F32_16x16x16_F8E4M3FN_F8E5M2,
WMMAR4_I32_16x16x16_I8,
// gfx1250 intrinsics.
// K=4.
WMMA_F32_16x16x4_F32,
// K=32.
WMMA_F32_16x16x32_F16,
WMMA_F32_16x16x32_BF16,
WMMA_F16_16x16x32_F16,
WMMA_BF16_16x16x32_BF16,
// K=64.
WMMA_F32_16x16x64_F8E4M3FN,
WMMA_F32_16x16x64_F8E4M3FN_F8E5M2,
WMMA_F32_16x16x64_F8E5M2,
WMMA_F32_16x16x64_F8E5M2_F8E4M3FN,
WMMA_F16_16x16x64_F8E4M3FN,
WMMA_F16_16x16x64_F8E4M3FN_F8E5M2,
WMMA_F16_16x16x64_F8E5M2,
WMMA_F16_16x16x64_F8E5M2_F8E4M3FN,
WMMA_I32_16x16x64_I8,
// K=128.
WMMA_F32_16x16x128_F8E5M2,
WMMA_F32_16x16x128_F8E5M2_F8E4M3FN,
WMMA_F32_16x16x128_F8E4M3FN,
WMMA_F32_16x16x128_F8E4M3FN_F8E5M2,
WMMA_F16_16x16x128_F8E5M2,
WMMA_F16_16x16x128_F8E5M2_F8E4M3FN,
WMMA_F16_16x16x128_F8E4M3FN,
WMMA_F16_16x16x128_F8E4M3FN_F8E5M2,
// NV intrinsics with layout
NV_MMA_SYNC_F32_16x8x16_F16,
NV_MMA_SYNC_F16_16x8x16_F16,
NV_MMA_SYNC_F32_16x8x16_BF16,
// NV FP8 intrinsics (sm_89+).
NV_MMA_SYNC_F32_16x8x32_F8E4M3FN,
NV_MMA_SYNC_F32_16x8x32_F8E5M2,
// opaque NV intrinsics.
NV_WMMA_F32_16x16x16_F16,
NV_WMMA_F16_16x16x16_F16,
]>;
def VMFMA_F32_16x16x32_F16 : I32EnumAttrCase<"VMFMA_F32_16x16x32_F16", 0>;
def VMFMA_F32_32x32x16_F16 : I32EnumAttrCase<"VMFMA_F32_32x32x16_F16", 1>;
def VMFMA_F32_16x16x32_F8E4M3FNUZ : I32EnumAttrCase<"VMFMA_F32_16x16x32_F8E4M3FNUZ", 2>;
def VMFMA_F32_32x32x16_F8E4M3FNUZ : I32EnumAttrCase<"VMFMA_F32_32x32x16_F8E4M3FNUZ", 3>;
// CDNA3 VDMFMA variants.
def VDMFMA_F32_8x16x64x2_F16 : I32EnumAttrCase<"VDMFMA_F32_8x16x64x2_F16", 4>;
def VDMFMA_F32_8x16x64x2_BF16 : I32EnumAttrCase<"VDMFMA_F32_8x16x64x2_BF16", 6>;
def VDMFMA_I32_8x16x128x2_I8 : I32EnumAttrCase<"VDMFMA_I32_8x16x128x2_I8", 5>;
def VDMFMA_F32_8x16x128x2_F8E5M2FNUZ : I32EnumAttrCase<"VDMFMA_F32_8x16x128x2_F8E5M2FNUZ", 7>;
def VDMFMA_F32_8x16x128x2_F8E5M2FNUZ_F8E4M3FNUZ : I32EnumAttrCase<"VDMFMA_F32_8x16x128x2_F8E5M2FNUZ_F8E4M3FNUZ", 8>;
def VDMFMA_F32_8x16x128x2_F8E4M3FNUZ_F8E5M2FNUZ : I32EnumAttrCase<"VDMFMA_F32_8x16x128x2_F8E4M3FNUZ_F8E5M2FNUZ", 9>;
def VDMFMA_F32_8x16x128x2_F8E4M3FNUZ : I32EnumAttrCase<"VDMFMA_F32_8x16x128x2_F8E4M3FNUZ", 10>;
// CDNA4 VDMFMA variants.
def VDMFMA_F32_8x16x64x1_F16 : I32EnumAttrCase<"VDMFMA_F32_8x16x64x1_F16", 15>;
def VDMFMA_F32_8x16x64x1_BF16 : I32EnumAttrCase<"VDMFMA_F32_8x16x64x1_BF16", 16>;
def VDMFMA_I32_8x16x128x1_I8 : I32EnumAttrCase<"VDMFMA_I32_8x16x128x1_I8", 17>;
def VDMFMA_F32_8x16x128x1_F8E5M2 : I32EnumAttrCase<"VDMFMA_F32_8x16x128x1_F8E5M2", 11>;
def VDMFMA_F32_8x16x128x1_F8E5M2_F8E4M3FN : I32EnumAttrCase<"VDMFMA_F32_8x16x128x1_F8E5M2_F8E4M3FN", 12>;
def VDMFMA_F32_8x16x128x1_F8E4M3FN_F8E5M2 : I32EnumAttrCase<"VDMFMA_F32_8x16x128x1_F8E4M3FN_F8E5M2", 13>;
def VDMFMA_F32_8x16x128x1_F8E4M3FN : I32EnumAttrCase<"VDMFMA_F32_8x16x128x1_F8E4M3FN", 14>;
def IREEGPU_VirtualMMAIntrinsic : IREEGPU_I32EnumAttr<"VirtualMMAIntrinsic",
"Descriptor for different Virtual MMA intrinsics", [
VMFMA_F32_16x16x32_F16,
VMFMA_F32_32x32x16_F16,
VMFMA_F32_16x16x32_F8E4M3FNUZ,
VMFMA_F32_32x32x16_F8E4M3FNUZ,
// CDNA3 VDMFMA variants.
VDMFMA_F32_8x16x64x2_F16,
VDMFMA_F32_8x16x64x2_BF16,
VDMFMA_I32_8x16x128x2_I8,
VDMFMA_F32_8x16x128x2_F8E5M2FNUZ,
VDMFMA_F32_8x16x128x2_F8E5M2FNUZ_F8E4M3FNUZ,
VDMFMA_F32_8x16x128x2_F8E4M3FNUZ_F8E5M2FNUZ,
VDMFMA_F32_8x16x128x2_F8E4M3FNUZ,
// CDNA4 VDMFMA variants.
VDMFMA_F32_8x16x64x1_F16,
VDMFMA_F32_8x16x64x1_BF16,
VDMFMA_I32_8x16x128x1_I8,
VDMFMA_F32_8x16x128x1_F8E5M2,
VDMFMA_F32_8x16x128x1_F8E5M2_F8E4M3FN,
VDMFMA_F32_8x16x128x1_F8E4M3FN_F8E5M2,
VDMFMA_F32_8x16x128x1_F8E4M3FN,
]>;
// Enum for scaled mma intrinsic, loosely matching the MMAIntrinsic enum above
// but not including the input types.
//
// The main variation from intrinsic names is that, after the K dimension, we
// include the block size (that is, how many elements along the K dimension
// the shared scale applies to), which is given as "_Bxx"
//
// Values: 0xABCD where:
// * A = vendor:
// * 1 = AMD
// * 2 = NVIDIA
// * B = architecture. When an intrinsic exists in multiple architectures, this
// should be the architecture it was introduced in, as long as it still
// has the same semantics. If a new architecture breaks an existing
// intrinsic's semantics, we can use that field for versioning.
// * For AMD:
// * 0 = CDNA4
// * C = element type of output/accumulator matrix and scale block size:
// * 0 = IEEE 32-bit float output, 32 elems/scale
// * D enumerates intrinsics that share the same 0xABC* bits.
//
// Introduced in CDNA4
def MFMA_SCALE_F32_16x16x128_B32 : I32EnumCase<"MFMA_SCALE_F32_16x16x128_B32", 0x1000>;
def MFMA_SCALE_F32_32x32x64_B32 : I32EnumCase<"MFMA_SCALE_F32_32x32x64_B32", 0x1001>;
def IREEGPU_ScaledMMAIntrinsic : IREEGPU_I32Enum<"ScaledMMAIntrinsic",
"Descriptor for different scaled MMA intrinsics", [
// Introduced in CDNA4.
MFMA_SCALE_F32_16x16x128_B32,
MFMA_SCALE_F32_32x32x64_B32
]>;
//===----------------------------------------------------------------------===//
// Tiling levels
def Workgroup : I32EnumAttrCase<"Workgroup", 0>;
def Reduction : I32EnumAttrCase<"Reduction", 1>;
def PartialReduction : I32EnumAttrCase<"PartialReduction", 2>;
def Serial : I32EnumAttrCase<"Serial", 3>;
def Thread : I32EnumAttrCase<"Thread", 4>;
def Subgroup : I32EnumAttrCase<"Subgroup", 5>;
def Lane : I32EnumAttrCase<"Lane", 6>;
/// Enum descriptor for the set of tiling levels for GPU pass pipelines.
/// Note that `Thread` tiling is mutually exclusive with `Subgroup` and
/// `Lane` tiling, and `Lane` tiling is only legal if the same operation
/// is also tiled or fused to subgroups.
def IREEGPU_TilingLevel : IREEGPU_I32EnumAttr<"TilingLevel",
"Descriptor for tiling levels for GPU lowering configs", [
Workgroup,
Reduction,
PartialReduction,
Serial,
Thread,
Subgroup,
Lane
]>;
//===----------------------------------------------------------------------===//
// Pipeline options
//===----------------------------------------------------------------------===//
class IREEGPU_I32PipelineEnumAttr<string name, string summary, list<I32EnumAttrCase> cases>
: I32EnumAttr<name, summary, cases> {
let cppNamespace = "::mlir::iree_compiler::IREE::GPU";
let genSpecializedAttr = 0;
}
// ReorderWorkgroups EnumAttrCases.
def ReorderWorkgroupsNone : I32EnumAttrCase<"None", 0>;
def ReorderWorkgroupsTranspose : I32EnumAttrCase<"Transpose", 1>;
// EnumAttr for workgroup reordering strategy enums.
def IREEGPU_ReorderWorkgroupsStrategy : IREEGPU_I32PipelineEnumAttr<"ReorderWorkgroupsStrategy",
"Strategy for workgroup reordering", [
ReorderWorkgroupsNone,
ReorderWorkgroupsTranspose
]> {
}
//===----------------------------------------------------------------------===//
// GPU Lowering Pipelines
//===----------------------------------------------------------------------===//
// LLVMGPU pipelines.
def IREEGPU_LP_Default : I32EnumAttrCase<"Default", 0>;
def IREEGPU_LP_BaseLowering : I32EnumAttrCase<"BaseLowering", 1>;
def IREEGPU_LP_Distribute : I32EnumAttrCase<"Distribute", 2>;
def IREEGPU_LP_Vectorize : I32EnumAttrCase<"Vectorize", 3>;
def IREEGPU_LP_VectorDistribute : I32EnumAttrCase<"VectorDistribute", 4>;
def IREEGPU_LP_WinogradVectorize : I32EnumAttrCase<"WinogradVectorize", 5>;
def IREEGPU_LP_TileAndFuse : I32EnumAttrCase<"TileAndFuse", 6>;
def IREEGPU_LoweringPipeline : IREEGPU_I32EnumAttr<"LoweringPipeline",
"LLVMGPU lowering pipeline identifier", [
IREEGPU_LP_Default, IREEGPU_LP_BaseLowering, IREEGPU_LP_Distribute,
IREEGPU_LP_Vectorize, IREEGPU_LP_VectorDistribute,
IREEGPU_LP_WinogradVectorize, IREEGPU_LP_TileAndFuse
]>;
//===----------------------------------------------------------------------===//
// SPIRV Lowering Pipelines
//===----------------------------------------------------------------------===//
def IREEGPU_SP_BaseLowering : I32EnumAttrCase<"BaseLowering", 0>;
def IREEGPU_SP_BaseDistribute : I32EnumAttrCase<"BaseDistribute", 1>;
def IREEGPU_SP_BaseVectorize : I32EnumAttrCase<"BaseVectorize", 2>;
def IREEGPU_SP_SubgroupReduce : I32EnumAttrCase<"SubgroupReduce", 3>;
def IREEGPU_SP_MatmulPromoteVectorize
: I32EnumAttrCase<"MatmulPromoteVectorize", 4>;
def IREEGPU_SP_CooperativeMatrixVectorize
: I32EnumAttrCase<"CooperativeMatrixVectorize", 5>;
def IREEGPU_SP_WinogradVectorize : I32EnumAttrCase<"WinogradVectorize", 6>;
def IREEGPU_SPIRVLoweringPipeline : IREEGPU_I32EnumAttr<
"SPIRVLoweringPipeline",
"SPIRV lowering pipeline identifier", [
IREEGPU_SP_BaseLowering, IREEGPU_SP_BaseDistribute,
IREEGPU_SP_BaseVectorize, IREEGPU_SP_SubgroupReduce,
IREEGPU_SP_MatmulPromoteVectorize,
IREEGPU_SP_CooperativeMatrixVectorize, IREEGPU_SP_WinogradVectorize
]>;
#endif // IREE_COMPILER_CODEGEN_DIALECT_GPU_IREEGPUENUMS