36 struct CLFullyConnectedLayer::Impl
38 MemoryGroup memory_group{};
39 IWeightsManager *weights_manager{
nullptr};
41 std::unique_ptr<opencl::ClFullyConnected> op{
nullptr};
43 const ITensor *original_weights{
nullptr};
45 ITensorPack run_pack{};
46 WorkspaceData<CLTensor> workspace{};
49 bool is_prepared{
false};
50 bool dynamic_weights{
false};
55 : _impl(std::make_unique<Impl>())
57 _impl->memory_group =
MemoryGroup(std::move(memory_manager));
58 _impl->weights_manager = weights_manager;
82 input->info(), weights->
info(), biases !=
nullptr ? biases->
info() :
nullptr, output->
info(), fc_info));
84 _impl->op = std::make_unique<opencl::ClFullyConnected>();
85 _impl->original_weights = weights;
88 _impl->op->configure(compile_context,
input->info(), weights->
info(),
89 (biases !=
nullptr) ? biases->
info() :
nullptr, output->
info(), fc_info);
91 if (_impl->weights_manager !=
nullptr)
93 _impl->weights_manager->manage(_impl->original_weights);
96 if (!_impl->is_prepared)
98 _impl->aux_mem_req = _impl->op->workspace();
101 manage_workspace<CLTensor>(_impl->aux_mem_req, _impl->memory_group, _impl->run_pack, _impl->run_pack);
106 _impl->run_pack.add_tensor(
ACL_DST, output);
124 if (!_impl->dynamic_weights)
130 _impl->op->run(_impl->run_pack);
135 if (!_impl->is_prepared)
137 _impl->op->prepare(_impl->run_pack);
140 release_temporaries<CLTensor>(_impl->aux_mem_req, _impl->workspace);
141 _impl->is_prepared =
true;
144 if (_impl->weights_manager !=
nullptr && _impl->weights_manager->are_weights_managed(_impl->original_weights))
149 const ITensor *original_b = _impl->original_weights;
152 _impl->weights_manager->pre_mark_as_unused(original_b);
154 _impl->original_weights->mark_as_used();
155 _impl->weights_manager->release(_impl->original_weights);