| 375 | } |
| 376 | |
| 377 | void release_backend_graph_resources(BackendType backend_type, ggml_backend_t backend, ggml_cgraph * graph, bool evict_cuda_graph_cache) { |
| 378 | if (!evict_cuda_graph_cache) return; // existing callsite/behavior unchanged |
| 379 | if (backend_type == BackendType::Cuda || backend_type == BackendType::Hip) cuda_clear_graph(backend, graph); |
| 380 | } |
| 381 | |
| 382 | void validate_backend_graph_supported(ggml_backend_t backend, ggml_cgraph * graph, const char * label) { |
| 383 | if (backend == nullptr || graph == nullptr) { |
| 384 | throw std::runtime_error("Cannot validate backend graph support for null backend or graph"); |
| 385 | } |
| 386 | const int nodes = ggml_graph_n_nodes(graph); |
| 387 | for (int i = 0; i < nodes; ++i) { |
| 388 | ggml_tensor * node = ggml_graph_node(graph, i); |
| 389 | if (node != nullptr && !ggml_backend_supports_op(backend, node)) { |
| 390 | const char * graph_label = label != nullptr ? label : "graph"; |
| 391 | std::string op_name = ggml_op_name(node->op); |
| 392 | if (node->op == GGML_OP_UNARY) { |
| 393 | op_name += "/"; |
| 394 | op_name += ggml_unary_op_name(ggml_get_unary_op(node)); |
| 395 | } |
| 396 | throw std::runtime_error( |
| 397 | std::string(graph_label) + |
| 398 | " contains unsupported backend op '" + |
| 399 | op_name + |
| 400 | "' at node " + |
no test coverage detected