@@ -145,8 +145,8 @@ using atom_load_B = Copy_Atom<traits_load_B, ElementB>;
145145using val_layout_load_B = decltype (make_layout(shape_div(typename traits_load_B::BlockShape{}, CopyThreadShape{})));
146146using Copy_B = decltype (make_tiled_copy(atom_load_B{}, Layout<CopyThreadShape>{}, val_layout_load_B{}));
147147
148- // using GmemTiledCopyScale = XE_2D_U16x1x32_LD_N; //XE_2D_U16x1x16_LD_N;
149- using GmemTiledCopyScale = XE_2D_U16x1x16_LD_N;
148+ using GmemTiledCopyScale = XE_2D_U16x1x32_LD_N; // XE_2D_U16x1x16_LD_N;
149+ // using GmemTiledCopyScale = XE_2D_U16x1x16_LD_N;
150150static constexpr auto SG_QNT_WIDTH = Int<SG_N >{};
151151using StrideScale = cute::Stride<_1, int64_t , int64_t >; // dynamic stride
152152using traits_load_scale = Copy_Traits<GmemTiledCopyScale, StrideScale>;
@@ -241,11 +241,11 @@ class kgemm_4bit_inference_cutlass_dequant {
241241 // if(syclcompat::global_id::x() == 2 && syclcompat::global_id::y() ==0 && syclcompat::global_id::z() ==0 )
242242 // printf("syclcompat::global_id::x() = %d, syclcompat::global_id::y() = %d, syclcompat::global_id::z() = %d, thread_idx = %d, i = %d, in[i].ptr_ = %x, in[i].idx_=%x, value_bit = %x, value = %d, quant_map[value] = %f, out[i] = %f\n",syclcompat::global_id::x(), syclcompat::global_id::y(), syclcompat::global_id::z(), thread_idx, i, in[i].ptr_, in[i].idx_, value, static_cast<int>(value), quant_map[value], static_cast<float>(out[i]));
243243 }
244- int scale_number = decltype ( size (tCrS_input))::value;
245- for ( int i= 0 ; i< scale_number; i++){
246- auto s_value = tCrS_input (i);
247- if ( cute::thread0 ()) printf ( " scale_number = %d, tCrS_input[%d] = %f \n " ,scale_number, i, s_value );
248- }
244+ }
245+ int scale_number = decltype ( size (tCrS_input))::value;
246+ for ( int i= 0 ; i<scale_number; i++){
247+ auto s_value = tCrS_input (i );
248+ if ( cute::thread0 ()) printf ( " scale_number = %d, tCrS_input[%d] = %f \n " ,scale_number, i, s_value);
249249 }
250250#else
251251 static constexpr auto N = decltype(size<1>(in))::value;
@@ -382,12 +382,14 @@ class kgemm_4bit_inference_cutlass_dequant {
382382 Tensor mma_B = make_tensor<ElementMMA>(make_fragment_layout (tiled_copy_b, tCgB (_,_,_,0 ).shape ()));
383383
384384 Tensor dequant_frag = make_tensor<ElementB>(mma_B.layout ());
385-
385+
386+ const int SubgroupSize = 16 ;
387+ const int SG_QNT_WIDTH = 32 ;
386388 static constexpr auto scale_traits_size = decltype (size (typename GmemTiledCopyScale::BlockShape{}))::value / SubgroupSize;
387- static constexpr auto scale_traits_num = SG_QNT_WIDTH / size<1 >(typename GmemTiledCopyScale::BlockShape{});
389+ static constexpr auto scale_traits_num = SG_QNT_WIDTH / decltype ( size<1 >(typename GmemTiledCopyScale::BlockShape{}))::value ;
388390 using FragScaleLayout = Layout<Shape<Int<scale_traits_size>, Int<scale_traits_num>, _1>>;
389391 Tensor fragment_scale = make_tensor<ElementScale>(FragScaleLayout{});
390- if (cute::thread0 ()) printf (" scale_traits_size = %d, scale_traits_num = %d, SG_QNT_WIDTH = %d\n " , scale_traits_size, scale_traits_num, SG_QNT_WIDTH );
392+ if (cute::thread0 ()) printf (" scale_traits_size = %d, scale_traits_num = %d, SG_QNT_WIDTH = %d, BlockShape = %d, BlockShape_1= %d \n " , scale_traits_size, scale_traits_num, SG_QNT_WIDTH , decltype ( size ( typename GmemTiledCopyScale::BlockShape{}))::value, decltype (size< 1 >( typename GmemTiledCopyScale::BlockShape{}))::value );
391393
392394 static_assert (std::is_same_v<typename decltype (dequant_frag)::value_type, ElementQuant>);
393395 static_assert (std::is_same_v<typename decltype (mma_A)::value_type, ElementMMA>);
@@ -403,6 +405,7 @@ class kgemm_4bit_inference_cutlass_dequant {
403405 Tensor tBgB = thr_copy_B.retile_S (tCgB);
404406
405407// // Prepare for prefetch
408+ const int BLK_K = 64 ;
406409 auto tiled_prefetch_a = cute::prefetch_selector<Shape<Int<BLK_M >,Int<BLK_K >>, Num_SGs>(tiled_copy_a);;
407410 auto tiled_prefetch_b = cute::prefetch_selector<Shape<Int<BLK_N >,Int<BLK_K >>, Num_SGs>(tiled_copy_b);;
408411 auto thr_prefetch_A = tiled_prefetch_a.get_slice (thread_idx);
@@ -413,22 +416,25 @@ class kgemm_4bit_inference_cutlass_dequant {
413416 auto pBgB = thr_prefetch_B.partition_S (gB );
414417
415418// Run mainloop
419+ const int BLK_N = 64 ;
420+ const int ATOM_N = 2 ;
421+ const int SG_N = 32 ;
416422 auto [m_idx, n_idx, k_idx, l_idx] = blk_coord_mnkl;
417423 const int n_coord_s = n_idx * BLK_N + (get_sub_group_id () % ATOM_N ) * SG_N ;
418424 const int l_coord_s = l_idx;
419425
420- if (cute::thread0 ()) printf (" m_idx = %d, n_idx = %d, k_idx = %d, l_idx = %d, n_coord_s = %d, l_coord_s = %d\n " ,m_idx, n_idx, k_idx, l_idx, n_coord_s, l_coord_s);
426+ if (cute::thread0 ()) printf (" get_sub_group_id() = %d, m_idx = %d, n_idx = %d, k_idx = %d, l_idx = %d, n_coord_s = %d, l_coord_s = %d\n " ,get_sub_group_id (), m_idx, n_idx, k_idx, l_idx, n_coord_s, l_coord_s);
421427
422428 auto copy_iter_s = [&](){
423429 return make_tensor (make_inttuple_iter (make_coord (n_coord_s, 0 , l_coord_s)),
424430 make_layout (make_shape (Int<scale_traits_size>{}, Int<scale_traits_num>{}, _1{}, k_tile_count),
425- make_stride (E<0 >{} * _16{}, E<0 >{} * size<1 >(typename GmemTiledCopyScale::BlockShape{}), _0{}, E<1 >{} * _1{})));
431+ make_stride (E<0 >{} * _16{}, E<0 >{} * decltype ( size<1 >(typename GmemTiledCopyScale::BlockShape{}))::value , _0{}, E<1 >{} * _1{})));
426432
427433 }();
428434#if 1
429435 #define PRINT (x ) print(#x " : " ); print(x); print(" \n " );
430436 if (cutlass::thread (LOG_THREAD , LOG_GROUP )) {
431- print (" ======================= A: \n " );
437+ print (" \n\n ======================= A: \n " );
432438 print (" gA : " ); print (gA ); print (" \n " );
433439 print (" tCgA : " ); print (tCgA); print (" \n " );
434440 print (" tAgA : " ); print (tAgA); print (" \n " );
@@ -457,7 +463,7 @@ class kgemm_4bit_inference_cutlass_dequant {
457463 print (" tiled_prefetch_a : " ); print (tiled_prefetch_a); print (" \n " );
458464 print (" tiled_prefetch_b : " ); print (tiled_prefetch_b); print (" \n " );
459465 print (" pAgA : " ); print (pAgA); print (" \n " );
460- print (" pBgB : " ); print (pBgB); print (" \n " );
466+ print (" pBgB : " ); print (pBgB); print (" \n\n\n " );
461467 }
462468 #undef PRINT
463469#endif
@@ -477,7 +483,7 @@ class kgemm_4bit_inference_cutlass_dequant {
477483 copy (tiled_copy_a, tAgA (_,_,_,k_tile), frag_copy_A);
478484 copy (tiled_copy_b, tBgB (_,_,_,k_tile), frag_copy_B);
479485
480- const int k_reload_factor = params.group_size / BLK_K ;
486+ const int k_reload_factor = ceil_div ( params.group_size , BLK_K ) ;
481487
482488 if (cute::thread0 ()) printf (" params.group_size = %d, BLK_K = %d, k_reload_factor = %d\n " ,params.group_size , BLK_K , k_reload_factor);
483489
@@ -591,14 +597,6 @@ void gemm_4bit_inference_cutlass_dequant(int m, int n, int k, T *A, unsigned cha
591597 auto mB_nkl = make_tensor (cute::subbyte_iterator<ElementB>(B), make_layout (make_shape (n, k, l), stride_B));
592598 Copy_B tiled_copy_b{Copy_B{}.with (mB_nkl )};
593599
594- #define PRINT (x ) print(#x " : " ); print(x); print(" \n " );
595- if (cutlass::thread (LOG_THREAD , LOG_GROUP )) {
596- print (" ===================== B :\n " );
597- print (" stride_B : " ); print (stride_B); print (" \n " );
598- print (" ===================== B :\n " );
599- }
600- #undef PRINT
601-
602600 params.tiled_copy_a = tiled_copy_a;
603601 params.tiled_copy_b = tiled_copy_b;
604602
@@ -607,12 +605,21 @@ void gemm_4bit_inference_cutlass_dequant(int m, int n, int k, T *A, unsigned cha
607605 std::cout<<" n = " <<n<<" k = " <<k<<" blocksize = " <<blocksize<<" scale_k = " <<scale_k<<std::endl;
608606
609607 auto mScale = make_tensor (
610- make_gmem_ptr (reinterpret_cast <ElementScale *>( absmax_) ),
608+ make_gmem_ptr (absmax_),
611609 make_layout (make_shape (n, scale_k, l), stride_S));
612610 Copy_Scale tiled_copy_scale{Copy_Scale{}.with (mScale )};
613611
614612 params.tiled_copy_scale = tiled_copy_scale;
615613
614+ #define PRINT (x ) print(#x " : " ); print(x); print(" \n " );
615+ if (cutlass::thread (LOG_THREAD , LOG_GROUP )) {
616+ print (" ===================== B :\n " );
617+ print (" stride_B : " ); print (stride_B); print (" \n " );
618+ print (" stride_S : " ); print (stride_S); print (" \n " );
619+ print (" ===================== B :\n " );
620+ }
621+ #undef PRINT
622+
616623 cutlass::KernelHardwareInfo hw_info;
617624 hw_info.sm_count = cutlass::KernelHardwareInfo::query_device_multiprocessor_count (hw_info.device_id );
618625 auto problem_shape_MNKL = append<4 >(problem_size, 1 );
0 commit comments