aboutsummaryrefslogtreecommitdiff
path: root/ggml.c
diff options
context:
space:
mode:
authorKawrakow <48489457+ikawrakow@users.noreply.github.com>2023-04-20 19:42:27 +0200
committerGitHub <noreply@github.com>2023-04-20 20:42:27 +0300
commit38de86a7114c97ecf3644e3a60159f1ed893e1b0 (patch)
treefc6b90dd99825ce4e745304aab484b85903949c0 /ggml.c
parente0305ead3a072db9c08b35c9600c49273b38a4b5 (diff)
llama : multi-threaded quantization (#1075)
* Multi-threading quantization. Not much gain for simple quantizations, bit it will be important for quantizations that require more CPU cycles. * Multi-threading for quantize-stats It now does the job in ~14 seconds on my Mac for Q4_0, Q4_1 and Q4_2. Single-threaded it was taking more than 2 minutes after adding the more elaborate version of Q4_2. * Reviewer comments * Avoiding compiler confusion After changing chunk_size to const int as suggested by @ggerganov, clang and GCC starting to warn me that I don't need to capture it in the lambda. So, I removed it from the capture list. But that makes the MSVC build fail. So, making it a constexpr to make every compiler happy. * Still fighting with lambda captures in MSVC --------- Co-authored-by: Iwan Kawrakow <iwan.kawrakow@gmail.com> Co-authored-by: Georgi Gerganov <ggerganov@gmail.com>
Diffstat (limited to 'ggml.c')
-rw-r--r--ggml.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/ggml.c b/ggml.c
index 733ddc0..1aa8ee3 100644
--- a/ggml.c
+++ b/ggml.c
@@ -12189,6 +12189,33 @@ size_t ggml_quantize_q4_3(const float * src, void * dst, int n, int k, int64_t *
return (n/QK4_3*sizeof(block_q4_3));
}
+size_t ggml_quantize_chunk(enum ggml_type type, const float * src, void * dst, int start, int n, int64_t * hist) {
+ size_t result = 0;
+ switch (type) {
+ case GGML_TYPE_Q4_0:
+ {
+ GGML_ASSERT(start % QK4_0 == 0);
+ block_q4_0 * block = (block_q4_0*)dst + start / QK4_0;
+ result = ggml_quantize_q4_0(src + start, block, n, n, hist);
+ } break;
+ case GGML_TYPE_Q4_1:
+ {
+ GGML_ASSERT(start % QK4_1 == 0);
+ block_q4_1 * block = (block_q4_1*)dst + start / QK4_1;
+ result = ggml_quantize_q4_1(src + start, block, n, n, hist);
+ } break;
+ case GGML_TYPE_Q4_2:
+ {
+ GGML_ASSERT(start % QK4_2 == 0);
+ block_q4_2 * block = (block_q4_2*)dst + start / QK4_2;
+ result = ggml_quantize_q4_2(src + start, block, n, n, hist);
+ } break;
+ default:
+ assert(false);
+ }
+ return result;
+}
+
////////////////////////////////////////////////////////////////////////////////
int ggml_cpu_has_avx(void) {