Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,15 @@ struct BlockwiseGemmXdlops_pipeline_blockscale_bpreshuffle_v1<BlockGemmPipelineS
{
ignore = b_block_desc;
ignore = b_block_buf;

static_assert(sizeof(AccDataType) == 4 && is_floating_point<AccDataType>::value,
"bpreshuffle accumulator anchor requires 32-bit float AccDataType");

// The empty asm is a read/write VGPR use of the updated accumulator.
// It keeps each post-scale accumulator definition visible to the
// optimizer, which enables determinism for bitwise-stable repeated launches.
auto anchor_accumulator_value = [&](auto& value) { asm volatile("" : "+v"(value)); };
Comment thread
hdt98 marked this conversation as resolved.

// __builtin_amdgcn_sched_barrier(0);
auto a_thread_buf = make_static_buffer<AddressSpaceEnum::Vgpr, ComputeDataType>(
a_thread_desc_.GetElementSpaceSize());
Expand Down Expand Up @@ -451,14 +460,9 @@ struct BlockwiseGemmXdlops_pipeline_blockscale_bpreshuffle_v1<BlockGemmPipelineS
c_thread_buf_per_scale.GetVectorTypeReference(Number<0>{})
.template AsType<AccDataType>()(Number<t>{}) = 0;
});
vector_type<AccDataType, 2> c_scale_thread_vec;
constexpr index_t cscale_offset = CScaleThreadDesc{}.CalculateOffset(
make_tuple(kscale0, m0, n0 * num_scale_n_block / NRepeat));

c_scale_thread_vec.template AsType<AccDataType>()(Number<0>{}) =
c_scale_thread_buf[Number<cscale_offset>{}];
c_scale_thread_vec.template AsType<AccDataType>()(Number<1>{}) =
c_scale_thread_buf[Number<cscale_offset>{}];
const auto c_scale_thread = c_scale_thread_buf[Number<cscale_offset>{}];

static_for<0, KRepeat / num_scale_k_block, 1>{}([&](auto k0) {
vector_type<ComputeDataType, KPack> a_thread_vec;
Expand Down Expand Up @@ -501,16 +505,18 @@ struct BlockwiseGemmXdlops_pipeline_blockscale_bpreshuffle_v1<BlockGemmPipelineS
constexpr index_t c_offset =
c_thread_desc_.CalculateOffset(make_tuple(m0, n0, 0));

static_for<0, xdlops_gemm.GetRegSizePerXdlops() / 2, 1>{}([&](auto t) {
using pk_fma_type = typename vector_type<AccDataType, 2>::type;

c_thread_buf.GetVectorTypeReference(Number<c_offset>{})
.template AsType<pk_fma_type>()(t) = __builtin_elementwise_fma(
c_thread_buf_per_scale.GetVectorTypeReference(Number<0>{})
.template AsType<pk_fma_type>()[t],
c_scale_thread_vec.template AsType<pk_fma_type>()[Number<0>{}],
// Keep the post-scale FMA scalar; the old packed 2-lane update hits
Comment thread
hdt98 marked this conversation as resolved.
// ROCm 7.2 gfx950 illegal-type legalization/codegen issues.
static_for<0, xdlops_gemm.GetRegSizePerXdlops(), 1>{}([&](auto t) {
auto& c_acc_vec =
c_thread_buf.GetVectorTypeReference(Number<c_offset>{})
.template AsType<pk_fma_type>()[t]);
.template AsType<AccDataType>();
const auto c_partial_acc =
c_thread_buf_per_scale.GetVectorTypeReference(Number<0>{})
.template AsType<AccDataType>()(t);
c_acc_vec(t) = __builtin_elementwise_fma(
c_partial_acc, c_scale_thread, c_acc_vec(t));
anchor_accumulator_value(c_acc_vec(t));
});
});

Expand Down Expand Up @@ -606,14 +612,9 @@ struct BlockwiseGemmXdlops_pipeline_blockscale_bpreshuffle_v1<BlockGemmPipelineS
c_thread_buf_per_scale.GetVectorTypeReference(Number<0>{})
.template AsType<AccDataType>()(Number<t>{}) = 0;
});
vector_type<AccDataType, 2> c_scale_thread_vec;
constexpr index_t cscale_offset = CScaleThreadDesc{}.CalculateOffset(
make_tuple(kscale0, m0, n0 * num_scale_n_block / NRepeat));

