29 : _managed_weights(), _managed_counter(), _managed_weights_parents()
37 _managed_weights[weights];
38 _managed_counter[weights];
42 _managed_counter[weights].counter++;
49 if(_managed_weights_parents.find(weights) == _managed_weights_parents.end())
51 _managed_weights_parents[weights] = parent;
61 auto item = _managed_weights.find(weights);
62 bool perform_run{
true };
63 ITensor *weights_tensor{
nullptr };
66 for(
auto it : item->second)
68 if(it->is_reshape_run() && (it->uid() == weights_transform->
uid()))
70 weights_tensor = it->get_weights();
78 weights_transform->
run();
83 auto parent_item = _managed_weights_parents.find(weights);
84 if(parent_item != _managed_weights_parents.end())
86 int32_t refcount = parent_item->second->decrease_refcount();
89 parent_item->second->release();
95 if(_managed_weights_parents.find(weights) == _managed_weights_parents.end())
97 auto item = _managed_weights.find(weights);
99 for(
auto it : item->second)
101 if(!it->is_reshape_run())
103 mark_as_unused =
false;
114 return weights_tensor;
119 return (_managed_weights.find(weights) != _managed_weights.end());
126 ITensor *transformed_weights{
nullptr };
127 auto item = _managed_weights.find(weights);
132 for(
auto it : item->second)
134 if(it->uid() == weights_transform->
uid())
136 transformed_weights = it->get_weights();
137 it->increase_refcount();
142 if(transformed_weights ==
nullptr)
144 transformed_weights = weights_transform->
get_weights();
146 item->second.emplace_back(weights_transform);
150 manage(transformed_weights, weights_transform);
152 return transformed_weights;
162 _managed_counter[weights].counter--;
163 if(_managed_counter[weights].counter == 0 && _managed_counter[weights].is_unused)
176 _managed_counter[weights].is_unused =
true;
void release(const ITensor *weights)
Release weights refcount and mark as unused if reaches 0.
void manage(const ITensor *weights, ITransformWeights *parent=nullptr)
Start managing a weights tensor.
IWeightsManager()
Constructor.
Interface for CPU tensor.
Copyright (c) 2017-2021 Arm Limited.
void mark_as_unused() const
Marks a tensor as unused.
bool are_weights_managed(const ITensor *weights)
Check if the weights are managed.
#define ARM_COMPUTE_ERROR_ON_MSG(cond, msg)
ITensor * run(const ITensor *weights, ITransformWeights *weights_transform)
Run the reshape function.
void mark_as_unused(const ITensor *weights)
Marks weights as unused.
ITensor * acquire(const ITensor *weights, ITransformWeights *weights_transform)
Acquire the requested reshape tensor of the selected weights.