|
@@ -500,7 +500,7 @@ static __global__ void dequantize_mul_mat_vec(const void * __restrict__ vx, cons
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void dequantize_mul_mat_vec_q4_0_cuda(const void * vx, const dfloat * y, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
|
static void dequantize_mul_mat_vec_q4_0_cuda(const void * vx, const dfloat * y, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
|
|
- GGML_ASSERT(ncols % GGML_CUDA_DMMV_X == 0);
|
|
|
|
|
|
|
+ GGML_ASSERT(ncols % (GGML_CUDA_DMMV_X*2) == 0);
|
|
|
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
|
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
|
|
// the number of rows may exceed maximum grid size in the y or z dimensions, use the x dimension instead
|
|
// the number of rows may exceed maximum grid size in the y or z dimensions, use the x dimension instead
|
|
|
const dim3 block_nums(block_num_y, 1, 1);
|
|
const dim3 block_nums(block_num_y, 1, 1);
|
|
@@ -510,7 +510,7 @@ static void dequantize_mul_mat_vec_q4_0_cuda(const void * vx, const dfloat * y,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void dequantize_mul_mat_vec_q4_1_cuda(const void * vx, const dfloat * y, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
|
static void dequantize_mul_mat_vec_q4_1_cuda(const void * vx, const dfloat * y, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
|
|
- GGML_ASSERT(ncols % GGML_CUDA_DMMV_X == 0);
|
|
|
|
|
|
|
+ GGML_ASSERT(ncols % (GGML_CUDA_DMMV_X*2) == 0);
|
|
|
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
|
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
|
|
const dim3 block_nums(block_num_y, 1, 1);
|
|
const dim3 block_nums(block_num_y, 1, 1);
|
|
|
const dim3 block_dims(WARP_SIZE, GGML_CUDA_MMV_Y, 1);
|
|
const dim3 block_dims(WARP_SIZE, GGML_CUDA_MMV_Y, 1);
|
|
@@ -519,7 +519,7 @@ static void dequantize_mul_mat_vec_q4_1_cuda(const void * vx, const dfloat * y,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void dequantize_mul_mat_vec_q5_0_cuda(const void * vx, const dfloat * y, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
|
static void dequantize_mul_mat_vec_q5_0_cuda(const void * vx, const dfloat * y, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
|
|
- GGML_ASSERT(ncols % GGML_CUDA_DMMV_X == 0);
|
|
|
|
|
|
|
+ GGML_ASSERT(ncols % (GGML_CUDA_DMMV_X*2) == 0);
|
|
|
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
|
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
|
|
const dim3 block_nums(block_num_y, 1, 1);
|
|
const dim3 block_nums(block_num_y, 1, 1);
|
|
|
const dim3 block_dims(WARP_SIZE, GGML_CUDA_MMV_Y, 1);
|
|
const dim3 block_dims(WARP_SIZE, GGML_CUDA_MMV_Y, 1);
|
|
@@ -528,7 +528,7 @@ static void dequantize_mul_mat_vec_q5_0_cuda(const void * vx, const dfloat * y,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void dequantize_mul_mat_vec_q5_1_cuda(const void * vx, const dfloat * y, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
|
static void dequantize_mul_mat_vec_q5_1_cuda(const void * vx, const dfloat * y, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
|
|
- GGML_ASSERT(ncols % GGML_CUDA_DMMV_X == 0);
|
|
|
|
|
|
|
+ GGML_ASSERT(ncols % (GGML_CUDA_DMMV_X*2) == 0);
|
|
|
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
|
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
|
|
const dim3 block_nums(block_num_y, 1, 1);
|
|
const dim3 block_nums(block_num_y, 1, 1);
|
|
|
const dim3 block_dims(WARP_SIZE, GGML_CUDA_MMV_Y, 1);
|
|
const dim3 block_dims(WARP_SIZE, GGML_CUDA_MMV_Y, 1);
|
|
@@ -537,7 +537,7 @@ static void dequantize_mul_mat_vec_q5_1_cuda(const void * vx, const dfloat * y,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void dequantize_mul_mat_vec_q8_0_cuda(const void * vx, const dfloat * y, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
|
static void dequantize_mul_mat_vec_q8_0_cuda(const void * vx, const dfloat * y, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
|
|
- GGML_ASSERT(ncols % GGML_CUDA_DMMV_X == 0);
|
|
|
|
|
|
|
+ GGML_ASSERT(ncols % (GGML_CUDA_DMMV_X*2) == 0);
|
|
|
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
|
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
|
|
const dim3 block_nums(block_num_y, 1, 1);
|
|
const dim3 block_nums(block_num_y, 1, 1);
|
|
|
const dim3 block_dims(WARP_SIZE, GGML_CUDA_MMV_Y, 1);
|
|
const dim3 block_dims(WARP_SIZE, GGML_CUDA_MMV_Y, 1);
|
|
@@ -588,7 +588,7 @@ static void dequantize_mul_mat_vec_q6_K_cuda(const void * vx, const float * y, f
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void convert_mul_mat_vec_f16_cuda(const void * vx, const dfloat * y, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
|
static void convert_mul_mat_vec_f16_cuda(const void * vx, const dfloat * y, float * dst, const int ncols, const int nrows, cudaStream_t stream) {
|
|
|
- GGML_ASSERT(ncols % GGML_CUDA_DMMV_X == 0);
|
|
|
|
|
|
|
+ GGML_ASSERT(ncols % (GGML_CUDA_DMMV_X*2) == 0);
|
|
|
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
|
const int block_num_y = (nrows + GGML_CUDA_MMV_Y - 1) / GGML_CUDA_MMV_Y;
|
|
|
const dim3 block_nums(block_num_y, 1, 1);
|
|
const dim3 block_nums(block_num_y, 1, 1);
|
|
|
const dim3 block_dims(WARP_SIZE, GGML_CUDA_MMV_Y, 1);
|
|
const dim3 block_dims(WARP_SIZE, GGML_CUDA_MMV_Y, 1);
|
|
@@ -672,3 +672,12 @@ void ggml_cuda_op_dequantize_mul_mat_vec(
|
|
|
GGML_UNUSED(src1_ncols);
|
|
GGML_UNUSED(src1_ncols);
|
|
|
GGML_UNUSED(src1_padded_row_size);
|
|
GGML_UNUSED(src1_padded_row_size);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+bool ggml_cuda_dmmv_type_supported(ggml_type src0_type) {
|
|
|
|
|
+ return src0_type == GGML_TYPE_Q4_0 || src0_type == GGML_TYPE_Q4_1 ||
|
|
|
|
|
+ src0_type == GGML_TYPE_Q5_0 || src0_type == GGML_TYPE_Q5_1 ||
|
|
|
|
|
+ src0_type == GGML_TYPE_Q8_0 || src0_type == GGML_TYPE_Q2_K ||
|
|
|
|
|
+ src0_type == GGML_TYPE_Q3_K || src0_type == GGML_TYPE_Q4_K ||
|
|
|
|
|
+ src0_type == GGML_TYPE_Q5_K || src0_type == GGML_TYPE_Q6_K ||
|
|
|
|
|
+ src0_type == GGML_TYPE_F16;
|
|
|
|
|
+}
|