Skip to content

Commit 94e44e3

Browse files
committed
save code
1 parent 7b7abec commit 94e44e3

1 file changed

Lines changed: 61 additions & 11 deletions

File tree

csrc/xpu_cutlass_fusion.cpp

Lines changed: 61 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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
274284
auto 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

Comments
 (0)