@@ -2140,6 +2140,27 @@ struct test_set_rows : public test_case {
21402140 }
21412141 }
21422142 }
2143+
2144+ double max_nmse_err () override {
2145+ if (type == GGML_TYPE_Q4_0 || type == GGML_TYPE_Q4_1 || type == GGML_TYPE_IQ4_NL ||
2146+ type == GGML_TYPE_Q5_0 || type == GGML_TYPE_Q5_1 || type == GGML_TYPE_Q8_0) {
2147+ // estimate what the max nmse error would be if one quantized value is
2148+ // off by one. The test values are distributed in [-1,1], so it'll be
2149+ // roughly (2.0 / 2^bits)^2, divided by the mean square value of the reference,
2150+ // which is roughly 0.25 times the number of elements.
2151+ double err_estimate = 1 .0f /8 .0f ;
2152+ if (type == GGML_TYPE_Q5_0 || type == GGML_TYPE_Q5_1) {
2153+ err_estimate /= 2 .0f ;
2154+ }
2155+ if (type == GGML_TYPE_Q8_0) {
2156+ err_estimate /= 8 .0f ;
2157+ }
2158+ err_estimate *= err_estimate;
2159+ err_estimate /= 0 .25f *float (ne[0 ] * r * ne[2 ]*nr23[0 ] * ne[3 ]*nr23[1 ]);
2160+ return err_estimate;
2161+ }
2162+ return 1e-7 ;
2163+ }
21432164};
21442165
21452166// GGML_OP_ARGMAX
@@ -2430,6 +2451,30 @@ struct test_cpy : public test_case {
24302451 }
24312452
24322453 double max_nmse_err () override {
2454+ if (type_src == type_dst) {
2455+ return 0.0 ;
2456+ }
2457+ if (type_dst == GGML_TYPE_Q4_0 || type_dst == GGML_TYPE_Q4_1 || type_dst == GGML_TYPE_IQ4_NL ||
2458+ type_dst == GGML_TYPE_Q5_0 || type_dst == GGML_TYPE_Q5_1 || type_dst == GGML_TYPE_Q8_0) {
2459+ // estimate what the max nmse error would be if one quantized value is
2460+ // off by one. The test values are distributed in [-150,150], so it'll be
2461+ // roughly (150*2.0 / 2^bits)^2, divided by the mean square value of the reference,
2462+ // which is roughly 0.25*150^2 times the number of elements.
2463+ double err_estimate = 1 .0f /8 .0f * 150 .0f ;
2464+ if (type_dst == GGML_TYPE_IQ4_NL) {
2465+ // iq4_nl values are a bit more spread out
2466+ err_estimate *= 2 .0f ;
2467+ }
2468+ if (type_dst == GGML_TYPE_Q5_0 || type_dst == GGML_TYPE_Q5_1) {
2469+ err_estimate /= 2 .0f ;
2470+ }
2471+ if (type_dst == GGML_TYPE_Q8_0) {
2472+ err_estimate /= 8 .0f ;
2473+ }
2474+ err_estimate *= err_estimate;
2475+ err_estimate /= (150 .0f *150 .0f *0 .25f )*float (ne[0 ] * ne[1 ] * ne[2 ] * ne[3 ]);
2476+ return err_estimate;
2477+ }
24332478 return 1e-6 ;
24342479 }
24352480
0 commit comments