Skip to content

Commit f59fe8e

Browse files
committed
Use const; add basic test
1 parent b4dfdf7 commit f59fe8e

File tree

4 files changed

+55
-8
lines changed

4 files changed

+55
-8
lines changed

ggml.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10720,7 +10720,7 @@ enum ggml_opt_result ggml_opt(
1072010720

1072110721
////////////////////////////////////////////////////////////////////////////////
1072210722

10723-
size_t ggml_quantize_q4_0(float * src, void * dst, int n, int k, int qk, int64_t * hist) {
10723+
size_t ggml_quantize_q4_0(const float * src, void * dst, int n, int k, int qk, int64_t * hist) {
1072410724
const int nb = k / qk;
1072510725
const size_t bs = (sizeof(float) + sizeof(uint8_t)*qk/2);
1072610726
const size_t row_size = nb*bs;
@@ -10750,7 +10750,7 @@ size_t ggml_quantize_q4_0(float * src, void * dst, int n, int k, int qk, int64_t
1075010750
return (n/k)*row_size;
1075110751
}
1075210752

10753-
size_t ggml_quantize_q4_1(float * src, void * dst, int n, int k, int qk, int64_t * hist) {
10753+
size_t ggml_quantize_q4_1(const float * src, void * dst, int n, int k, int qk, int64_t * hist) {
1075410754
const int nb = k / qk;
1075510755
const size_t bs = (2*sizeof(float) + sizeof(uint8_t)*qk/2);
1075610756
const size_t row_size = nb*bs;

ggml.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -745,8 +745,8 @@ enum ggml_opt_result ggml_opt(
745745
// quantization
746746
//
747747

748-
size_t ggml_quantize_q4_0(float * src, void * dst, int n, int k, int qk, int64_t * hist);
749-
size_t ggml_quantize_q4_1(float * src, void * dst, int n, int k, int qk, int64_t * hist);
748+
size_t ggml_quantize_q4_0(const float * src, void * dst, int n, int k, int qk, int64_t * hist);
749+
size_t ggml_quantize_q4_1(const float * src, void * dst, int n, int k, int qk, int64_t * hist);
750750

751751
//
752752
// system info

tests/CMakeLists.txt

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
set(TEST_TARGET test-tokenizer-0)
2-
add_executable(${TEST_TARGET} ${TEST_TARGET}.cpp)
3-
target_link_libraries(${TEST_TARGET} PRIVATE llama ggml utils)
4-
add_test(NAME ${TEST_TARGET} COMMAND $<TARGET_FILE:${TEST_TARGET}> ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab.bin)
1+
function(llama_add_test source)
2+
get_filename_component(TEST_TARGET ${source} NAME_WE)
3+
add_executable(${TEST_TARGET} ${source})
4+
target_link_libraries(${TEST_TARGET} PRIVATE llama ggml utils)
5+
add_test(NAME ${TEST_TARGET} COMMAND $<TARGET_FILE:${TEST_TARGET}> ${ARGN})
6+
endfunction()
7+
8+
llama_add_test(test-quantize.c)
9+
llama_add_test(test-tokenizer-0.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab.bin)
10+

tests/test-quantize.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#include "ggml.h"
2+
#include <assert.h>
3+
#include <math.h>
4+
5+
int main(void) {
6+
#define QK 32
7+
float src[QK];
8+
uint8_t dst[24];
9+
int64_t hist[16];
10+
11+
for (int i = 0; i < QK; i++) {
12+
src[i] = (float)(i + 1);
13+
}
14+
15+
size_t size = ggml_quantize_q4_0(src, dst, QK, QK, QK, hist);
16+
assert(size == 20);
17+
float max_result = ((float *)dst)[0];
18+
float max_expected = src[31] / ((1 << 3) - 1);
19+
assert(max_result == max_expected);
20+
for (int i = 0; i < QK; i++) {
21+
uint8_t q4_result = (i % 2) ? (dst[sizeof(float) + i/2] >> 4) : (dst[sizeof(float) + i/2] & 0xF);
22+
uint8_t q4_expected = roundf(src[i] / max_expected) + 8;
23+
assert(q4_result == q4_expected);
24+
}
25+
26+
size = ggml_quantize_q4_1(src, dst, QK, QK, QK, hist);
27+
assert(size == 24);
28+
float delta_result = ((float *)dst)[0];
29+
float delta_expected = (src[31] - src[0]) / ((1 << 4) - 1);
30+
assert(delta_result == delta_expected);
31+
float min_result = ((float *)dst)[1];
32+
float min_expected = src[0];
33+
assert(min_result == min_expected);
34+
for (int i = 0; i < QK; i++) {
35+
uint8_t q4_result = (i % 2) ? (dst[sizeof(float)*2 + i/2] >> 4) : (dst[sizeof(float)*2 + i/2] & 0xF);
36+
uint8_t q4_expected = roundf((src[i] - min_expected) / delta_expected);
37+
assert(q4_result == q4_expected);
38+
}
39+
40+
return 0;
41+
}

0 commit comments

Comments
 (0)