This commit is contained in:
Raul Torres 2025-12-16 10:13:18 +00:00 committed by GitHub
commit 9706f77e6e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 26 additions and 18 deletions

View File

@ -2199,34 +2199,42 @@ static bool ggml_graph_node_has_matching_properties(ggml_tensor *
* function returns true. Otherwise, the function returns false, indicating that a new * function returns true. Otherwise, the function returns false, indicating that a new
* CANN graph needs to be captured. * CANN graph needs to be captured.
* *
* @param cann_ctx The CANN backend context containing the graph cache. * @param graph_cache The graph cache.
* @param cgraph The current ggml computation graph. * @param cgraph The current ggml computation graph.
* @return true if a matching cached graph exists; false otherwise. * @return true if a matching cached graph exists; false otherwise.
*/ */
static bool is_matched_graph(ggml_backend_cann_context * cann_ctx, ggml_cgraph * cgraph) { static bool is_matched_graph_in_cache(ggml_cann_graph_lru_cache & graph_cache, ggml_cgraph * cgraph) {
ggml_cann_graph_lru_cache & lru_cache = cann_ctx->graph_lru_cache; // lambda for checking if all nodes of the current graph match some given properties.
for (auto & graph_ptr : lru_cache.cache_list) { auto nodes_match_properties = [& cgraph](auto & properties) {
// Skip graphs with a different number of nodes. auto n_nodes = cgraph->n_nodes;
if (graph_ptr->ggml_graph_properties.size() != static_cast<size_t>(cgraph->n_nodes)) {
continue; // Reject if the list sizes do not match.
if (properties.size() != static_cast<size_t>(n_nodes)) {
return false;
} }
// Check if all nodes match. // Check all nodes of the graph.
bool all_match = true; for (int i = 0; i < n_nodes; ++i) {
for (int i = 0; i < cgraph->n_nodes; ++i) { // Reject if a node does not match its expected properties.
if (!ggml_graph_node_has_matching_properties(cgraph->nodes[i], &graph_ptr->ggml_graph_properties[i])) { if (!ggml_graph_node_has_matching_properties(cgraph->nodes[i], & properties[i])) {
all_match = false; return false;
break;
} }
} }
if (all_match) { // All nodes matched its expected properties.
// update cache_list && renturn graph_ptr return true;
lru_cache.move_to_front(graph_ptr); };
// Search for a matching graph in the cache.
for (auto & cached_graph_ptr : graph_cache.cache_list) {
if (nodes_match_properties(cached_graph_ptr->ggml_graph_properties)) {
// A matching graph was found.
graph_cache.move_to_front(cached_graph_ptr);
return true; return true;
} }
} }
// A matching graph was not found.
return false; return false;
} }
#endif // USE_ACL_GRAPH #endif // USE_ACL_GRAPH
@ -2331,7 +2339,7 @@ static enum ggml_status ggml_backend_cann_graph_compute(ggml_backend_t backend,
if (use_cann_graph) { if (use_cann_graph) {
// If no matching graph is found, the graph needs to be recaptured. // If no matching graph is found, the graph needs to be recaptured.
cann_graph_update_required = !is_matched_graph(cann_ctx, cgraph); cann_graph_update_required = !is_matched_graph_in_cache(cann_ctx->graph_lru_cache, cgraph);
if (cann_graph_update_required) { if (cann_graph_update_required) {
// If no matching graph is found, add a new ACL graph. // If no matching graph is found, add a new ACL graph.
add_lru_matched_graph_node_properties(cann_ctx, cgraph); add_lru_matched_graph_node_properties(cann_ctx, cgraph);