@@ -230,20 +230,29 @@ class gemm_4bit_cutlass_kernel {
230230 Tensor mma_B = make_tensor<ElementMMA>(make_fragment_layout (params.tiled_copy_b , tCgB (_,_,_,0 ).shape ()));
231231
232232 // Tensor dequant_frag = make_tensor<ElementB>(mma_B.layout());
233- using DequantLayout = Layout<Shape<_16, _1, _4>>;
234- Tensor dequant_frag = make_tensor<ElementB>(DequantLayout{});
233+
234+ // using DequantLayout = Layout<Shape<_16, _1, _4>>;
235+ // Tensor dequant_frag = make_tensor<ElementB>(DequantLayout{});
236+
237+ // using DequantLayout = Layout<Shape<_16, _1, _4>>;
238+ // ElementB* slm_B = reinterpret_cast<ElementB*>(smem_buf) + thread_idx * 64;
239+ // Tensor dequant_frag = make_tensor<ElementB>(cute::make_smem_ptr(slm_B), DequantLayout{});
240+
241+ // ElementB* slm_B = reinterpret_cast<ElementB*>(smem_buf) + thread_idx * 64;
242+ // const uint8_t* gB_ptr = cute::raw_pointer_cast(thr_copy_B.retile_S(tBgB).data());
243+ // *reinterpret_cast<sycl::vec<uint64_t, vec64_per_thread>*>(slm_B) = *reinterpret_cast<const sycl::vec<uint64_t, vec64_per_thread>*>(gB_ptr);
235244
236245 static constexpr auto scale_traits_size = decltype (size (typename GmemTiledCopyScale::BlockShape{}))::value / DispatchPolicy::SubgroupSize;
237246 static constexpr auto scale_traits_num = SG_QNT_WIDTH / decltype (size<1 >(typename GmemTiledCopyScale::BlockShape{}))::value;
238247 using FragScaleLayout = Layout<Shape<Int<scale_traits_size>, Int<scale_traits_num>, _1>>;
239248 Tensor fragment_scale = make_tensor<ElementScale>(FragScaleLayout{});
240249
241- static_assert (std::is_same_v<typename decltype (dequant_frag)::value_type, ElementQuant>);
250+ // static_assert(std::is_same_v<typename decltype(dequant_frag)::value_type, ElementQuant>);
242251 static_assert (std::is_same_v<typename decltype (mma_A)::value_type, ElementMMA>);
243252 static_assert (std::is_same_v<typename decltype (mma_B)::value_type, ElementMMA>);
244253
245254 Tensor frag_copy_A = thr_copy_A.retile_D (mma_A);
246- Tensor frag_copy_B = thr_copy_B.retile_D (dequant_frag);
255+ // Tensor frag_copy_B = thr_copy_B.retile_D(dequant_frag);
247256 Tensor frag_copy_Scale = thr_copy_scale.retile_D (fragment_scale);
248257
249258 Tensor tAgA = thr_copy_A.retile_S (tCgA);
@@ -271,6 +280,7 @@ class gemm_4bit_cutlass_kernel {
271280 int prefetch_k = k_start_idx;
272281
273282#if 1
283+ #if 0
274284auto dequant = [&] {
275285 constexpr int N = decltype(cute::size<1>(mma_B))::value;
276286 constexpr int K = decltype(cute::size(mma_B))::value / N;
@@ -283,13 +293,14 @@ auto dequant = [&] {
283293 constexpr int ELEMS_PER_THREAD = vec_size * compress_size; // 64
284294 constexpr int ELEMS_PER_BANK = (ELEMS_PER_THREAD + BANK_NUM - 1) / BANK_NUM; // 2
285295
296+ //const ElementB* gB_ptr = params.B + gB(n_coord, idx2crd(k_tile, make_shape(params.k)), 0).offset();
297+ ElementB* slm_B = reinterpret_cast<ElementB*>(smem_buf) + thread_idx * 512 ;
298+ *reinterpret_cast<sycl::vec<uint64_t, 4>*>(slm_B) = *reinterpret_cast<const sycl::vec<uint64_t, 4>*>(gB_ptr);
299+
286300 compress_type src[vec_size];
287- *reinterpret_cast <sycl::vec<compress_type, vec_size>*>(src) =
288- *reinterpret_cast <const sycl::vec<compress_type, vec_size>*>(
289- cute::raw_pointer_cast (dequant_frag.data ()));
301+ *reinterpret_cast<sycl::vec<compress_type, vec_size>*>(src) = *reinterpret_cast<const sycl::vec<compress_type, vec_size>*>(slm_B);
290302
291- const int tid = thread_idx;
292- ElementMMA* private_slm = reinterpret_cast <ElementMMA*>(smem_buf) + tid * ELEMS_PER_THREAD ; // 每个线程一段 **连续** 128 B,天然 128 B 对齐
303+ ElementMMA* private_slm = reinterpret_cast<ElementMMA*>(slm_B) + thread_idx * ELEMS_PER_THREAD; // 每个线程一段 **连续** 128 B,天然 128 B 对齐
293304
294305 float scale_value = fragment_scale(0);
295306
@@ -306,6 +317,7 @@ auto dequant = [&] {
306317
307318 *reinterpret_cast<sycl::vec<int64_t, 16>*>(cute::raw_pointer_cast(mma_B.data())) = *reinterpret_cast<const sycl::vec<int64_t, 16>*>(private_slm);
308319};
320+ #endif
309321#else
310322#if 1
311323 auto dequant = [&] {
@@ -363,9 +375,46 @@ auto dequant = [&] {
363375 }
364376
365377 for (int k_tile = k_start_idx, k_s = 0 ; k_tile < k_tile_count; k_tile++, k_s++, prefetch_k++) {
366- copy (params.tiled_copy_b , tBgB (_,_,_,k_tile), frag_copy_B);
378+ // copy(params.tiled_copy_b, tBgB(_,_,_,k_tile), frag_copy_B);
367379 copy (params.tiled_copy_scale , tSgS (_, _, _, (k_start_idx + k_s) / k_reload_factor), frag_copy_Scale);
368380 // barrier_wait(3);
381+ const uint8_t * gB_ptr = params.B + cute::get<0 >(gB .layout ()(make_coord (n_coord, k_tile, 0 )));
382+ auto dequant = [&] {
383+ constexpr int N = decltype (cute::size<1 >(mma_B))::value;
384+ constexpr int K = decltype (cute::size (mma_B))::value / N;
385+
386+ using compress_type = uint32_t ;
387+ constexpr int compress_size = 32 / cute::sizeof_bits_v<ElementB>;
388+ constexpr int vec_size = K / compress_size;
389+
390+ constexpr int BANK_NUM = 32 ; // Intel SLM bank 数
391+ constexpr int ELEMS_PER_THREAD = vec_size * compress_size; // 64
392+ constexpr int ELEMS_PER_BANK = (ELEMS_PER_THREAD + BANK_NUM - 1 ) / BANK_NUM ; // 2
393+
394+ // const ElementB* gB_ptr = params.B + gB(n_coord, idx2crd(k_tile, make_shape(params.k)), 0).offset();
395+ ElementB* slm_B = reinterpret_cast <ElementB*>(smem_buf) + thread_idx * 512 ;
396+ *reinterpret_cast <sycl::vec<uint64_t , 4 >*>(slm_B) = *reinterpret_cast <const sycl::vec<uint64_t , 4 >*>(gB_ptr );
397+
398+ compress_type src[vec_size];
399+ *reinterpret_cast <sycl::vec<compress_type, vec_size>*>(src) = *reinterpret_cast <const sycl::vec<compress_type, vec_size>*>(slm_B);
400+
401+ ElementMMA* private_slm = reinterpret_cast <ElementMMA*>(slm_B) + thread_idx * ELEMS_PER_THREAD ; // 每个线程一段 **连续** 128 B,天然 128 B 对齐
402+
403+ float scale_value = fragment_scale (0 );
404+
405+ #pragma unroll
406+ for (int i = 0 ; i < vec_size; ++i) {
407+ #pragma unroll
408+ for (int j = 0 ; j < compress_size; ++j) {
409+ uint8_t bit_value = (src[i] >> (4 * (((j+1 ) & 1 ) + (j >> 1 ) * 2 ))) & 0xF ;
410+ // uint8_t bit_value = (src[i] >> (4 * ((j+1)%2 + (j/2)*2))) & 0xf;
411+ private_slm[i * compress_size + j] =
412+ static_cast <ElementMMA>(quant_map[bit_value] * scale_value);
413+ }
414+ }
415+
416+ *reinterpret_cast <sycl::vec<int64_t , 16 >*>(cute::raw_pointer_cast (mma_B.data ())) = *reinterpret_cast <const sycl::vec<int64_t , 16 >*>(private_slm);
417+ };
369418 dequant ();
370419 copy (params.tiled_copy_a , tAgA (_,_,_,k_tile), frag_copy_A);
371420
@@ -405,7 +454,8 @@ void gemm_4bit_cutlass(int m, int n, int k, int l, T *A, unsigned char *B,
405454
406455 using GemmKernel = gemm_4bit_cutlass_kernel<T, BITS >;
407456
408- static constexpr int smem_size= BLK_N * BLK_K * 16 /8 ; // (16+1)*32/8;
457+ // static constexpr int smem_size= BLK_N * BLK_K * 16/8; //(16+1)*32/8;
458+ static constexpr int smem_size = BLK_N * BLK_K * sizeof (ElementB) + BLK_N * BLK_K * sizeof (ElementMMA);
409459 size_t max_slm_size = q.get_device ().get_info <sycl::info::device::local_mem_size>();
410460 assert (smem_size <= max_slm_size);
411461
0 commit comments