| 9072 | } |
| 9073 | |
| 9074 | static bool test_backend(ggml_backend_t backend, test_mode mode, const char * op_names_filter, const char * params_filter, |
| 9075 | printer * output_printer, const char * test_file_path) { |
| 9076 | auto filter_test_cases = [](std::vector<std::unique_ptr<test_case>> & test_cases, const char * params_filter) { |
| 9077 | if (params_filter == nullptr) { |
| 9078 | return; |
| 9079 | } |
| 9080 | |
| 9081 | std::regex params_filter_regex(params_filter); |
| 9082 | |
| 9083 | for (auto it = test_cases.begin(); it != test_cases.end();) { |
| 9084 | if (!std::regex_search((*it)->vars(), params_filter_regex)) { |
| 9085 | it = test_cases.erase(it); |
| 9086 | continue; |
| 9087 | } |
| 9088 | |
| 9089 | it++; |
| 9090 | } |
| 9091 | }; |
| 9092 | |
| 9093 | std::vector<std::unique_ptr<test_case>> test_cases; |
| 9094 | |
| 9095 | if (test_file_path == nullptr) { |
| 9096 | switch (mode) { |
| 9097 | case MODE_TEST: |
| 9098 | case MODE_GRAD: |
| 9099 | case MODE_SUPPORT: |
| 9100 | test_cases = make_test_cases_eval(); |
| 9101 | break; |
| 9102 | case MODE_PERF: |
| 9103 | test_cases = make_test_cases_perf(); |
| 9104 | break; |
| 9105 | } |
| 9106 | } else { |
| 9107 | test_cases = make_test_cases_from_file(test_file_path); |
| 9108 | } |
| 9109 | |
| 9110 | filter_test_cases(test_cases, params_filter); |
| 9111 | |
| 9112 | if (mode == MODE_TEST) { |
| 9113 | ggml_backend_t backend_cpu = ggml_backend_init_by_type(GGML_BACKEND_DEVICE_TYPE_CPU, NULL); |
| 9114 | if (backend_cpu == NULL) { |
| 9115 | test_operation_info info("", "", "CPU"); |
| 9116 | info.set_error("backend", "Failed to initialize CPU backend"); |
| 9117 | output_printer->print_operation(info); |
| 9118 | return false; |
| 9119 | } |
| 9120 | // Use reference implementation on the CPU backend for comparison |
| 9121 | using ggml_backend_cpu_set_use_ref_t = void (*)(ggml_backend_t, bool); |
| 9122 | auto * reg = ggml_backend_dev_backend_reg(ggml_backend_get_device(backend_cpu)); |
| 9123 | auto * set_use_ref = (ggml_backend_cpu_set_use_ref_t) ggml_backend_reg_get_proc_address(reg, "ggml_backend_cpu_set_use_ref"); |
| 9124 | if (set_use_ref) { |
| 9125 | set_use_ref(backend_cpu, true); |
| 9126 | } |
| 9127 | |
| 9128 | size_t n_ok = 0; |
| 9129 | size_t tests_run = 0; |
| 9130 | std::vector<std::string> failed_tests; |
| 9131 | for (auto & test : test_cases) { |
no test coverage detected