c_scale_thread_vec.template AsType<AccDataType>()(Number<0>{}) =
c_scale_thread_buf[Number<cscale_offset>{}];
c_scale_thread_vec.template AsType<AccDataType>()(Number<1>{}) =
c_scale_thread_buf[Number<cscale_offset>{}];
const auto c_scale_thread = c_scale_thread_buf[Number<cscale_offset>{}];

static_for<0, KRepeat / num_scale_k_block, 1>{}([&](auto k0) {
vector_type<ComputeDataType, KPack> a_thread_vec;
Expand Down Expand Up @@ -653,16 +654,17 @@ struct BlockwiseGemmXdlops_pipeline_blockscale_bpreshuffle_v1<BlockGemmPipelineS
});
constexpr index_t c_offset = c_thread_desc_.CalculateOffset(make_tuple(m0, n0, 0));

static_for<0, xdlops_gemm.GetRegSizePerXdlops() / 2, 1>{}([&](auto t) {
using pk_fma_type = typename vector_type<AccDataType, 2>::type;

c_thread_buf.GetVectorTypeReference(Number<c_offset>{})
.template AsType<pk_fma_type>()(t) = __builtin_elementwise_fma(
// Keep the post-scale FMA scalar; the old packed 2-lane update hits ROCm 7.2
// gfx950 illegal-type legalization/codegen issues.
static_for<0, xdlops_gemm.GetRegSizePerXdlops(), 1>{}([&](auto t) {
auto& c_acc_vec = c_thread_buf.GetVectorTypeReference(Number<c_offset>{})
.template AsType<AccDataType>();
const auto c_partial_acc =
c_thread_buf_per_scale.GetVectorTypeReference(Number<0>{})
.template AsType<pk_fma_type>()[t],
c_scale_thread_vec.template AsType<pk_fma_type>()[Number<0>{}],
c_thread_buf.GetVectorTypeReference(Number<c_offset>{})
.template AsType<pk_fma_type>()[t]);
.template AsType<AccDataType>()(t);
c_acc_vec(t) =
__builtin_elementwise_fma(c_partial_acc, c_scale_thread, c_acc_vec(t));
anchor_accumulator_value(c_acc_vec(t));
});
});

Expand Down Expand Up @@ -701,14 +703,9 @@ struct BlockwiseGemmXdlops_pipeline_blockscale_bpreshuffle_v1<BlockGemmPipelineS
c_thread_buf_per_scale.GetVectorTypeReference(Number<0>{})
.template AsType<AccDataType>()(Number<t>{}) = 0;
});
vector_type<AccDataType, 2> c_scale_thread_vec;
constexpr index_t cscale_offset = CScaleThreadDesc{}.CalculateOffset(
make_tuple(kscale0, m0, n0 * num_scale_n_block / NRepeat));

c_scale_thread_vec.template AsType<AccDataType>()(Number<0>{}) =
c_scale_thread_buf[Number<cscale_offset>{}];
c_scale_thread_vec.template AsType<AccDataType>()(Number<1>{}) =
c_scale_thread_buf[Number<cscale_offset>{}];
const auto c_scale_thread = c_scale_thread_buf[Number<cscale_offset>{}];

static_for<0, KRepeat / num_scale_k_block, 1>{}([&](auto k0) {
vector_type<ComputeDataType, KPack> a_thread_vec;
Expand Down Expand Up @@ -748,16 +745,17 @@ struct BlockwiseGemmXdlops_pipeline_blockscale_bpreshuffle_v1<BlockGemmPipelineS
});
constexpr index_t c_offset = c_thread_desc_.CalculateOffset(make_tuple(m0, n0, 0));

