3636#include < thread>
3737#include < vector>
3838
39+ #include < iostream>
40+
3941static void init_tensor_uniform (ggml_tensor * tensor, float min = -1 .0f , float max = 1 .0f ) {
4042 size_t nels = ggml_nelements (tensor);
4143 std::vector<float > data (nels);
@@ -47,8 +49,8 @@ static void init_tensor_uniform(ggml_tensor * tensor, float min = -1.0f, float m
4749 std::random_device rd;
4850 std::vector<std::default_random_engine> vec;
4951 vec.reserve (n_threads);
50- // for (size_t i = 0; i < n_threads; i++) { vec.emplace_back(1234 + i); } // fixed seed
51- for (size_t i = 0 ; i < n_threads; i++) { vec.emplace_back (rd ()); }
52+ for (size_t i = 0 ; i < n_threads; i++) { vec.emplace_back (1234 + i); } // fixed seed
53+ // for (size_t i = 0; i < n_threads; i++) { vec.emplace_back(rd()); }
5254 return vec;
5355 }();
5456
@@ -551,6 +553,54 @@ struct test_case {
551553 }
552554 }
553555
556+ struct err_t {
557+ float a_val, b_val, err;
558+ size_t i;
559+ };
560+ std::vector<err_t > top_k_abs_err;
561+ std::vector<err_t > top_k_rel_err;
562+ size_t k = 10 ;
563+ auto a = f1.data ();
564+ auto b = f2.data (); // ref (cpu backend)
565+ auto save_top_k_err = [=](size_t i, float a_i, float b_i, float err, std::vector<err_t >& top_k_err) {
566+ if (top_k_err.size () < k) {
567+ top_k_err.push_back ({a_i, b_i, err, i});
568+ if (top_k_err.size () == k) {
569+ std::sort (top_k_err.begin (), top_k_err.end (), [](const err_t & x, const err_t & y) {
570+ return x.err > y.err ;
571+ });
572+ }
573+ } else if (top_k_err.back ().err < err) {
574+ top_k_err.back () = {a_i, b_i, err, i};
575+ std::sort (top_k_err.begin (), top_k_err.end (), [](const err_t & x, const err_t & y) {
576+ return x.err > y.err ;
577+ });
578+ }
579+ };
580+ double avg_abs_err = 0 .f ;
581+ double avg_rel_err = 0 .f ;
582+ for (size_t i = 0 ; i < f1.size (); i++) {
583+ float a_i = a[i];
584+ float b_i = b[i];
585+ float abs_err = std::fabs (a_i - b_i);
586+ float rel_err = (a_i - b_i) / std::fabs (b_i);
587+ save_top_k_err (i, a_i, b_i, abs_err, top_k_abs_err);
588+ save_top_k_err (i, a_i, b_i, rel_err, top_k_rel_err);
589+ avg_abs_err += abs_err;
590+ avg_rel_err += rel_err;
591+ }
592+ avg_abs_err /= f1.size ();
593+ avg_rel_err /= f1.size ();
594+ std::cout << " \n Avg abs err=" << avg_abs_err << " Top " << k << " abs err:\n " ;
595+ for (const auto & err : top_k_abs_err) {
596+ std::cout << " i=" << err.i << " a=" << err.a_val << " b=" << err.b_val << " abs err=" << err.err << " \n " ;
597+ }
598+ std::cout << " \n Avg rel err=" << avg_rel_err << " Top " << k << " rel err:\n " ;
599+ for (const auto & err : top_k_rel_err) {
600+ std::cout << " i=" << err.i << " a=" << err.a_val << " b=" << err.b_val << " rel err=" << err.err << " \n " ;
601+ }
602+ std::cout << std::endl;
603+
554604 double err = nmse (f1.data (), f2.data (), f1.size ());
555605 if (err > ud->max_err ) {
556606 printf (" [%s] NMSE = %.9f > %.9f " , ggml_op_desc (t1), err, ud->max_err );
@@ -4134,6 +4184,13 @@ static std::vector<std::unique_ptr<test_case>> make_test_cases_eval() {
41344184 test_cases.emplace_back (new test_mul_mat (type_a, GGML_TYPE_F32, 16 , i, 256 , { 1 , 1 }, {1 , 1 }));
41354185 }
41364186 }
4187+ // TODO: Romain
4188+ test_cases.emplace_back (new test_mul_mat (GGML_TYPE_Q4_0, GGML_TYPE_F32, 11008 , 1 , 4096 , {1 , 1 }, {1 , 1 }));
4189+ test_cases.emplace_back (new test_mul_mat (GGML_TYPE_Q4_0, GGML_TYPE_F32, 11008 , 2 , 4096 , {1 , 1 }, {1 , 1 }));
4190+ test_cases.emplace_back (new test_mul_mat (GGML_TYPE_Q4_0, GGML_TYPE_F32, 4096 , 1 , 11008 , {1 , 1 }, {1 , 1 }));
4191+ test_cases.emplace_back (new test_mul_mat (GGML_TYPE_Q4_0, GGML_TYPE_F32, 4096 , 1 , 4096 , {1 , 1 }, {1 , 1 }));
4192+ test_cases.emplace_back (new test_mul_mat (GGML_TYPE_Q4_0, GGML_TYPE_F32, 4096 , 2 , 11008 , {1 , 1 }, {1 , 1 }));
4193+ test_cases.emplace_back (new test_mul_mat (GGML_TYPE_Q4_0, GGML_TYPE_F32, 4096 , 2 , 4096 , {1 , 1 }, {1 , 1 }));
41374194
41384195#if 1
41394196 for (ggml_type type_a : base_types) {
0 commit comments