/home/liu/actions-runner/_work/ccv/ccv/lib/nnc/_ccv_nnc_dynamic_graph.h
Line | Count | Source (jump to first uncovered line) |
1 | | /********************************************************** |
2 | | * C-based/Cached/Core Computer Vision Library |
3 | | * Liu Liu, 2010-02-01 |
4 | | **********************************************************/ |
5 | | |
6 | | /********************************************************** |
7 | | * CCV - Neural Network Collection |
8 | | **********************************************************/ |
9 | | |
10 | | #ifndef GUARD_ccv_nnc_dynamic_graph_internal_h |
11 | | #define GUARD_ccv_nnc_dynamic_graph_internal_h |
12 | | |
13 | | #include "ccv_nnc.h" |
14 | | #include "ccv_nnc_internal.h" |
15 | | #include "_ccv_nnc_stream.h" |
16 | | #include "_ccv_nnc_xpu_alloc.h" |
17 | | #include "3rdparty/khash/khash.h" |
18 | | |
19 | 39.1k | #define CCV_NNC_IS_EXTERN_TENSOR_VIEW(tv) ((uintptr_t)(tv) & 1) |
20 | 69.8k | #define CCV_NNC_TENSOR_VIEW(tv) ((ccv_nnc_tensor_view_t*)((uintptr_t)(tv) & ~(uintptr_t)1)) |
21 | | |
22 | | enum { |
23 | | CCV_NNC_TENSOR_VARIABLE, |
24 | | CCV_NNC_TENSOR_CONSTANT, |
25 | | }; |
26 | | |
27 | | struct ccv_nnc_tensor_variable_s { |
28 | | int type; |
29 | | int index; |
30 | | int alias_index_ref; // The index back into the original tensor variable. 0 means no alias. |
31 | | off_t alias_off; // If it is an alias, what's the off on the tensor before ofs applied. |
32 | | struct { |
33 | | ccv_nnc_tensor_variable_destructor_f func; |
34 | | void* context; |
35 | | } destructor_hook; |
36 | | ccv_nnc_tensor_param_t info; |
37 | | ccv_nnc_tensor_symbol_t symbol; |
38 | | ccv_nnc_tensor_view_t* tensor_view; |
39 | | int ofs[CCV_NNC_MAX_DIM_ALLOC]; |
40 | | int stride[CCV_NNC_MAX_DIM_ALLOC]; |
41 | | }; |
42 | | |
43 | | enum { |
44 | | CCV_NNC_TENSOR_NO_VARIABLE = -1, |
45 | | CCV_NNC_TENSOR_NO_VARIABLE_BUT_USED = -2, |
46 | | }; |
47 | | |
48 | | typedef struct { |
49 | | ccv_nnc_cmd_vtab_t super; |
50 | | void(*apply_gradients)(const ccv_nnc_cmd_t cmd, ccv_nnc_stream_context_t* const stream_context); |
51 | | } ccv_nnc_stateful_cmd_vtab_t; |
52 | | |
53 | | typedef struct { // Extra information kept per tensor symbol along with symbolic graph. |
54 | | int type; |
55 | | int index; // The index back into the tensor variable. -1 meant no associated tensor vairable. |
56 | | int alias_ref; // If this is an alias tensor view to a tensor. 0 means no alias, otherwise the index + 1 of the original symbol on the tape. |
57 | | struct { |
58 | | ccv_nnc_tensor_variable_destructor_f func; |
59 | | void* context; |
60 | | } destructor_hook; |
61 | | ccv_array_t* sources; // array of graph_exec_symbol, use this tensor symbol as output. |
62 | | ccv_array_t* destinations; // array of graph_exec_symbol, use this tensor symbol as input. |
63 | | ccv_nnc_tensor_view_t* tensor_view; // Transfer ownership of the tensor view to here. |
64 | | } ccv_nnc_tensor_variable_graph_bind_t; |
65 | | |
66 | | typedef struct { |
67 | | ccv_nnc_xpu_alloc_t* xpu_alloc; |
68 | | ccv_nnc_stream_context_t* stream; |
69 | | } ccv_nnc_dy_xpu_alloc_t; |
70 | | |
71 | | typedef struct { |
72 | | int8_t requires_grad; |
73 | | int8_t is_test; |
74 | | int8_t did_backward_but_not_apply_gradients; |
75 | | int8_t should_free; |
76 | | int index; |
77 | | uint64_t disable_outgrad; |
78 | | ccv_nnc_tensor_tape_t* tensor_tape; |
79 | | void* data; |
80 | | ccv_nnc_cmd_t cmd; |
81 | | } ccv_nnc_stateful_exec_t; |
82 | | |
83 | | KHASH_MAP_INIT_INT(stateful_exec, ccv_nnc_stateful_exec_t*) |
84 | | |
85 | | struct ccv_nnc_dynamic_graph_s { |
86 | | int no_grad; // 1 if gradient computation is disabled. |
87 | | int max_stream_count; |
88 | | int reuse_var; // -1 if no var can be reused. Otherwise first locate the reuse var without increase array size. |
89 | | int reuse_stateful_exec; // -1 if no stateful exec can be reused. Otherwise first locate the reuse without increase array size. |
90 | | ccv_nnc_xpu_alloc_t xpu_alloc; // Allocate memory dynamically. |
91 | | ccv_array_t* vars; // Array keeps track of all allocated tensor variable. |
92 | | ccv_array_t* binds; // Array keeps track of extra information for a tensor symbol. |
93 | | ccv_array_t* stateful_execs; // Array keeps track of the stateful execs. The stateful execs type can have additional apply_gradients calls to update its internal states. |
94 | | ccv_nnc_symbolic_graph_t* tape; // Symbolic graph to keep track of computation. |
95 | | khash_t(stream_map)* stream_map; // Keeps track of streams on both GPU / CPU and devices so it can be used properly during execution. |
96 | | ccv_array_t* ws; // array of integers as workspace |
97 | | }; |
98 | | |
99 | | ccv_nnc_tensor_variable_t ccv_nnc_tensor_variable_exchange_new(ccv_nnc_dynamic_graph_t* const graph, ccv_nnc_tensor_variable_t tensor_variable); |
100 | | |
101 | | static inline void ccv_nnc_insert_if_prior_to_any(const ccv_nnc_symbolic_graph_t* const graph, const int d, ccv_array_t* const sources, uint32_t* const visited, int* const buf0, int* const buf1) |
102 | 4.48k | { |
103 | 4.48k | if (visited[(d >> 5)] & (1u << (d & 31))) |
104 | 7 | return; |
105 | 4.47k | visited[(d >> 5)] |= (1u << (d & 31)); |
106 | 4.47k | buf0[0] = d; |
107 | 4.47k | int* buf[2] = { |
108 | 4.47k | buf0, buf1 |
109 | 4.47k | }; |
110 | 4.47k | int buf_size[2] = { |
111 | 4.47k | 1, 0 |
112 | 4.47k | }; |
113 | 4.47k | int p = 0, q = 1; |
114 | 4.47k | int i, j, k; |
115 | 4.47k | int flag = 0; |
116 | 19.7k | while (buf_size[p] > 0) |
117 | 15.3k | { |
118 | 15.3k | buf_size[q] = 0; |
119 | 30.6k | for (i = 0; i < buf_size[p]; i++15.3k ) |
120 | 15.3k | { |
121 | 15.3k | const int* outgoings; int outgoing_size; |
122 | 15.3k | ccv_nnc_graph_exec_symbol_to(graph, (ccv_nnc_graph_exec_symbol_t){ |
123 | 15.3k | .d = buf[p][i], |
124 | 15.3k | .graph = graph |
125 | 15.3k | }, &outgoings, &outgoing_size); |
126 | 26.1k | for (j = 0; j < outgoing_size; j++10.8k ) |
127 | 10.8k | { |
128 | 10.8k | const int outgoing_idx = outgoings[j]; |
129 | 10.9k | for (k = 0; k < sources->rnum; k++85 ) |
130 | 85 | { |
131 | 85 | ccv_nnc_graph_exec_symbol_t* const source_symbol = (ccv_nnc_graph_exec_symbol_t*)ccv_array_get(sources, k); |
132 | | // If this outgoing idx is one of the source, replace it with d, or delete it. |
133 | 85 | if (source_symbol->d == outgoing_idx) |
134 | 0 | { |
135 | 0 | if (!flag) |
136 | 0 | { |
137 | 0 | source_symbol->d = d; |
138 | 0 | flag = 1; |
139 | 0 | } else { |
140 | | // Delete this from the list. |
141 | 0 | if (k < sources->rnum - 1) |
142 | 0 | source_symbol->d = ((ccv_nnc_graph_exec_symbol_t*)ccv_array_get(sources, sources->rnum - 1))->d; |
143 | 0 | --sources->rnum; |
144 | 0 | } |
145 | 0 | break; |
146 | 0 | } |
147 | 85 | } |
148 | 10.8k | if (visited[(outgoing_idx >> 5)] & (1u << (outgoing_idx & 31))) |
149 | 19 | continue; |
150 | 10.8k | visited[(outgoing_idx >> 5)] |= (1u << (outgoing_idx & 31)); |
151 | 10.8k | buf[q][buf_size[q]] = outgoing_idx; |
152 | 10.8k | ++buf_size[q]; |
153 | 10.8k | } |
154 | 15.3k | } |
155 | 15.3k | CCV_SWAP(p, q, i); |
156 | 15.3k | } |
157 | | // If this node is not visited, and we cannot find anything in the sources to replace, this is a new top node. |
158 | 4.47k | if (!flag) |
159 | 4.47k | { |
160 | 4.47k | const ccv_nnc_graph_exec_symbol_t source_symbol = { |
161 | 4.47k | .d = d, |
162 | 4.47k | .graph = graph |
163 | 4.47k | }; |
164 | 4.47k | ccv_array_push(sources, &source_symbol); |
165 | 4.47k | } |
166 | 4.47k | } Unexecuted instantiation: ccv_nnc_dynamic_graph.c:ccv_nnc_insert_if_prior_to_any Unexecuted instantiation: ccv_nnc_dynamic_graph_alloc.c:ccv_nnc_insert_if_prior_to_any ccv_nnc_dynamic_graph_backward.c:ccv_nnc_insert_if_prior_to_any Line | Count | Source | 102 | 3.47k | { | 103 | 3.47k | if (visited[(d >> 5)] & (1u << (d & 31))) | 104 | 7 | return; | 105 | 3.47k | visited[(d >> 5)] |= (1u << (d & 31)); | 106 | 3.47k | buf0[0] = d; | 107 | 3.47k | int* buf[2] = { | 108 | 3.47k | buf0, buf1 | 109 | 3.47k | }; | 110 | 3.47k | int buf_size[2] = { | 111 | 3.47k | 1, 0 | 112 | 3.47k | }; | 113 | 3.47k | int p = 0, q = 1; | 114 | 3.47k | int i, j, k; | 115 | 3.47k | int flag = 0; | 116 | 15.7k | while (buf_size[p] > 0) | 117 | 12.2k | { | 118 | 12.2k | buf_size[q] = 0; | 119 | 24.6k | for (i = 0; i < buf_size[p]; i++12.3k ) | 120 | 12.3k | { | 121 | 12.3k | const int* outgoings; int outgoing_size; | 122 | 12.3k | ccv_nnc_graph_exec_symbol_to(graph, (ccv_nnc_graph_exec_symbol_t){ | 123 | 12.3k | .d = buf[p][i], | 124 | 12.3k | .graph = graph | 125 | 12.3k | }, &outgoings, &outgoing_size); | 126 | 21.1k | for (j = 0; j < outgoing_size; j++8.85k ) | 127 | 8.85k | { | 128 | 8.85k | const int outgoing_idx = outgoings[j]; | 129 | 8.93k | for (k = 0; k < sources->rnum; k++85 ) | 130 | 85 | { | 131 | 85 | ccv_nnc_graph_exec_symbol_t* const source_symbol = (ccv_nnc_graph_exec_symbol_t*)ccv_array_get(sources, k); | 132 | | // If this outgoing idx is one of the source, replace it with d, or delete it. | 133 | 85 | if (source_symbol->d == outgoing_idx) | 134 | 0 | { | 135 | 0 | if (!flag) | 136 | 0 | { | 137 | 0 | source_symbol->d = d; | 138 | 0 | flag = 1; | 139 | 0 | } else { | 140 | | // Delete this from the list. | 141 | 0 | if (k < sources->rnum - 1) | 142 | 0 | source_symbol->d = ((ccv_nnc_graph_exec_symbol_t*)ccv_array_get(sources, sources->rnum - 1))->d; | 143 | 0 | --sources->rnum; | 144 | 0 | } | 145 | 0 | break; | 146 | 0 | } | 147 | 85 | } | 148 | 8.85k | if (visited[(outgoing_idx >> 5)] & (1u << (outgoing_idx & 31))) | 149 | 19 | continue; | 150 | 8.83k | visited[(outgoing_idx >> 5)] |= (1u << (outgoing_idx & 31)); | 151 | 8.83k | buf[q][buf_size[q]] = outgoing_idx; | 152 | 8.83k | ++buf_size[q]; | 153 | 8.83k | } | 154 | 12.3k | } | 155 | 12.2k | CCV_SWAP(p, q, i); | 156 | 12.2k | } | 157 | | // If this node is not visited, and we cannot find anything in the sources to replace, this is a new top node. | 158 | 3.47k | if (!flag) | 159 | 3.47k | { | 160 | 3.47k | const ccv_nnc_graph_exec_symbol_t source_symbol = { | 161 | 3.47k | .d = d, | 162 | 3.47k | .graph = graph | 163 | 3.47k | }; | 164 | 3.47k | ccv_array_push(sources, &source_symbol); | 165 | 3.47k | } | 166 | 3.47k | } |
Unexecuted instantiation: ccv_nnc_dynamic_graph_apply_gradients.c:ccv_nnc_insert_if_prior_to_any ccv_nnc_dynamic_graph_minimize.c:ccv_nnc_insert_if_prior_to_any Line | Count | Source | 102 | 1.00k | { | 103 | 1.00k | if (visited[(d >> 5)] & (1u << (d & 31))) | 104 | 0 | return; | 105 | 1.00k | visited[(d >> 5)] |= (1u << (d & 31)); | 106 | 1.00k | buf0[0] = d; | 107 | 1.00k | int* buf[2] = { | 108 | 1.00k | buf0, buf1 | 109 | 1.00k | }; | 110 | 1.00k | int buf_size[2] = { | 111 | 1.00k | 1, 0 | 112 | 1.00k | }; | 113 | 1.00k | int p = 0, q = 1; | 114 | 1.00k | int i, j, k; | 115 | 1.00k | int flag = 0; | 116 | 4.00k | while (buf_size[p] > 0) | 117 | 3.00k | { | 118 | 3.00k | buf_size[q] = 0; | 119 | 6.00k | for (i = 0; i < buf_size[p]; i++3.00k ) | 120 | 3.00k | { | 121 | 3.00k | const int* outgoings; int outgoing_size; | 122 | 3.00k | ccv_nnc_graph_exec_symbol_to(graph, (ccv_nnc_graph_exec_symbol_t){ | 123 | 3.00k | .d = buf[p][i], | 124 | 3.00k | .graph = graph | 125 | 3.00k | }, &outgoings, &outgoing_size); | 126 | 5.00k | for (j = 0; j < outgoing_size; j++2.00k ) | 127 | 2.00k | { | 128 | 2.00k | const int outgoing_idx = outgoings[j]; | 129 | 2.00k | for (k = 0; k < sources->rnum; k++0 ) | 130 | 0 | { | 131 | 0 | ccv_nnc_graph_exec_symbol_t* const source_symbol = (ccv_nnc_graph_exec_symbol_t*)ccv_array_get(sources, k); | 132 | | // If this outgoing idx is one of the source, replace it with d, or delete it. | 133 | 0 | if (source_symbol->d == outgoing_idx) | 134 | 0 | { | 135 | 0 | if (!flag) | 136 | 0 | { | 137 | 0 | source_symbol->d = d; | 138 | 0 | flag = 1; | 139 | 0 | } else { | 140 | | // Delete this from the list. | 141 | 0 | if (k < sources->rnum - 1) | 142 | 0 | source_symbol->d = ((ccv_nnc_graph_exec_symbol_t*)ccv_array_get(sources, sources->rnum - 1))->d; | 143 | 0 | --sources->rnum; | 144 | 0 | } | 145 | 0 | break; | 146 | 0 | } | 147 | 0 | } | 148 | 2.00k | if (visited[(outgoing_idx >> 5)] & (1u << (outgoing_idx & 31))) | 149 | 0 | continue; | 150 | 2.00k | visited[(outgoing_idx >> 5)] |= (1u << (outgoing_idx & 31)); | 151 | 2.00k | buf[q][buf_size[q]] = outgoing_idx; | 152 | 2.00k | ++buf_size[q]; | 153 | 2.00k | } | 154 | 3.00k | } | 155 | 3.00k | CCV_SWAP(p, q, i); | 156 | 3.00k | } | 157 | | // If this node is not visited, and we cannot find anything in the sources to replace, this is a new top node. | 158 | 1.00k | if (!flag) | 159 | 1.00k | { | 160 | 1.00k | const ccv_nnc_graph_exec_symbol_t source_symbol = { | 161 | 1.00k | .d = d, | 162 | 1.00k | .graph = graph | 163 | 1.00k | }; | 164 | 1.00k | ccv_array_push(sources, &source_symbol); | 165 | 1.00k | } | 166 | 1.00k | } |
Unexecuted instantiation: ccv_nnc_dynamic_graph_evaluate.c:ccv_nnc_insert_if_prior_to_any |
167 | | |
168 | | static inline void ccv_nnc_remove_if_prior_to_any(const ccv_nnc_symbolic_graph_t* const graph, const int d, ccv_array_t* const destinations, uint32_t* const visited, int* const buf0, int* const buf1) |
169 | 22 | { |
170 | 22 | int i, j, k; |
171 | | // If it is already visited, this is the later one, we are good. |
172 | 22 | if (visited[(d >> 5)] & (1u << (d & 31))) |
173 | 0 | return; |
174 | 22 | visited[(d >> 5)] |= (1u << (d & 31)); |
175 | 22 | buf0[0] = d; |
176 | 22 | int* buf[2] = { |
177 | 22 | buf0, buf1 |
178 | 22 | }; |
179 | 22 | int buf_size[2] = { |
180 | 22 | 1, 0 |
181 | 22 | }; |
182 | 22 | int p = 0, q = 1; |
183 | 22 | int flag = 0; |
184 | 44 | while (!flag && buf_size[p] > 042 ) |
185 | 22 | { |
186 | 22 | buf_size[q] = 0; |
187 | 44 | for (i = 0; !flag && i < buf_size[p]42 ; i++22 ) |
188 | 22 | { |
189 | 22 | const int* outgoings; int outgoing_size; |
190 | 22 | ccv_nnc_graph_exec_symbol_to(graph, (ccv_nnc_graph_exec_symbol_t){ |
191 | 22 | .d = buf[p][i], |
192 | 22 | .graph = graph |
193 | 22 | }, &outgoings, &outgoing_size); |
194 | 25 | for (j = 0; j < outgoing_size; j++3 ) |
195 | 3 | { |
196 | 3 | const int outgoing_idx = outgoings[j]; |
197 | | // If this node happens to be visited, do nothing. |
198 | 3 | if (visited[(outgoing_idx >> 5)] & (1u << (outgoing_idx & 31))) |
199 | 0 | continue; |
200 | 6 | for (k = 0; 3 !flag && k < destinations->rnum3 ; k++3 ) |
201 | 3 | { |
202 | 3 | ccv_nnc_graph_exec_symbol_t* const destination_symbol = (ccv_nnc_graph_exec_symbol_t*)ccv_array_get(destinations, k); |
203 | | // If this outgoing idx is one of the destination, delete current node. |
204 | 3 | flag = (destination_symbol->d == outgoing_idx); |
205 | 3 | } |
206 | 3 | visited[(outgoing_idx >> 5)] |= (1u << (outgoing_idx & 31)); |
207 | 3 | buf[q][buf_size[q]] = outgoing_idx; |
208 | 3 | ++buf_size[q]; |
209 | 3 | } |
210 | 22 | } |
211 | 22 | CCV_SWAP(p, q, i); |
212 | 22 | } |
213 | 22 | if (flag) |
214 | 3 | for (i = 0; 2 i < destinations->rnum; i++1 ) |
215 | 3 | { |
216 | 3 | ccv_nnc_graph_exec_symbol_t* const destination_symbol = (ccv_nnc_graph_exec_symbol_t*)ccv_array_get(destinations, i); |
217 | | // If this outgoing idx is one of the destination, delete current node. |
218 | 3 | if (destination_symbol->d == d) |
219 | 2 | { |
220 | | // Delete this from the list. |
221 | 2 | if (i < destinations->rnum - 1) |
222 | 1 | destination_symbol->d = ((ccv_nnc_graph_exec_symbol_t*)ccv_array_get(destinations, destinations->rnum - 1))->d; |
223 | 2 | --destinations->rnum; |
224 | 2 | break; |
225 | 2 | } |
226 | 3 | } |
227 | 22 | } Unexecuted instantiation: ccv_nnc_dynamic_graph.c:ccv_nnc_remove_if_prior_to_any Unexecuted instantiation: ccv_nnc_dynamic_graph_alloc.c:ccv_nnc_remove_if_prior_to_any ccv_nnc_dynamic_graph_backward.c:ccv_nnc_remove_if_prior_to_any Line | Count | Source | 169 | 18 | { | 170 | 18 | int i, j, k; | 171 | | // If it is already visited, this is the later one, we are good. | 172 | 18 | if (visited[(d >> 5)] & (1u << (d & 31))) | 173 | 0 | return; | 174 | 18 | visited[(d >> 5)] |= (1u << (d & 31)); | 175 | 18 | buf0[0] = d; | 176 | 18 | int* buf[2] = { | 177 | 18 | buf0, buf1 | 178 | 18 | }; | 179 | 18 | int buf_size[2] = { | 180 | 18 | 1, 0 | 181 | 18 | }; | 182 | 18 | int p = 0, q = 1; | 183 | 18 | int flag = 0; | 184 | 36 | while (!flag && buf_size[p] > 034 ) | 185 | 18 | { | 186 | 18 | buf_size[q] = 0; | 187 | 36 | for (i = 0; !flag && i < buf_size[p]34 ; i++18 ) | 188 | 18 | { | 189 | 18 | const int* outgoings; int outgoing_size; | 190 | 18 | ccv_nnc_graph_exec_symbol_to(graph, (ccv_nnc_graph_exec_symbol_t){ | 191 | 18 | .d = buf[p][i], | 192 | 18 | .graph = graph | 193 | 18 | }, &outgoings, &outgoing_size); | 194 | 21 | for (j = 0; j < outgoing_size; j++3 ) | 195 | 3 | { | 196 | 3 | const int outgoing_idx = outgoings[j]; | 197 | | // If this node happens to be visited, do nothing. | 198 | 3 | if (visited[(outgoing_idx >> 5)] & (1u << (outgoing_idx & 31))) | 199 | 0 | continue; | 200 | 6 | for (k = 0; 3 !flag && k < destinations->rnum3 ; k++3 ) | 201 | 3 | { | 202 | 3 | ccv_nnc_graph_exec_symbol_t* const destination_symbol = (ccv_nnc_graph_exec_symbol_t*)ccv_array_get(destinations, k); | 203 | | // If this outgoing idx is one of the destination, delete current node. | 204 | 3 | flag = (destination_symbol->d == outgoing_idx); | 205 | 3 | } | 206 | 3 | visited[(outgoing_idx >> 5)] |= (1u << (outgoing_idx & 31)); | 207 | 3 | buf[q][buf_size[q]] = outgoing_idx; | 208 | 3 | ++buf_size[q]; | 209 | 3 | } | 210 | 18 | } | 211 | 18 | CCV_SWAP(p, q, i); | 212 | 18 | } | 213 | 18 | if (flag) | 214 | 3 | for (i = 0; 2 i < destinations->rnum; i++1 ) | 215 | 3 | { | 216 | 3 | ccv_nnc_graph_exec_symbol_t* const destination_symbol = (ccv_nnc_graph_exec_symbol_t*)ccv_array_get(destinations, i); | 217 | | // If this outgoing idx is one of the destination, delete current node. | 218 | 3 | if (destination_symbol->d == d) | 219 | 2 | { | 220 | | // Delete this from the list. | 221 | 2 | if (i < destinations->rnum - 1) | 222 | 1 | destination_symbol->d = ((ccv_nnc_graph_exec_symbol_t*)ccv_array_get(destinations, destinations->rnum - 1))->d; | 223 | 2 | --destinations->rnum; | 224 | 2 | break; | 225 | 2 | } | 226 | 3 | } | 227 | 18 | } |
Unexecuted instantiation: ccv_nnc_dynamic_graph_apply_gradients.c:ccv_nnc_remove_if_prior_to_any ccv_nnc_dynamic_graph_minimize.c:ccv_nnc_remove_if_prior_to_any Line | Count | Source | 169 | 4 | { | 170 | 4 | int i, j, k; | 171 | | // If it is already visited, this is the later one, we are good. | 172 | 4 | if (visited[(d >> 5)] & (1u << (d & 31))) | 173 | 0 | return; | 174 | 4 | visited[(d >> 5)] |= (1u << (d & 31)); | 175 | 4 | buf0[0] = d; | 176 | 4 | int* buf[2] = { | 177 | 4 | buf0, buf1 | 178 | 4 | }; | 179 | 4 | int buf_size[2] = { | 180 | 4 | 1, 0 | 181 | 4 | }; | 182 | 4 | int p = 0, q = 1; | 183 | 4 | int flag = 0; | 184 | 8 | while (!flag && buf_size[p] > 0) | 185 | 4 | { | 186 | 4 | buf_size[q] = 0; | 187 | 8 | for (i = 0; !flag && i < buf_size[p]; i++4 ) | 188 | 4 | { | 189 | 4 | const int* outgoings; int outgoing_size; | 190 | 4 | ccv_nnc_graph_exec_symbol_to(graph, (ccv_nnc_graph_exec_symbol_t){ | 191 | 4 | .d = buf[p][i], | 192 | 4 | .graph = graph | 193 | 4 | }, &outgoings, &outgoing_size); | 194 | 4 | for (j = 0; j < outgoing_size; j++0 ) | 195 | 0 | { | 196 | 0 | const int outgoing_idx = outgoings[j]; | 197 | | // If this node happens to be visited, do nothing. | 198 | 0 | if (visited[(outgoing_idx >> 5)] & (1u << (outgoing_idx & 31))) | 199 | 0 | continue; | 200 | 0 | for (k = 0; !flag && k < destinations->rnum; k++) | 201 | 0 | { | 202 | 0 | ccv_nnc_graph_exec_symbol_t* const destination_symbol = (ccv_nnc_graph_exec_symbol_t*)ccv_array_get(destinations, k); | 203 | | // If this outgoing idx is one of the destination, delete current node. | 204 | 0 | flag = (destination_symbol->d == outgoing_idx); | 205 | 0 | } | 206 | 0 | visited[(outgoing_idx >> 5)] |= (1u << (outgoing_idx & 31)); | 207 | 0 | buf[q][buf_size[q]] = outgoing_idx; | 208 | 0 | ++buf_size[q]; | 209 | 0 | } | 210 | 4 | } | 211 | 4 | CCV_SWAP(p, q, i); | 212 | 4 | } | 213 | 4 | if (flag) | 214 | 0 | for (i = 0; i < destinations->rnum; i++) | 215 | 0 | { | 216 | 0 | ccv_nnc_graph_exec_symbol_t* const destination_symbol = (ccv_nnc_graph_exec_symbol_t*)ccv_array_get(destinations, i); | 217 | | // If this outgoing idx is one of the destination, delete current node. | 218 | 0 | if (destination_symbol->d == d) | 219 | 0 | { | 220 | | // Delete this from the list. | 221 | 0 | if (i < destinations->rnum - 1) | 222 | 0 | destination_symbol->d = ((ccv_nnc_graph_exec_symbol_t*)ccv_array_get(destinations, destinations->rnum - 1))->d; | 223 | 0 | --destinations->rnum; | 224 | 0 | break; | 225 | 0 | } | 226 | 0 | } | 227 | 4 | } |
Unexecuted instantiation: ccv_nnc_dynamic_graph_evaluate.c:ccv_nnc_remove_if_prior_to_any |
228 | | |
229 | | typedef struct { |
230 | | int type; |
231 | | int d; |
232 | | } ccv_nnc_tape_symbol_t; |
233 | | |
234 | | static inline void ccv_nnc_dynamic_graph_push_backward_tensor_symbol(void* context, const ccv_nnc_tensor_symbol_t symbol, const ccv_nnc_tensor_param_t info, const char* const name) |
235 | 40.9k | { |
236 | 40.9k | ccv_array_t* const stack = (ccv_array_t*)context; |
237 | 40.9k | ccv_nnc_tape_symbol_t tape_symbol = { |
238 | 40.9k | .d = symbol.d, |
239 | 40.9k | .type = CCV_NNC_SYMBOL_TENSOR, |
240 | 40.9k | }; |
241 | 40.9k | ccv_array_push(stack, &tape_symbol); |
242 | 40.9k | } Unexecuted instantiation: ccv_nnc_dynamic_graph.c:ccv_nnc_dynamic_graph_push_backward_tensor_symbol Unexecuted instantiation: ccv_nnc_dynamic_graph_alloc.c:ccv_nnc_dynamic_graph_push_backward_tensor_symbol ccv_nnc_dynamic_graph_backward.c:ccv_nnc_dynamic_graph_push_backward_tensor_symbol Line | Count | Source | 235 | 26.1k | { | 236 | 26.1k | ccv_array_t* const stack = (ccv_array_t*)context; | 237 | 26.1k | ccv_nnc_tape_symbol_t tape_symbol = { | 238 | 26.1k | .d = symbol.d, | 239 | 26.1k | .type = CCV_NNC_SYMBOL_TENSOR, | 240 | 26.1k | }; | 241 | 26.1k | ccv_array_push(stack, &tape_symbol); | 242 | 26.1k | } |
ccv_nnc_dynamic_graph_apply_gradients.c:ccv_nnc_dynamic_graph_push_backward_tensor_symbol Line | Count | Source | 235 | 5.73k | { | 236 | 5.73k | ccv_array_t* const stack = (ccv_array_t*)context; | 237 | 5.73k | ccv_nnc_tape_symbol_t tape_symbol = { | 238 | 5.73k | .d = symbol.d, | 239 | 5.73k | .type = CCV_NNC_SYMBOL_TENSOR, | 240 | 5.73k | }; | 241 | 5.73k | ccv_array_push(stack, &tape_symbol); | 242 | 5.73k | } |
ccv_nnc_dynamic_graph_minimize.c:ccv_nnc_dynamic_graph_push_backward_tensor_symbol Line | Count | Source | 235 | 9.01k | { | 236 | 9.01k | ccv_array_t* const stack = (ccv_array_t*)context; | 237 | 9.01k | ccv_nnc_tape_symbol_t tape_symbol = { | 238 | 9.01k | .d = symbol.d, | 239 | 9.01k | .type = CCV_NNC_SYMBOL_TENSOR, | 240 | 9.01k | }; | 241 | 9.01k | ccv_array_push(stack, &tape_symbol); | 242 | 9.01k | } |
Unexecuted instantiation: ccv_nnc_dynamic_graph_evaluate.c:ccv_nnc_dynamic_graph_push_backward_tensor_symbol |
243 | | |
244 | | static inline void ccv_nnc_dynamic_graph_push_backward_tensor_symbol_alias(void* context, const ccv_nnc_tensor_symbol_t symbol, const ccv_nnc_tensor_symbol_t from_symbol, const int ofs[CCV_NNC_MAX_DIM_ALLOC], const int stride[CCV_NNC_MAX_DIM_ALLOC], const ccv_nnc_tensor_param_t info, const char* const name) |
245 | 1.01k | { |
246 | 1.01k | ccv_array_t* const stack = (ccv_array_t*)context; |
247 | 1.01k | ccv_nnc_tape_symbol_t tape_symbol = { |
248 | 1.01k | .d = symbol.d, |
249 | 1.01k | .type = CCV_NNC_SYMBOL_TENSOR_ALIAS, |
250 | 1.01k | }; |
251 | 1.01k | ccv_array_push(stack, &tape_symbol); |
252 | 1.01k | } Unexecuted instantiation: ccv_nnc_dynamic_graph.c:ccv_nnc_dynamic_graph_push_backward_tensor_symbol_alias Unexecuted instantiation: ccv_nnc_dynamic_graph_alloc.c:ccv_nnc_dynamic_graph_push_backward_tensor_symbol_alias ccv_nnc_dynamic_graph_backward.c:ccv_nnc_dynamic_graph_push_backward_tensor_symbol_alias Line | Count | Source | 245 | 1.01k | { | 246 | 1.01k | ccv_array_t* const stack = (ccv_array_t*)context; | 247 | 1.01k | ccv_nnc_tape_symbol_t tape_symbol = { | 248 | 1.01k | .d = symbol.d, | 249 | 1.01k | .type = CCV_NNC_SYMBOL_TENSOR_ALIAS, | 250 | 1.01k | }; | 251 | 1.01k | ccv_array_push(stack, &tape_symbol); | 252 | 1.01k | } |
Unexecuted instantiation: ccv_nnc_dynamic_graph_apply_gradients.c:ccv_nnc_dynamic_graph_push_backward_tensor_symbol_alias Unexecuted instantiation: ccv_nnc_dynamic_graph_minimize.c:ccv_nnc_dynamic_graph_push_backward_tensor_symbol_alias Unexecuted instantiation: ccv_nnc_dynamic_graph_evaluate.c:ccv_nnc_dynamic_graph_push_backward_tensor_symbol_alias |
253 | | |
254 | | static inline void ccv_nnc_dynamic_graph_push_backward_graph_exec_symbol(void* context, const ccv_nnc_graph_exec_symbol_t symbol, const ccv_nnc_cmd_t cmd, const ccv_nnc_tensor_symbol_t* const inputs, const int input_size, const ccv_nnc_tensor_symbol_t* const outputs, const int output_size, const char* const name) |
255 | 23.9k | { |
256 | 23.9k | ccv_array_t* const stack = (ccv_array_t*)context; |
257 | 23.9k | ccv_nnc_tape_symbol_t tape_symbol = { |
258 | 23.9k | .d = symbol.d, |
259 | 23.9k | .type = CCV_NNC_SYMBOL_GRAPH_EXEC, |
260 | 23.9k | }; |
261 | 23.9k | ccv_array_push(stack, &tape_symbol); |
262 | 23.9k | } Unexecuted instantiation: ccv_nnc_dynamic_graph.c:ccv_nnc_dynamic_graph_push_backward_graph_exec_symbol Unexecuted instantiation: ccv_nnc_dynamic_graph_alloc.c:ccv_nnc_dynamic_graph_push_backward_graph_exec_symbol ccv_nnc_dynamic_graph_backward.c:ccv_nnc_dynamic_graph_push_backward_graph_exec_symbol Line | Count | Source | 255 | 17.4k | { | 256 | 17.4k | ccv_array_t* const stack = (ccv_array_t*)context; | 257 | 17.4k | ccv_nnc_tape_symbol_t tape_symbol = { | 258 | 17.4k | .d = symbol.d, | 259 | 17.4k | .type = CCV_NNC_SYMBOL_GRAPH_EXEC, | 260 | 17.4k | }; | 261 | 17.4k | ccv_array_push(stack, &tape_symbol); | 262 | 17.4k | } |
ccv_nnc_dynamic_graph_apply_gradients.c:ccv_nnc_dynamic_graph_push_backward_graph_exec_symbol Line | Count | Source | 255 | 1.44k | { | 256 | 1.44k | ccv_array_t* const stack = (ccv_array_t*)context; | 257 | 1.44k | ccv_nnc_tape_symbol_t tape_symbol = { | 258 | 1.44k | .d = symbol.d, | 259 | 1.44k | .type = CCV_NNC_SYMBOL_GRAPH_EXEC, | 260 | 1.44k | }; | 261 | 1.44k | ccv_array_push(stack, &tape_symbol); | 262 | 1.44k | } |
ccv_nnc_dynamic_graph_minimize.c:ccv_nnc_dynamic_graph_push_backward_graph_exec_symbol Line | Count | Source | 255 | 5.01k | { | 256 | 5.01k | ccv_array_t* const stack = (ccv_array_t*)context; | 257 | 5.01k | ccv_nnc_tape_symbol_t tape_symbol = { | 258 | 5.01k | .d = symbol.d, | 259 | 5.01k | .type = CCV_NNC_SYMBOL_GRAPH_EXEC, | 260 | 5.01k | }; | 261 | 5.01k | ccv_array_push(stack, &tape_symbol); | 262 | 5.01k | } |
Unexecuted instantiation: ccv_nnc_dynamic_graph_evaluate.c:ccv_nnc_dynamic_graph_push_backward_graph_exec_symbol |
263 | | |
264 | | static inline int ccv_nnc_tensor_variable_contains_value(ccv_nnc_tensor_variable_t const tensor_variable) |
265 | 4.68k | { |
266 | | // A tensor variable contains value only if it has a tensor view, and these tensor view is not external bind without a symbol (thus, freshly external bind). |
267 | 4.68k | return tensor_variable->tensor_view && (3.40k !3.40k CCV_NNC_IS_EXTERN_TENSOR_VIEW3.40k (tensor_variable->tensor_view) || tensor_variable->symbol.d >= 01 ); |
268 | 4.68k | } Unexecuted instantiation: ccv_nnc_dynamic_graph.c:ccv_nnc_tensor_variable_contains_value Unexecuted instantiation: ccv_nnc_dynamic_graph_alloc.c:ccv_nnc_tensor_variable_contains_value ccv_nnc_dynamic_graph_backward.c:ccv_nnc_tensor_variable_contains_value Line | Count | Source | 265 | 3.24k | { | 266 | | // A tensor variable contains value only if it has a tensor view, and these tensor view is not external bind without a symbol (thus, freshly external bind). | 267 | 3.24k | return tensor_variable->tensor_view && (2.00k !2.00k CCV_NNC_IS_EXTERN_TENSOR_VIEW2.00k (tensor_variable->tensor_view) || tensor_variable->symbol.d >= 01 ); | 268 | 3.24k | } |
ccv_nnc_dynamic_graph_apply_gradients.c:ccv_nnc_tensor_variable_contains_value Line | Count | Source | 265 | 1.43k | { | 266 | | // A tensor variable contains value only if it has a tensor view, and these tensor view is not external bind without a symbol (thus, freshly external bind). | 267 | 1.43k | return tensor_variable->tensor_view && (1.40k !1.40k CCV_NNC_IS_EXTERN_TENSOR_VIEW1.40k (tensor_variable->tensor_view) || tensor_variable->symbol.d >= 00 ); | 268 | 1.43k | } |
Unexecuted instantiation: ccv_nnc_dynamic_graph_minimize.c:ccv_nnc_tensor_variable_contains_value Unexecuted instantiation: ccv_nnc_dynamic_graph_evaluate.c:ccv_nnc_tensor_variable_contains_value |
269 | | |
270 | | void ccv_nnc_dynamic_graph_exec_ret(ccv_nnc_dynamic_graph_t* const graph, const ccv_nnc_cmd_t cmd, const ccv_nnc_hint_t hint, const int flags, const ccv_nnc_tensor_variable_t* const inputs, const int input_size, ccv_nnc_tensor_variable_t* const outputs, const int output_size, const int parallel, ccv_nnc_stream_context_t* const stream_context, ccv_nnc_graph_exec_symbol_t* const graph_execs); |
271 | | |
272 | | extern const ccv_nnc_symbolic_graph_compile_allocator_vtab_t ccv_nnc_dy_allocator_isa; |
273 | | |
274 | | typedef struct { |
275 | | ccv_nnc_graph_t* graph; |
276 | | ccv_nnc_tensor_arena_t* tensor_arena; |
277 | | ccv_nnc_graph_exec_arena_t* exec_arena; |
278 | | } ccv_nnc_compilation_artifact_t; |
279 | | |
280 | | ccv_nnc_compilation_artifact_t* ccv_nnc_compilation_artifact_new(ccv_nnc_graph_t* const graph, ccv_nnc_tensor_arena_t* const tensor_arena, ccv_nnc_graph_exec_arena_t* const exec_arena); |
281 | | void ccv_nnc_compilation_artifact_free(ccv_nnc_compilation_artifact_t* const artifact); |
282 | | |
283 | | #endif |