static_for<0, xdlops_gemm.GetRegSizePerXdlops() / 2, 1>{}([&](auto t) {
using pk_fma_type = typename vector_type<AccDataType, 2>::type;

c_thread_buf.GetVectorTypeReference(Number<c_offset>{})
.template AsType<pk_fma_type>()(t) = __builtin_elementwise_fma(
// Keep the post-scale FMA scalar; the old packed 2-lane update hits ROCm 7.2
// gfx950 illegal-type legalization/codegen issues.
static_for<0, xdlops_gemm.GetRegSizePerXdlops(), 1>{}([&](auto t) {
auto& c_acc_vec = c_thread_buf.GetVectorTypeReference(Number<c_offset>{})
.template AsType<AccDataType>();
const auto c_partial_acc =
c_thread_buf_per_scale.GetVectorTypeReference(Number<0>{})
.template AsType<pk_fma_type>()[t],
c_scale_thread_vec.template AsType<pk_fma_type>()[Number<0>{}],
c_thread_buf.GetVectorTypeReference(Number<c_offset>{})
.template AsType<pk_fma_type>()[t]);
.template AsType<AccDataType>()(t);
c_acc_vec(t) =
__builtin_elementwise_fma(c_partial_acc, c_scale_thread, c_acc_vec(t));
anchor_accumulator_value(c_acc_vec(t));
});
});
}
Expand All @@ -771,14 +769,9 @@ struct BlockwiseGemmXdlops_pipeline_blockscale_bpreshuffle_v1<BlockGemmPipelineS
c_thread_buf_per_scale.GetVectorTypeReference(Number<0>{})
.template AsType<AccDataType>()(Number<t>{}) = 0;
});
vector_type<AccDataType, 2> c_scale_thread_vec;
constexpr index_t cscale_offset = CScaleThreadDesc{}.CalculateOffset(
make_tuple(kscale0, m0, n0 * num_scale_n_block / NRepeat));

c_scale_thread_vec.template AsType<AccDataType>()(Number<0>{}) =
c_scale_thread_buf[Number<cscale_offset>{}];
c_scale_thread_vec.template AsType<AccDataType>()(Number<1>{}) =
c_scale_thread_buf[Number<cscale_offset>{}];
const auto c_scale_thread = c_scale_thread_buf[Number<cscale_offset>{}];

static_for<0, KRepeat / num_scale_k_block, 1>{}([&](auto k0) {
vector_type<ComputeDataType, KPack> a_thread_vec;
Expand Down Expand Up @@ -819,16 +812,17 @@ struct BlockwiseGemmXdlops_pipeline_blockscale_bpreshuffle_v1<BlockGemmPipelineS

constexpr index_t c_offset = c_thread_desc_.CalculateOffset(make_tuple(m0, n0, 0));

static_for<0, xdlops_gemm.GetRegSizePerXdlops() / 2, 1>{}([&](auto t) {
using pk_fma_type = typename vector_type<AccDataType, 2>::type;

c_thread_buf.GetVectorTypeReference(Number<c_offset>{})
.template AsType<pk_fma_type>()(t) = __builtin_elementwise_fma(
// Keep the post-scale FMA scalar; the old packed 2-lane update hits ROCm 7.2
// gfx950 illegal-type legalization/codegen issues.
static_for<0, xdlops_gemm.GetRegSizePerXdlops(), 1>{}([&](auto t) {
auto& c_acc_vec = c_thread_buf.GetVectorTypeReference(Number<c_offset>{})
.template AsType<AccDataType>();
const auto c_partial_acc =
c_thread_buf_per_scale.GetVectorTypeReference(Number<0>{})
.template AsType<pk_fma_type>()[t],
c_scale_thread_vec.template AsType<pk_fma_type>()[Number<0>{}],
c_thread_buf.GetVectorTypeReference(Number<c_offset>{})
.template AsType<pk_fma_type>()[t]);
.template AsType<AccDataType>()(t);
c_acc_vec(t) =
__builtin_elementwise_fma(c_partial_acc, c_scale_thread, c_acc_vec(t));
anchor_accumulator_value(c_acc_vec(t));
});
});
}
Expand Down
Loading
Loading