Skip to content

Commit cbc1808

Browse files
committed
Revert "CUDA: mul_mat_v support for batch sizes > 1 (ggml-org#14262)"
This reverts commit defe215.
1 parent 1316a4d commit cbc1808

File tree

4 files changed

+103
-256
lines changed

4 files changed

+103
-256
lines changed

ggml/src/ggml-cuda/common.cuh

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -266,10 +266,6 @@ static bool fp16_mma_hardware_available(const int cc) {
266266
GGML_CUDA_CC_IS_CDNA(cc) || GGML_CUDA_CC_IS_RDNA3(cc) || GGML_CUDA_CC_IS_RDNA4(cc);
267267
}
268268

269-
static bool bf16_mma_hardware_available(const int cc) {
270-
return GGML_CUDA_CC_IS_NVIDIA(cc) && cc >= GGML_CUDA_CC_AMPERE;
271-
}
272-
273269
// Volta technically had FP16 tensor cores but they work very differently compared to Turing and later.
274270
static bool new_mma_available(const int cc) {
275271
return GGML_CUDA_CC_IS_NVIDIA(cc) && ggml_cuda_highest_compiled_arch(cc) >= GGML_CUDA_CC_TURING;

ggml/src/ggml-cuda/ggml-cuda.cu

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1944,14 +1944,16 @@ static void ggml_cuda_mul_mat(ggml_backend_cuda_context & ctx, const ggml_tensor
19441944
&& ggml_nbytes(src0) != ggml_backend_buffer_get_alloc_size(src0->buffer, src0) && src0->view_src;
19451945

19461946
bool use_mul_mat_vec = (src0->type == GGML_TYPE_F32 || src0->type == GGML_TYPE_F16 || src0->type == GGML_TYPE_BF16)
1947-
&& src1->type == GGML_TYPE_F32 && dst->type == GGML_TYPE_F32;
1947+
&& src1->type == GGML_TYPE_F32 && dst->type == GGML_TYPE_F32
1948+
&& src0->ne[0] % 2 == 0 && src1->ne[1] == 1;
19481949
bool use_mul_mat_vec_q = ggml_is_quantized(src0->type) && !bad_padding_clear
19491950
&& src1->type == GGML_TYPE_F32 && dst->type == GGML_TYPE_F32
19501951
&& src1->ne[1] <= MMVQ_MAX_BATCH_SIZE;
19511952
bool use_mul_mat_q = ggml_is_quantized(src0->type) && !bad_padding_clear
19521953
&& src1->type == GGML_TYPE_F32 && dst->type == GGML_TYPE_F32;
19531954

1954-
bool any_gpus_with_slow_fp16 = false;
1955+
bool any_gpus_with_slow_fp16 = false;
1956+
bool any_gpus_without_fp16_mma = false;
19551957

19561958
if (split) {
19571959
ggml_backend_cuda_split_buffer_type_context * buft_ctx = (ggml_backend_cuda_split_buffer_type_context *) src0->buffer->buft->context;
@@ -1962,16 +1964,16 @@ static void ggml_cuda_mul_mat(ggml_backend_cuda_context & ctx, const ggml_tensor
19621964
continue;
19631965
}
19641966

1965-
const int cc = ggml_cuda_info().devices[id].cc;
1966-
use_mul_mat_q = use_mul_mat_q && ggml_cuda_should_use_mmq(src0->type, cc, src1->ne[1]);
1967-
use_mul_mat_vec = use_mul_mat_vec && ggml_cuda_should_use_mmv(src0->type, cc, src0->ne, src1->ne[1]);
1968-
any_gpus_with_slow_fp16 = any_gpus_with_slow_fp16 || !fast_fp16_hardware_available(cc);
1967+
const int cc = ggml_cuda_info().devices[id].cc;
1968+
use_mul_mat_q = use_mul_mat_q && ggml_cuda_should_use_mmq(src0->type, cc, src1->ne[1]);
1969+
any_gpus_with_slow_fp16 = any_gpus_with_slow_fp16 || !fast_fp16_hardware_available(cc);
1970+
any_gpus_without_fp16_mma = any_gpus_without_fp16_mma || !fp16_mma_hardware_available(cc);
19691971
}
19701972
} else {
1971-
const int cc = ggml_cuda_info().devices[ctx.device].cc;
1972-
use_mul_mat_q = use_mul_mat_q && ggml_cuda_should_use_mmq(src0->type, cc, src1->ne[1]);
1973-
use_mul_mat_vec = use_mul_mat_vec && ggml_cuda_should_use_mmv(src0->type, cc, src0->ne, src1->ne[1]);
1974-
any_gpus_with_slow_fp16 = any_gpus_with_slow_fp16 || !fast_fp16_hardware_available(cc);
1973+
const int cc = ggml_cuda_info().devices[ctx.device].cc;
1974+
use_mul_mat_q = use_mul_mat_q && ggml_cuda_should_use_mmq(src0->type, cc, src1->ne[1]);
1975+
any_gpus_with_slow_fp16 = any_gpus_with_slow_fp16 || !fast_fp16_hardware_available(cc);
1976+
any_gpus_without_fp16_mma = any_gpus_without_fp16_mma || !fp16_mma_hardware_available(cc);
19751977
}
19761978

19771979
// debug helpers
@@ -1982,7 +1984,7 @@ static void ggml_cuda_mul_mat(ggml_backend_cuda_context & ctx, const ggml_tensor
19821984
//printf("src0 is contiguous %d, transposed %d, type = %s, name = %s\n", ggml_is_contiguous(src0), ggml_is_transposed(src0), ggml_type_name(src0->type), src0->name);
19831985
//printf("src1 is contiguous %d, transposed %d, type = %s, name = %s\n", ggml_is_contiguous(src1), ggml_is_transposed(src1), ggml_type_name(src1->type), src1->name);
19841986

1985-
if (!split && use_mul_mat_vec) {
1987+
if (!split && use_mul_mat_vec && (src0->ne[1] <= MMV_MAX_ROWS || any_gpus_without_fp16_mma)) {
19861988
// the custom F16 vector kernel can be used over batched cuBLAS GEMM
19871989
// but this is only faster for GPUs without tensor cores or with a thin src0 matrix (particularly KQV in attention)
19881990
ggml_cuda_mul_mat_vec(ctx, src0, src1, nullptr, dst);

0 commit comments

Comments
 (0)