@@ -742,35 +742,6 @@ __launch_bounds__(512, 1) __global__ static void group_row_col_rht_gemm_device_g
742742 shape_rep, num_tensors, scheduler.tile_n_base () * size<1 >(epilogue_tiler),
743743 /* cached_id=*/ 0 , packed_N, M, shared_storage.group_offsets , tensor_range_cache);
744744
745- // Determine quantization scale factor layouts/output splits for this group
746- TSFDLayout sfd_layout;
747- int cur_N = shared_storage.group_first_dims [group_idx];
748- if constexpr (kEnableSwizzleSFOutput ) {
749- sfd_layout = tile_to_shape (SwizzledSFDLayoutAtom{}, make_shape (M, cur_N), Step<_2, _1>{});
750- } else {
751- sfd_layout = make_layout (make_shape (M, make_shape (Int<SFVecSize>{}, cur_N / SFVecSize)),
752- make_stride (cur_N / SFVecSize, make_stride (_0{}, _1{})));
753- }
754- // Build output tensors for columns and their quant scales
755- // TODO(zhongbo): double check the logic here
756- int64_t group_elem_offset = shared_storage.group_offsets [group_idx];
757- Tensor mD = make_tensor (cute::subbyte_iterator<TD >(reinterpret_cast <TD *>(
758- reinterpret_cast <char *>(QA_COLWISE ) + group_elem_offset / 2 )),
759- make_shape (M, cur_N), DStride{}); // (M,packed_N)
760- Tensor gD_mn = local_tile (mD , epilogue_tiler, make_coord (_, _, _),
761- Step<_1, _1, X>{}); // (BLK_M,BLK_N)
762-
763- // for every tensor [x, y] row major, x y both a multiple of 128
764- // both of its rowwise and colwise scaling factors will have exactly x * y / 16 elements in FP8 E4M3
765- Tensor mSFD = make_tensor (
766- make_gmem_ptr<TSFD >(reinterpret_cast <TSFD *>(reinterpret_cast <char *>(SFA_COLWISE ) +
767- group_elem_offset / kNVFP4BlockSize )),
768- sfd_layout);
769- Tensor gSFD_mn = local_tile (mSFD , epilogue_tiler, make_coord (_, _, _),
770- Step<_1, _1, X>{}); // (BLK_M,BLK_N)
771-
772- Tensor gD_mn_view = tiled_divide (gD_mn , take<0 , 2 >(epilogue_tiler));
773-
774745 // Setup tile-level TMEM (t2r) and global memory (r2g) copy descriptors
775746 auto tiled_t2r = make_tmem_copy (TMEM_LOAD_NEW {}, bulk_tmem_epilogue (_, _, _, _0{}));
776747 auto tiled_r2g =
@@ -819,32 +790,39 @@ __launch_bounds__(512, 1) __global__ static void group_row_col_rht_gemm_device_g
819790 c_global_amax_val);
820791 global_decode_scale = 1 .0f / global_encode_scale;
821792 global_encode_scale_multiplier = global_encode_scale * fp4_max_inv;
822- // TODO(zhongbo): double check the logic here
823- cur_N = shared_storage.group_first_dims [group_idx];
824- if constexpr (kEnableSwizzleSFOutput ) {
825- sfd_layout =
826- tile_to_shape (SwizzledSFDLayoutAtom{}, make_shape (M, cur_N), Step<_2, _1>{});
827- } else {
828- sfd_layout =
829- make_layout (make_shape (M, make_shape (Int<SFVecSize>{}, cur_N / SFVecSize)),
830- make_stride (cur_N / SFVecSize, make_stride (_0{}, _1{})));
831- }
832- // update tensor
833- group_elem_offset = shared_storage.group_offsets [group_idx];
834- mD = make_tensor (cute::subbyte_iterator<TD >(reinterpret_cast <TD *>(
835- reinterpret_cast <char *>(QA_COLWISE ) + group_elem_offset / 2 )),
836- make_shape (M, cur_N), DStride{});
837- gD_mn = local_tile (mD , epilogue_tiler, make_coord (_, _, _),
838- Step<_1, _1, X>{}); // (BLK_M,BLK_N)
839- mSFD = make_tensor (make_gmem_ptr<TSFD >(reinterpret_cast <TSFD *>(
840- reinterpret_cast <char *>(SFA_COLWISE ) +
841- group_elem_offset / kNVFP4BlockSize )),
842- sfd_layout);
843- gSFD_mn = local_tile (mSFD , epilogue_tiler, make_coord (_, _, _),
844- Step<_1, _1, X>{}); // (BLK_M,BLK_N)
845-
846- gD_mn_view = tiled_divide (gD_mn , take<0 , 2 >(epilogue_tiler));
847793 }
794+ // Determine quantization scale factor layouts/output splits for this group
795+ TSFDLayout sfd_layout;
796+ const int cur_N = shared_storage.group_first_dims [group_idx];
797+ if constexpr (kEnableSwizzleSFOutput ) {
798+ sfd_layout =
799+ tile_to_shape (SwizzledSFDLayoutAtom{}, make_shape (M, cur_N), Step<_2, _1>{});
800+ } else {
801+ sfd_layout =
802+ make_layout (make_shape (M, make_shape (Int<SFVecSize>{}, cur_N / SFVecSize)),
803+ make_stride (cur_N / SFVecSize, make_stride (_0{}, _1{})));
804+ }
805+ // Build output tensors for columns and their quant scales
806+ // TODO(zhongbo): double check the logic here
807+ const int64_t group_elem_offset = shared_storage.group_offsets [group_idx];
808+ Tensor mD = make_tensor (
809+ cute::subbyte_iterator<TD >(reinterpret_cast <TD *>(
810+ reinterpret_cast <char *>(QA_COLWISE ) + group_elem_offset / 2 )),
811+ make_shape (M, cur_N), DStride{}); // (M,packed_N)
812+ Tensor gD_mn = local_tile (mD , epilogue_tiler, make_coord (_, _, _),
813+ Step<_1, _1, X>{}); // (BLK_M,BLK_N)
814+
815+ // for every tensor [x, y] row major, x y both a multiple of 128
816+ // both of its rowwise and colwise scaling factors will have exactly x * y / 16 elements in FP8 E4M3
817+ Tensor mSFD = make_tensor (
818+ make_gmem_ptr<TSFD >(reinterpret_cast <TSFD *>(
819+ reinterpret_cast <char *>(SFA_COLWISE ) + group_elem_offset / kNVFP4BlockSize )),
820+ sfd_layout);
821+ Tensor gSFD_mn = local_tile (mSFD , epilogue_tiler, make_coord (_, _, _),
822+ Step<_1, _1, X>{}); // (BLK_M,BLK_N)
823+
824+ Tensor gD_mn_view = tiled_divide (gD_mn , take<0 , 2 >(epilogue_tiler));
825+
848826 int local_tile_n_idx =
849827 (global_tile_n_offset - tensor_range_cache.begin ) / size<1 >(epilogue_tiler);
850828 Tensor tDgD_mn = gD_mn_view (_, _, _, tile_m, local_tile_n_idx);
0 commit comments