mirror of
https://github.com/ROCm/composable_kernel.git
synced 2026-07-07 15:47:05 +00:00
removed the changes as per the MR review comment.
This commit is contained in:
@@ -16,13 +16,11 @@ enum struct WmmaInstr
|
||||
wmma_f32_16x16x16_bf16,
|
||||
wmma_f16_16x16x16_f16,
|
||||
wmma_bf16_16x16x16_bf16,
|
||||
wmma_i32_16x16x16_iu16,
|
||||
wmma_i32_16x16x16_iu8,
|
||||
wmma_i32_16x16x16_iu4,
|
||||
// gfx12
|
||||
wmma_f32_16x16x16_f16_gfx12,
|
||||
wmma_f32_16x16x16_bf16_gfx12,
|
||||
wmma_i32_16x16x16_iu16_gfx12,
|
||||
wmma_i32_16x16x16_iu8_gfx12,
|
||||
wmma_f32_16x16x16_f8f8_gfx12,
|
||||
wmma_f32_16x16x16_f8bf8_gfx12,
|
||||
@@ -592,16 +590,6 @@ struct WmmaSelector
|
||||
return WmmaInstr::wmma_bf16_16x16x16_bf16;
|
||||
}
|
||||
|
||||
template <>
|
||||
constexpr auto GetWmma<unsigned short, unsigned short, int, 16, 16>()
|
||||
{
|
||||
#ifdef __gfx12__
|
||||
return WmmaInstr::wmma_i32_16x16x16_iu16_gfx12;
|
||||
#else
|
||||
return WmmaInstr::wmma_i32_16x16x16_iu16;
|
||||
#endif
|
||||
}
|
||||
|
||||
template <>
|
||||
constexpr auto GetWmma<int8_t, int8_t, int, 16, 16>()
|
||||
{
|
||||
|
||||
@@ -143,33 +143,6 @@ struct intrin_wmma_i32_16x16x16_iu8_w32<16, 16, neg_a, neg_b, clamp>
|
||||
}
|
||||
};
|
||||
|
||||
// src: iu8, dst: i32
|
||||
template <index_t MPerWave, index_t NPerWave, bool neg_a, bool neg_b, bool clamp>
|
||||
struct intrin_wmma_i32_16x16x16_iu16_w32;
|
||||
|
||||
template <bool neg_a, bool neg_b, bool clamp>
|
||||
struct intrin_wmma_i32_16x16x16_iu16_w32<16, 16, neg_a, neg_b, clamp>
|
||||
{
|
||||
template <class FloatC>
|
||||
__device__ static void Run(const int16x16_t& reg_a, const int16x16_t& reg_b, FloatC& reg_c)
|
||||
{
|
||||
#if defined(__gfx11__)
|
||||
reg_c.template AsType<int32x8_t>()(Number<0>{}) =
|
||||
__builtin_amdgcn_wmma_i32_16x16x16_iu16_w32(
|
||||
neg_a,
|
||||
bit_cast<int32x8_t>(reg_a),
|
||||
neg_b,
|
||||
bit_cast<int32x8_t>(reg_b),
|
||||
reg_c.template AsType<int32x8_t>()[Number<0>{}],
|
||||
clamp);
|
||||
#else
|
||||
ignore = reg_a;
|
||||
ignore = reg_b;
|
||||
ignore = reg_c;
|
||||
#endif
|
||||
}
|
||||
};
|
||||
|
||||
/********************************WAVE64 MODE***********************************************/
|
||||
|
||||
template <index_t MPerWave, index_t NPerWave>
|
||||
@@ -290,33 +263,6 @@ struct intrin_wmma_i32_16x16x16_iu8_w64<16, 16, neg_a, neg_b, clamp>
|
||||
}
|
||||
};
|
||||
|
||||
// src: iu16, dst: i32
|
||||
template <index_t MPerWave, index_t NPerWave, bool neg_a, bool neg_b, bool clamp>
|
||||
struct intrin_wmma_i32_16x16x16_iu16_w64;
|
||||
|
||||
template <bool neg_a, bool neg_b, bool clamp>
|
||||
struct intrin_wmma_i32_16x16x16_iu16_w64<16, 16, neg_a, neg_b, clamp>
|
||||
{
|
||||
template <class FloatC>
|
||||
__device__ static void Run(const int16x16_t& reg_a, const int16x16_t& reg_b, FloatC& reg_c)
|
||||
{
|
||||
#if defined(__gfx11__)
|
||||
reg_c.template AsType<int32x4_t>()(Number<0>{}) =
|
||||
__builtin_amdgcn_wmma_i32_16x16x16_iu8_w64(
|
||||
neg_a,
|
||||
bit_cast<int32x8_t>(reg_a),
|
||||
neg_b,
|
||||
bit_cast<int32x8_t>(reg_b),
|
||||
reg_c.template AsType<int32x4_t>()[Number<0>{}],
|
||||
clamp);
|
||||
#else
|
||||
ignore = reg_a;
|
||||
ignore = reg_b;
|
||||
ignore = reg_c;
|
||||
#endif
|
||||
}
|
||||
};
|
||||
|
||||
// gfx12
|
||||
/********************************WAVE32 MODE***********************************************/
|
||||
|
||||
@@ -395,25 +341,94 @@ struct intrin_wmma_i32_16x16x16_iu8_w32_gfx12<16, 16, neg_a, neg_b, clamp>
|
||||
}
|
||||
};
|
||||
|
||||
// src: iu16, dst: i32
|
||||
template <index_t MPerWave, index_t NPerWave, bool neg_a, bool neg_b, bool clamp>
|
||||
struct intrin_wmma_i32_16x16x16_iu16_w32_gfx12;
|
||||
// src: f8, f8, dst: fp32
|
||||
template <index_t MPerWave, index_t NPerWave>
|
||||
struct intrin_wmma_f32_16x16x16_f8f8_w32_gfx12;
|
||||
|
||||
template <bool neg_a, bool neg_b, bool clamp>
|
||||
struct intrin_wmma_i32_16x16x16_iu16_w32_gfx12<16, 16, neg_a, neg_b, clamp>
|
||||
template <>
|
||||
struct intrin_wmma_f32_16x16x16_f8f8_w32_gfx12<16, 16>
|
||||
{
|
||||
template <class FloatC>
|
||||
__device__ static void Run(const int16x8_t& reg_a, const int16x8_t& reg_b, FloatC& reg_c)
|
||||
__device__ static void Run(const f8x8_t& reg_a, const f8x8_t& reg_b, FloatC& reg_c)
|
||||
{
|
||||
#if defined(__gfx12__)
|
||||
reg_c.template AsType<int32x8_t>()(Number<0>{}) =
|
||||
__builtin_amdgcn_wmma_i32_16x16x16_iu8_w32_gfx12(
|
||||
neg_a,
|
||||
bit_cast<int32x4_t>(reg_a),
|
||||
neg_b,
|
||||
bit_cast<int32x4_t>(reg_b),
|
||||
reg_c.template AsType<int32x8_t>()[Number<0>{}],
|
||||
clamp);
|
||||
reg_c.template AsType<float8_t>()(Number<0>{}) =
|
||||
__builtin_amdgcn_wmma_f32_16x16x16_fp8_fp8_w32_gfx12(
|
||||
bit_cast<int32x2_t>(reg_a),
|
||||
bit_cast<int32x2_t>(reg_b),
|
||||
reg_c.template AsType<float8_t>()[Number<0>{}]);
|
||||
#else
|
||||
ignore = reg_a;
|
||||
ignore = reg_b;
|
||||
ignore = reg_c;
|
||||
#endif
|
||||
}
|
||||
};
|
||||
|
||||
// src: f8, bf8, dst: fp32
|
||||
template <index_t MPerWave, index_t NPerWave>
|
||||
struct intrin_wmma_f32_16x16x16_f8bf8_w32_gfx12;
|
||||
|
||||
template <>
|
||||
struct intrin_wmma_f32_16x16x16_f8bf8_w32_gfx12<16, 16>
|
||||
{
|
||||
template <class FloatC>
|
||||
__device__ static void Run(const f8x8_t& reg_a, const bf8x8_t& reg_b, FloatC& reg_c)
|
||||
{
|
||||
#if defined(__gfx12__)
|
||||
reg_c.template AsType<float8_t>()(Number<0>{}) =
|
||||
__builtin_amdgcn_wmma_f32_16x16x16_fp8_bf8_w32_gfx12(
|
||||
bit_cast<int32x2_t>(reg_a),
|
||||
bit_cast<int32x2_t>(reg_b),
|
||||
reg_c.template AsType<float8_t>()[Number<0>{}]);
|
||||
#else
|
||||
ignore = reg_a;
|
||||
ignore = reg_b;
|
||||
ignore = reg_c;
|
||||
#endif
|
||||
}
|
||||
};
|
||||
|
||||
// src: bf8, f8, dst: fp32
|
||||
template <index_t MPerWave, index_t NPerWave>
|
||||
struct intrin_wmma_f32_16x16x16_bf8f8_w32_gfx12;
|
||||
|
||||
template <>
|
||||
struct intrin_wmma_f32_16x16x16_bf8f8_w32_gfx12<16, 16>
|
||||
{
|
||||
template <class FloatC>
|
||||
__device__ static void Run(const bf8x8_t& reg_a, const f8x8_t& reg_b, FloatC& reg_c)
|
||||
{
|
||||
#if defined(__gfx12__)
|
||||
reg_c.template AsType<float8_t>()(Number<0>{}) =
|
||||
__builtin_amdgcn_wmma_f32_16x16x16_bf8_fp8_w32_gfx12(
|
||||
bit_cast<int32x2_t>(reg_a),
|
||||
bit_cast<int32x2_t>(reg_b),
|
||||
reg_c.template AsType<float8_t>()[Number<0>{}]);
|
||||
#else
|
||||
ignore = reg_a;
|
||||
ignore = reg_b;
|
||||
ignore = reg_c;
|
||||
#endif
|
||||
}
|
||||
};
|
||||
|
||||
// src: bf8, bf8, dst: fp32
|
||||
template <index_t MPerWave, index_t NPerWave>
|
||||
struct intrin_wmma_f32_16x16x16_bf8bf8_w32_gfx12;
|
||||
|
||||
template <>
|
||||
struct intrin_wmma_f32_16x16x16_bf8bf8_w32_gfx12<16, 16>
|
||||
{
|
||||
template <class FloatC>
|
||||
__device__ static void Run(const bf8x8_t& reg_a, const bf8x8_t& reg_b, FloatC& reg_c)
|
||||
{
|
||||
#if defined(__gfx12__)
|
||||
reg_c.template AsType<float8_t>()(Number<0>{}) =
|
||||
__builtin_amdgcn_wmma_f32_16x16x16_bf8_bf8_w32_gfx12(
|
||||
bit_cast<int32x2_t>(reg_a),
|
||||
bit_cast<int32x2_t>(reg_b),
|
||||
reg_c.template AsType<float8_t>()[Number<0>{}]);
|
||||
#else
|
||||
ignore = reg_a;
|
||||
ignore = reg_b;
|
||||
|
||||
@@ -2093,8 +2093,6 @@ struct vector_type<T, 64, typename ck::enable_if_t<!is_native_type<T>()>>
|
||||
}
|
||||
};
|
||||
|
||||
using int64_t = long;
|
||||
|
||||
// fp32
|
||||
using float2_t = typename vector_type<float, 2>::type;
|
||||
using float4_t = typename vector_type<float, 4>::type;
|
||||
@@ -2126,14 +2124,6 @@ using int32x16_t = typename vector_type<int32_t, 16>::type;
|
||||
using int32x32_t = typename vector_type<int32_t, 32>::type;
|
||||
using int32x64_t = typename vector_type<int32_t, 64>::type;
|
||||
|
||||
// i16
|
||||
using int16x2_t = typename vector_type<int16_t, 2>::type;
|
||||
using int16x4_t = typename vector_type<int16_t, 4>::type;
|
||||
using int16x8_t = typename vector_type<int16_t, 8>::type;
|
||||
using int16x16_t = typename vector_type<int16_t, 16>::type;
|
||||
using int16x32_t = typename vector_type<int16_t, 32>::type;
|
||||
using int16x64_t = typename vector_type<int16_t, 64>::type;
|
||||
|
||||
// i8
|
||||
using int8x2_t = typename vector_type<int8_t, 2>::type;
|
||||
using int8x4_t = typename vector_type<int8_t, 4>::type;
|
||||
|
||||
Reference in New Issue
Block a user