|
|
|
@@ -51,26 +51,55 @@ static std::shared_ptr<std::map<ValuePtr, ParameterPtr>> python_paras; |
|
|
|
void ClearPythonParasMap() { python_paras = nullptr; } |
|
|
|
namespace { |
|
|
|
const int kSummaryGetItem = 2; |
|
|
|
bool IsUsedByRealKernel(const FuncGraphManagerPtr &manager, const AnfNodePtr &node) { |
|
|
|
const size_t max_depth = 128; |
|
|
|
bool RecursiveCheck(const FuncGraphManagerPtr &manager, const AnfNodePtr &node, size_t *idx, bool *check_dynamic) { |
|
|
|
MS_EXCEPTION_IF_NULL(manager); |
|
|
|
MS_EXCEPTION_IF_NULL(node); |
|
|
|
auto node_users = manager->node_users()[node]; |
|
|
|
for (auto item : node_users) { |
|
|
|
if (AnfAlgo::IsRealKernel(item.first)) { |
|
|
|
if (*check_dynamic) { |
|
|
|
if (node->isa<CNode>() && AnfAlgo::IsNodeDynamicShape(node->cast<CNodePtr>())) { |
|
|
|
return true; |
|
|
|
} |
|
|
|
} else if (AnfAlgo::IsRealKernel(node)) { |
|
|
|
return true; |
|
|
|
} |
|
|
|
(*idx) += 1; |
|
|
|
// max recursion depth |
|
|
|
if (*idx <= max_depth) { |
|
|
|
auto users = manager->node_users()[node]; |
|
|
|
if (std::any_of(users.begin(), users.end(), [&](const std::pair<AnfNodePtr, int64_t> &kernel) { |
|
|
|
return RecursiveCheck(manager, kernel.first, idx, check_dynamic); |
|
|
|
})) { |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
bool IsUsedByRealKernel(const FuncGraphManagerPtr &manager, const AnfNodePtr &node) { |
|
|
|
MS_EXCEPTION_IF_NULL(manager); |
|
|
|
MS_EXCEPTION_IF_NULL(node); |
|
|
|
auto node_users = manager->node_users()[node]; |
|
|
|
size_t idx = 0; |
|
|
|
bool check_dynamic = false; |
|
|
|
if (std::any_of(node_users.begin(), node_users.end(), [&](const std::pair<AnfNodePtr, int64_t> &kernel) { |
|
|
|
return RecursiveCheck(manager, kernel.first, &idx, &check_dynamic); |
|
|
|
})) { |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
bool IsUsedByDynamicKernel(const FuncGraphManagerPtr &manager, const AnfNodePtr &node) { |
|
|
|
MS_EXCEPTION_IF_NULL(manager); |
|
|
|
MS_EXCEPTION_IF_NULL(node); |
|
|
|
auto node_users = manager->node_users()[node]; |
|
|
|
for (auto item : node_users) { |
|
|
|
if (item.first->isa<CNode>() && AnfAlgo::IsNodeDynamicShape(item.first->cast<CNodePtr>())) { |
|
|
|
return true; |
|
|
|
} |
|
|
|
size_t idx = 0; |
|
|
|
bool check_dynamic = true; |
|
|
|
if (std::any_of(node_users.begin(), node_users.end(), [&](const std::pair<AnfNodePtr, int64_t> &kernel) { |
|
|
|
return RecursiveCheck(manager, kernel.first, &idx, &check_dynamic); |
|
|
|
})) { |
|
|
|
return true; |
|
|
|
} |
|
|
|
return false; |
|
|
|
} |
|
|
|
|