| 839 | } |
| 840 | |
| 841 | int main(void) { |
| 842 | const size_t dev_count = ggml_backend_dev_count(); |
| 843 | printf("Testing %zu devices\n\n", dev_count); |
| 844 | size_t n_ok = 0; |
| 845 | |
| 846 | std::vector<ggml_backend_dev_t> devs; |
| 847 | std::vector<ggml_backend_t> backends; |
| 848 | |
| 849 | for (size_t i = 0; i < dev_count; ++i) { |
| 850 | devs.push_back(ggml_backend_dev_get(i)); |
| 851 | |
| 852 | ggml_backend_t backend = ggml_backend_dev_init(devs[i], NULL); |
| 853 | GGML_ASSERT(backend != NULL); |
| 854 | |
| 855 | if (ggml_backend_is_cpu(backend)) { |
| 856 | ggml_backend_cpu_set_n_threads(backend, std::thread::hardware_concurrency() / 2); |
| 857 | } |
| 858 | |
| 859 | backends.push_back(backend); |
| 860 | } |
| 861 | |
| 862 | for (size_t i = 0; i < dev_count; ++i) { |
| 863 | // Put the backend to be tested in front so that it's prioritized: |
| 864 | std::vector<ggml_backend_t> backends_modded = {backends[i]}; |
| 865 | backends_modded.insert(backends_modded.end(), backends.begin(), backends.end()); |
| 866 | |
| 867 | ggml_backend_sched_t backend_sched = ggml_backend_sched_new( |
| 868 | backends_modded.data(), nullptr, backends_modded.size(), GGML_DEFAULT_GRAPH_SIZE, false, true); |
| 869 | |
| 870 | printf("Backend %zu/%zu: %s\n", i + 1, dev_count, ggml_backend_dev_name(devs[i])); |
| 871 | printf(" Device description: %s\n", ggml_backend_dev_description(devs[i])); |
| 872 | size_t free, total; // NOLINT |
| 873 | ggml_backend_dev_memory(devs[i], &free, &total); |
| 874 | printf(" Device memory: %zu MB (%zu MB free)\n", total / 1024 / 1024, free / 1024 / 1024); |
| 875 | printf("\n"); |
| 876 | |
| 877 | std::pair<int, int> result = test_backend(backend_sched, backends[i]); |
| 878 | |
| 879 | printf(" %d/%d tests passed\n", result.first, result.second); |
| 880 | printf(" Backend %s: ", ggml_backend_name(backends[i])); |
| 881 | if (result.first == result.second) { |
| 882 | printf("\033[1;32mOK\033[0m\n"); |
| 883 | n_ok++; |
| 884 | } else { |
| 885 | printf("\033[1;31mFAIL\033[0m\n"); |
| 886 | } |
| 887 | |
| 888 | printf("\n"); |
| 889 | |
| 890 | ggml_backend_sched_free(backend_sched); |
| 891 | } |
| 892 | |
| 893 | for (ggml_backend_t backend : backends) { |
| 894 | ggml_backend_free(backend); |
| 895 | } |
| 896 | |
| 897 | printf("%zu/%zu backends passed\n", n_ok, dev_count); |
| 898 | if (n_ok != dev_count) { |
nothing calls this directly
no test coverage detected