aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/NEON/functions/NEFullyConnectedLayer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/NEON/functions/NEFullyConnectedLayer.cpp')
-rw-r--r--src/runtime/NEON/functions/NEFullyConnectedLayer.cpp8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/runtime/NEON/functions/NEFullyConnectedLayer.cpp b/src/runtime/NEON/functions/NEFullyConnectedLayer.cpp
index 84bc004ec4..cb7e2dc7ec 100644
--- a/src/runtime/NEON/functions/NEFullyConnectedLayer.cpp
+++ b/src/runtime/NEON/functions/NEFullyConnectedLayer.cpp
@@ -78,7 +78,7 @@ void NEFullyConnectedLayer::configure(const ITensor *input, const ITensor *weigh
if(_impl->weights_manager != nullptr)
{
- _impl->weights_manager->manage(weights);
+ _impl->weights_manager->manage(_impl->original_weights);
}
_impl->aux_mem_req = _impl->op->workspace();
@@ -113,11 +113,13 @@ void NEFullyConnectedLayer::prepare()
// Handle weights managed infrastructure
if(_impl->weights_manager != nullptr && _impl->weights_manager->are_weights_managed(_impl->original_weights))
{
- // If function marks b as unused ensure that all prepare stages are done before releasing
+ // Ensure that b gets marked as unused (memory released) only after the last function which uses b also finishes its prepare
+ // This is for cases where multiple functions share the same b (weights)
+ // Therefore when a function marks original b as unused, we pre-mark it in weights manager, and mark it back to used so that it doesn't get released before its last reference
const ITensor *original_b = _impl->original_weights;
if(!original_b->is_used())
{
- _impl->weights_manager->mark_as_unused(original_b);
+ _impl->weights_manager->pre_mark_as_unused(original_b);
}
_impl->original_weights->mark_as_used();
_impl->weights_manager->release(_impl->original_weights);