Subgraph: use Layer2Group map in config file
[tidl/tidl-api.git] / tidl_api / src / subgraph_runtime_impl.h
1 /******************************************************************************
2  * Copyright (c) 2019 Texas Instruments Incorporated - http://www.ti.com/
3  *  All rights reserved.
4  *
5  *  Redistribution and use in source and binary forms, with or without
6  *  modification, are permitted provided that the following conditions are met:
7  *      * Redistributions of source code must retain the above copyright
8  *        notice, this list of conditions and the following disclaimer.
9  *      * Redistributions in binary form must reproduce the above copyright
10  *        notice, this list of conditions and the following disclaimer in the
11  *        documentation and/or other materials provided with the distribution.
12  *      * Neither the name of Texas Instruments Incorporated nor the
13  *        names of its contributors may be used to endorse or promote products
14  *        derived from this software without specific prior written permission.
15  *
16  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
26  *  THE POSSIBILITY OF SUCH DAMAGE.
27  *****************************************************************************/
29 //! @file subgraph_runtime_impl.h
31 #pragma once
32 #include <vector>
33 #include <mutex>
34 #include <condition_variable>
35 #include "execution_object_pipeline.h"
36 #include "subgraph_data_conv.h"
39 namespace tidl {
41 // Singleton ResM   .h file
42 // Resource manager for available EVE and DSP devices,
43 //   - Allocates EVEs and DSPs
44 //   - Constructs Executors (tidl_setup) and ExecutionObjects (tid_init)
45 //   - Creates set of ExecutionPipelines (with or without DSP)
46 //   - Allocating EOP on demand (acquire and free semantics)
47 //   - Allocates input/output buffers
48 class ResM {
49   public:
50     ResM();
51     ~ResM();
52     static ResM& Instance(uint32_t total_num_subgraphs = 1);
54     // how to get resources for subgraph_id
55     void                     InitSubgraph(uint32_t subgraph_id);
56     void                     FreeSubgraph(uint32_t subgraph_id);
57     uint32_t                 GetNumEOPs(uint32_t subgraph_id);
58     ExecutionObjectPipeline* GetEOP(uint32_t subgraph_id);
59     void                     FreeEOP(uint32_t subgraph_id,
60                                      ExecutionObjectPipeline* eop);
61     Configuration&           GetConfiguration(uint32_t subgraph_id);
62     const SubgraphDataConv&  GetInConv(uint32_t subgraph_id);
63     const SubgraphDataConv&  GetOutConv(uint32_t subgraph_id);
64     uint32_t                 GetNumEs() { return num_es_per_subgraph_m; }
67   private:
68     void Init(uint32_t num_subgraphs);
70     bool     enable_trace_m;
71     uint32_t num_subgraphs_m;
72     uint32_t num_es_per_subgraph_m;
73     uint32_t num_eves_m;
74     uint32_t num_dsps_m;
75     uint32_t num_lg2_dsps_used_m;  // in partitioned execution case
76     std::mutex mutex_init_m;
78     // indexed by subgraph_id for resources
79     struct ResEOP {
80       ResEOP() : free_eop_index(0), is_used(), eops(nullptr) {}
82       uint32_t free_eop_index;
83       std::mutex mutex_eops;
84       std::condition_variable cv_eops;
85       std::vector<bool> is_used;
86       std::vector<ExecutionObjectPipeline*>* eops;
87     };
88     std::vector<Configuration> cs_m;
89     std::vector<Executor*> es_m;
90     std::vector<Executor*> e2s_m;
91     std::vector<ResEOP> *eops_m;
92     std::vector<SubgraphDataConv*> in_conv_m;
93     std::vector<SubgraphDataConv*> out_conv_m;
94 };
96 } // namespace tidl