| 897 | |
| 898 | |
| 899 | int main(void) { |
| 900 | ggml_log_set(nullptr, nullptr); |
| 901 | ggml_backend_load_all(); |
| 902 | const size_t dev_count = ggml_backend_dev_count(); |
| 903 | printf("Testing %zu devices\n\n", dev_count); |
| 904 | size_t n_ok = 0; |
| 905 | |
| 906 | std::vector<ggml_backend_dev_t> devs; |
| 907 | std::vector<ggml_backend_t> backends; |
| 908 | |
| 909 | for (size_t i = 0; i < dev_count; ++i) { |
| 910 | devs.push_back(ggml_backend_dev_get(i)); |
| 911 | |
| 912 | ggml_backend_t backend = ggml_backend_dev_init(devs[i], NULL); |
| 913 | GGML_ASSERT(backend != NULL); |
| 914 | |
| 915 | auto * reg = ggml_backend_dev_backend_reg(devs[i]); |
| 916 | auto ggml_backend_set_n_threads_fn = (ggml_backend_set_n_threads_t) ggml_backend_reg_get_proc_address(reg, "ggml_backend_set_n_threads"); |
| 917 | if (ggml_backend_set_n_threads_fn) { |
| 918 | ggml_backend_set_n_threads_fn(backend, std::thread::hardware_concurrency() / 2); |
| 919 | } |
| 920 | backends.push_back(backend); |
| 921 | } |
| 922 | |
| 923 | size_t n_total = 0; |
| 924 | for (enum ggml_opt_optimizer_type optim : { GGML_OPT_OPTIMIZER_TYPE_ADAMW, GGML_OPT_OPTIMIZER_TYPE_SGD }) { |
| 925 | for (size_t i = 0; i < dev_count; ++i) { |
| 926 | // Put the backend to be tested in front so that it's prioritized: |
| 927 | std::vector<ggml_backend_t> backends_modded = { backends[i] }; |
| 928 | backends_modded.insert(backends_modded.end(), backends.begin(), backends.end()); |
| 929 | |
| 930 | ggml_backend_sched_t backend_sched = ggml_backend_sched_new( |
| 931 | backends_modded.data(), nullptr, backends_modded.size(), GGML_DEFAULT_GRAPH_SIZE, false, true); |
| 932 | |
| 933 | char const* devname = ggml_backend_dev_name(devs[i]); |
| 934 | printf("Backend %zu/%zu: %s\n", i + 1, dev_count, devname); |
| 935 | printf(" Device description: %s\n", ggml_backend_dev_description(devs[i])); |
| 936 | size_t free, total; // NOLINT |
| 937 | ggml_backend_dev_memory(devs[i], &free, &total); |
| 938 | printf(" Device memory: %zu MB (%zu MB free)\n", total / 1024 / 1024, free / 1024 / 1024); |
| 939 | printf("\n"); |
| 940 | |
| 941 | bool skip; |
| 942 | { |
| 943 | struct ggml_init_params params = { |
| 944 | /*.mem_size =*/ 6*ggml_tensor_overhead(), |
| 945 | /*.mem_buffer =*/ nullptr, |
| 946 | /*.no_alloc =*/ true, |
| 947 | }; |
| 948 | ggml_context * ctx = ggml_init(params); |
| 949 | ggml_tensor * a = ggml_new_tensor_1d(ctx, GGML_TYPE_F32, 1); |
| 950 | ggml_set_param(a); |
| 951 | ggml_tensor * b = ggml_new_tensor_1d(ctx, GGML_TYPE_F32, 1); |
| 952 | ggml_tensor * c = ggml_new_tensor_1d(ctx, GGML_TYPE_F32, 1); |
| 953 | ggml_tensor * d = ggml_new_tensor_1d(ctx, GGML_TYPE_F32, 1); |
| 954 | |
| 955 | ggml_tensor * t = nullptr; |
| 956 | switch (optim) { |
nothing calls this directly
no test coverage detected