Skip to content

Commit 6849bf1

Browse files
committed
enable multi-batch
1 parent bdfe1ec commit 6849bf1

5 files changed

Lines changed: 23 additions & 17 deletions

File tree

bitsandbytes/backends/xpu/ops.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,14 @@ def _gemv_4bit_impl(
7474
blocksize: int,
7575
out: torch.Tensor,
7676
) -> None:
77+
#import pdb
7778
m = ct.c_int32(A.shape[-2])#ct.c_int32(1)
7879
n = ct.c_int32(shapeB[0])
7980
k = ct.c_int32(shapeB[1])
80-
#import pdb
81+
l = 1
82+
#pdb.set_trace()
83+
if A.dim() == 3:
84+
l = A.shape[0]
8185
lda = m
8286
ldb = ct.c_int32((A.shape[-1] + 1) // 2)
8387
ldc = m
@@ -106,6 +110,7 @@ def _gemv_4bit_impl(
106110
m,
107111
n,
108112
k,
113+
l,
109114
get_ptr(A),
110115
get_ptr(B),
111116
get_ptr(absmax),

csrc/pythonInterface.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -381,10 +381,10 @@ void gemv_4bit_inference_fp16(
381381

382382
#if 1
383383
void gemm_4bit_inference_bf16(
384-
int m, int n, int k, sycl::ext::oneapi::bfloat16 * A, unsigned char* B, float *absmax, float *datatype, float * out,
384+
int m, int n, int k, int l, sycl::ext::oneapi::bfloat16 * A, unsigned char* B, float *absmax, float *datatype, float * out,
385385
int lda, int ldb, int ldc, int blocksize, sycl::queue* stream
386386
) {
387-
gemm_4bit_inference_cutlass_dequant<sycl::ext::oneapi::bfloat16, 16>(m, n, k, A, B, absmax, datatype, out, lda, ldb, ldc, blocksize, stream);
387+
gemm_4bit_inference_cutlass_dequant<sycl::ext::oneapi::bfloat16, 16>(m, n, k, l, A, B, absmax, datatype, out, lda, ldb, ldc, blocksize, stream);
388388
}
389389
#endif
390390

@@ -826,10 +826,10 @@ void cgemv_4bit_inference_fp16(
826826

827827
#if 1
828828
void cgemv_4bit_inference_bf16(
829-
int m, int n, int k, sycl::ext::oneapi::bfloat16 * A, unsigned char* B, float *absmax, float *datatype,
829+
int m, int n, int k, int l, sycl::ext::oneapi::bfloat16 * A, unsigned char* B, float *absmax, float *datatype,
830830
float * out, int lda, int ldb, int ldc, int blocksize, sycl::queue* stream
831831
) {
832-
gemm_4bit_inference_bf16(m, n, k, A, B, absmax, datatype, out, lda, ldb, ldc, blocksize, stream);
832+
gemm_4bit_inference_bf16(m, n, k, l, A, B, absmax, datatype, out, lda, ldb, ldc, blocksize, stream);
833833
}
834834
#else
835835
void cgemv_4bit_inference_bf16(

csrc/xpu_cutlass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ void gemv_4bit_inference_cutlass_cute(int m, int n, int k, T *A, T *B,
108108
int ldb, int ldc, int blocksize, sycl::queue *stream);
109109

110110
template <typename T, int BITS>
111-
void gemm_4bit_inference_cutlass_dequant(int m, int n, int k, T *A, unsigned char *B,
111+
void gemm_4bit_inference_cutlass_dequant(int m, int n, int k, int l, T *A, unsigned char *B,
112112
float *absmax, float *datatype, float *out, int lda,
113113
int ldb, int ldc, int blocksize, sycl::queue *stream);
114114

csrc/xpu_cutlass_fusion.cpp

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ class kgemm_4bit_inference_cutlass_dequant {
163163
};
164164

165165
struct Params {
166-
int m, n, k;
166+
int m, n, k, l;
167167
T* A;
168168
uint8_t* B;
169169
float* out;
@@ -278,7 +278,7 @@ class kgemm_4bit_inference_cutlass_dequant {
278278
int M = params.m;
279279
int N = params.n;
280280
int K = params.k;
281-
int L = 1;
281+
int L = params.l;
282282

283283
//Total Threads number
284284
static constexpr auto Num_SGs = ATOM_N * ATOM_M * ATOM_K; //32 //2
@@ -336,7 +336,7 @@ class kgemm_4bit_inference_cutlass_dequant {
336336
Tensor mB_nkl = cute::get_pvc_tensor(make_shape(N,K,L)); //coordinate tensor: 0,1,2....
337337

338338
Tensor gA = local_tile(mA_mkl, select<0,2>(blk_shape), make_coord(m_coord,_,l_coord));
339-
Tensor gB = local_tile(mB_nkl, select<1,2>(blk_shape), make_coord(n_coord,_,l_coord));
339+
Tensor gB = local_tile(mB_nkl, select<1,2>(blk_shape), make_coord(n_coord,_,0));
340340

341341
//// Allocate the tiled_mma and the accumulators for the (M,N) subgroup_tile_shape
342342
TiledMma tiled_mma;
@@ -401,7 +401,7 @@ class kgemm_4bit_inference_cutlass_dequant {
401401
auto thr_vmnk = thr_mma.thr_vmnk_;
402402
int S_offset = get<2>(thr_vmnk)*SG_QNT_WIDTH;
403403
auto tSgS = [&](){
404-
return make_tensor(make_inttuple_iter(make_coord(n_coord * BLK_N + S_offset, 0, l_coord)),
404+
return make_tensor(make_inttuple_iter(make_coord(n_coord * BLK_N + S_offset, 0, 0)),
405405
make_layout(make_shape(Int<scale_traits_size>{}, Int<scale_traits_num>{}, _1{}, k_tile_count/k_reload_factor),
406406
make_stride(E<0>{}*_16{}, E<0>{}*_16{}, _0{}, E<1>{}*_1{})));
407407

@@ -421,7 +421,7 @@ class kgemm_4bit_inference_cutlass_dequant {
421421
//}
422422
#if 0
423423
#define PRINT(x) print(#x ": "); print(x); print("\n");
424-
if (thread_idx==16 && n_coord == 0) { //)(cutlass::thread(LOG_THREAD, LOG_GROUP)) {
424+
if (thread_idx==16 && n_coord == 0 && l_coord==1) { //)(cutlass::thread(LOG_THREAD, LOG_GROUP)) {
425425
print("\n\n======================= A: \n");
426426
print(" gA : "); print(gA); print("\n");
427427
print(" tCgA : "); print(tCgA); print("\n");
@@ -578,7 +578,7 @@ printf("\n");
578578
};
579579

580580
template <typename T, int BITS>
581-
void gemm_4bit_inference_cutlass_dequant(int m, int n, int k, T *A, unsigned char *B,
581+
void gemm_4bit_inference_cutlass_dequant(int m, int n, int k, int l, T *A, unsigned char *B,
582582
float *absmax_, float *datatype, float *out, int lda,
583583
int ldb, int ldc, int blocksize, sycl::queue *stream) {
584584
////std::cout<<"this is gemm_4bit_inference_cutlass_dequant ......................!!!!!!\n";
@@ -599,7 +599,7 @@ void gemm_4bit_inference_cutlass_dequant(int m, int n, int k, T *A, unsigned cha
599599

600600
//static constexpr int smem_size= 512; // (16 * 32) for quant_map
601601
static constexpr int smem_size= 256; // (16 * 16) for quant_map
602-
int l = 1;
602+
//int l = 1;
603603

604604
auto problem_size = ProblemShape{m, n, k, l};
605605

@@ -610,6 +610,7 @@ void gemm_4bit_inference_cutlass_dequant(int m, int n, int k, T *A, unsigned cha
610610
params.m = m;
611611
params.n = n;
612612
params.k = k;
613+
params.l = l;
613614
params.A = A;
614615
params.B = B;
615616
params.out = out;
@@ -629,9 +630,9 @@ void gemm_4bit_inference_cutlass_dequant(int m, int n, int k, T *A, unsigned cha
629630
params.tiled_copy_b = tiled_copy_b;
630631

631632
const int scale_k = cute::ceil_div(k, blocksize);
632-
StrideScale stride_S = cutlass::make_cute_packed_stride(StrideScale{}, cute::make_shape(n, scale_k, l));
633+
StrideScale stride_S = cutlass::make_cute_packed_stride(StrideScale{}, cute::make_shape(n, scale_k, 1));
633634
//std::cout<<"m = "<<m<<" n = "<<n<<" k = "<<k<<" blocksize = "<<blocksize<<" scale_k = "<<scale_k<<std::endl;
634-
auto mScale = make_tensor(make_gmem_ptr(absmax_), make_layout(make_shape(n, scale_k, l), stride_S));
635+
auto mScale = make_tensor(make_gmem_ptr(absmax_), make_layout(make_shape(n, scale_k, 1), stride_S));
635636
Copy_Scale tiled_copy_scale{Copy_Scale{}.with(mScale)};
636637

637638
params.tiled_copy_scale = tiled_copy_scale;
@@ -701,7 +702,7 @@ void gemm_4bit_inference_cutlass_dequant(int m, int n, int k, T *A, unsigned cha
701702
}
702703

703704
template void gemm_4bit_inference_cutlass_dequant<sycl::ext::oneapi::bfloat16, 16>(
704-
int m, int n, int k, sycl::ext::oneapi::bfloat16 *A, unsigned char *B,
705+
int m, int n, int k, int l, sycl::ext::oneapi::bfloat16 *A, unsigned char *B,
705706
float *absmax, float *datatype, float *out, int lda,
706707
int ldb, int ldc, int blocksize, sycl::queue *stream);
707708

tests/test_xpu.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ def test_gemv_4bit(self, device, dim, dtype, storage_type, quant_storage, double
282282
for i in range(iters):
283283
#pdb.set_trace()
284284
if kind == "fc1":
285-
A = torch.randn(dim, dim, dtype=dtype, device=device)
285+
A = torch.randn(2, dim, dim, dtype=dtype, device=device)
286286
B = torch.randn(dim * 4, dim, dtype=dtype, device=device) / math.sqrt(dim)
287287
elif kind == "fc2":
288288
A = torch.randn(dim, 4 * dim, dtype=dtype, device=device)

0 commit comments

Comments
 (0)