| 7535 | } |
| 7536 | |
| 7537 | size_t ggml_quantize_chunk( |
| 7538 | enum ggml_type type, |
| 7539 | const float * src, |
| 7540 | void * dst, |
| 7541 | int64_t start, |
| 7542 | int64_t nrows, |
| 7543 | int64_t n_per_row, |
| 7544 | const float * imatrix) { |
| 7545 | const int64_t n = (int64_t) nrows * n_per_row; |
| 7546 | |
| 7547 | if (ggml_quantize_requires_imatrix(type)) { |
| 7548 | GGML_ASSERT(imatrix != NULL); |
| 7549 | } |
| 7550 | |
| 7551 | GGML_ASSERT(start % type_traits[type].blck_size == 0); |
| 7552 | GGML_ASSERT(start % n_per_row == 0); |
| 7553 | |
| 7554 | ggml_quantize_init(type); // this is noop if already initialized |
| 7555 | |
| 7556 | const size_t start_row = start / n_per_row; |
| 7557 | const size_t row_size = ggml_row_size(type, n_per_row); |
| 7558 | |
| 7559 | size_t result = 0; |
| 7560 | |
| 7561 | switch (type) { |
| 7562 | case GGML_TYPE_Q4_0: result = quantize_q4_0(src + start, (char *) dst + start_row * row_size, nrows, n_per_row, imatrix); break; |
| 7563 | case GGML_TYPE_Q4_1: result = quantize_q4_1(src + start, (char *) dst + start_row * row_size, nrows, n_per_row, imatrix); break; |
| 7564 | case GGML_TYPE_Q5_0: result = quantize_q5_0(src + start, (char *) dst + start_row * row_size, nrows, n_per_row, imatrix); break; |
| 7565 | case GGML_TYPE_Q5_1: result = quantize_q5_1(src + start, (char *) dst + start_row * row_size, nrows, n_per_row, imatrix); break; |
| 7566 | case GGML_TYPE_Q8_0: result = quantize_q8_0(src + start, (char *) dst + start_row * row_size, nrows, n_per_row, imatrix); break; |
| 7567 | case GGML_TYPE_MXFP4: result = quantize_mxfp4(src + start, (char *) dst + start_row * row_size, nrows, n_per_row, imatrix); break; |
| 7568 | case GGML_TYPE_Q2_K: result = quantize_q2_K(src + start, (char *) dst + start_row * row_size, nrows, n_per_row, imatrix); break; |
| 7569 | case GGML_TYPE_Q3_K: result = quantize_q3_K(src + start, (char *) dst + start_row * row_size, nrows, n_per_row, imatrix); break; |
| 7570 | case GGML_TYPE_Q4_K: result = quantize_q4_K(src + start, (char *) dst + start_row * row_size, nrows, n_per_row, imatrix); break; |
| 7571 | case GGML_TYPE_Q5_K: result = quantize_q5_K(src + start, (char *) dst + start_row * row_size, nrows, n_per_row, imatrix); break; |
| 7572 | case GGML_TYPE_Q6_K: result = quantize_q6_K(src + start, (char *) dst + start_row * row_size, nrows, n_per_row, imatrix); break; |
| 7573 | case GGML_TYPE_TQ1_0: result = quantize_tq1_0(src + start, (char *) dst + start_row * row_size, nrows, n_per_row, imatrix); break; |
| 7574 | case GGML_TYPE_TQ2_0: result = quantize_tq2_0(src + start, (char *) dst + start_row * row_size, nrows, n_per_row, imatrix); break; |
| 7575 | case GGML_TYPE_IQ2_XXS: result = quantize_iq2_xxs(src + start, (char *) dst + start_row * row_size, nrows, n_per_row, imatrix); break; |
| 7576 | case GGML_TYPE_IQ2_XS: result = quantize_iq2_xs (src + start, (char *) dst + start_row * row_size, nrows, n_per_row, imatrix); break; |
| 7577 | case GGML_TYPE_IQ3_XXS: result = quantize_iq3_xxs(src + start, (char *) dst + start_row * row_size, nrows, n_per_row, imatrix); break; |
| 7578 | case GGML_TYPE_IQ3_S: result = quantize_iq3_s (src + start, (char *) dst + start_row * row_size, nrows, n_per_row, imatrix); break; |
| 7579 | case GGML_TYPE_IQ2_S: result = quantize_iq2_s (src + start, (char *) dst + start_row * row_size, nrows, n_per_row, imatrix); break; |
| 7580 | case GGML_TYPE_IQ1_S: result = quantize_iq1_s (src + start, (char *) dst + start_row * row_size, nrows, n_per_row, imatrix); break; |
| 7581 | case GGML_TYPE_IQ1_M: result = quantize_iq1_m (src + start, (char *) dst + start_row * row_size, nrows, n_per_row, imatrix); break; |
| 7582 | case GGML_TYPE_IQ4_NL: result = quantize_iq4_nl (src + start, (char *) dst + start_row * row_size, nrows, n_per_row, imatrix); break; |
| 7583 | case GGML_TYPE_IQ4_XS: result = quantize_iq4_xs (src + start, (char *) dst + start_row * row_size, nrows, n_per_row, imatrix); break; |
| 7584 | case GGML_TYPE_F16: |
| 7585 | { |
| 7586 | size_t elemsize = sizeof(ggml_fp16_t); |
| 7587 | ggml_fp32_to_fp16_row(src + start, (ggml_fp16_t *)dst + start, n); |
| 7588 | result = n * elemsize; |
| 7589 | } break; |
| 7590 | case GGML_TYPE_BF16: |
| 7591 | { |
| 7592 | size_t elemsize = sizeof(ggml_bf16_t); |
| 7593 | ggml_fp32_to_bf16_row_ref(src + start, (ggml_bf16_t *)dst + start, n); |
| 7594 | result = n * elemsize; |