@@ -28,21 +28,23 @@ CStatus GDynamicEngine::setup(const GSortedGElementPtrSet& elements) {
28
28
29
29
30
30
CStatus GDynamicEngine::run () {
31
- CGRAPH_FUNCTION_BEGIN
32
31
cur_status_.reset ();
33
32
34
- if (internal::GEngineDagType::COMMON == dag_type_) {
35
- commonRunAll ();
36
- } else if (internal::GEngineDagType::ALL_SERIAL == dag_type_) {
37
- serialRunAll ();
38
- } else if (internal::GEngineDagType::ALL_PARALLEL == dag_type_) {
39
- parallelRunAll ();
40
- } else {
41
- CGRAPH_RETURN_ERROR_STATUS (" unknown engine dag type" )
33
+ switch (dag_type_) {
34
+ case internal::GEngineDagType::COMMON:
35
+ commonRunAll ();
36
+ break ;
37
+ case internal::GEngineDagType::ALL_SERIAL:
38
+ serialRunAll ();
39
+ break ;
40
+ case internal::GEngineDagType::ALL_PARALLEL:
41
+ parallelRunAll ();
42
+ break ;
43
+ default :
44
+ CGRAPH_RETURN_ERROR_STATUS (" unknown engine dag type" );
42
45
}
43
46
44
- status = cur_status_;
45
- CGRAPH_FUNCTION_END
47
+ return cur_status_;
46
48
}
47
49
48
50
@@ -103,22 +105,16 @@ CVoid GDynamicEngine::analysisParallelMatrix() {
103
105
CSize thdSize = config.default_thread_size_ + config.secondary_thread_size_ ;
104
106
CGRAPH_THROW_EXCEPTION_BY_CONDITION (thdSize <= 0 ,
105
107
" default thread size cannot smaller than 1" );
106
-
107
108
CSize taskNumPerThd = total_end_size_ / thdSize + (CSize)(0 != total_end_size_ % thdSize);
108
109
CGRAPH_THROW_EXCEPTION_BY_CONDITION (taskNumPerThd == 0 ,
109
110
" task number per thread is 0" );
110
- CGRAPH_THROW_EXCEPTION_BY_CONDITION (total_end_size_ <= 1 ,
111
- " total end size <= 1, should not enter all parallel path" );
112
- if (1 == taskNumPerThd) {
113
- // 如果线程数比 task数量都多,则直接放到一个 arr里就好了
114
- parallel_element_matrix_.push_back (total_element_arr_);
115
- return ;
116
- }
117
111
118
112
CSize curIndex = 0 ;
119
113
while (curIndex < total_end_size_) {
120
114
CSize curEnd = curIndex + taskNumPerThd < total_end_size_ ? curIndex + taskNumPerThd : total_end_size_ ;
121
115
GElementPtrArr curArr (total_element_arr_.data () + curIndex, total_element_arr_.data () + curEnd);
116
+ CGRAPH_THROW_EXCEPTION_BY_CONDITION (curArr.empty (),
117
+ " current elements array cannot be empty" );
122
118
parallel_element_matrix_.push_back (curArr);
123
119
curIndex += taskNumPerThd;
124
120
}
@@ -170,7 +166,7 @@ CVoid GDynamicEngine::afterElementRun(GElementPtr element) {
170
166
}
171
167
}
172
168
}
173
- reserved ? process (reserved, true ) : void ();
169
+ if ( reserved) { process (reserved, true ); }
174
170
}
175
171
} else {
176
172
CGRAPH_LOCK_GUARD lock (locker_.mtx_ );
@@ -224,11 +220,18 @@ CVoid GDynamicEngine::parallelRunAll() {
224
220
CVoid GDynamicEngine::parallelRunAll () {
225
221
parallel_run_num_ = 0 ;
226
222
for (CIndex i = 0 ; i < (CIndex)parallel_element_matrix_.size (); i++) {
227
- const auto & curArr = parallel_element_matrix_[i];
228
- for (auto element : curArr) {
229
- thread_pool_->executeWithTid ([this , element] { parallelRunOne (element); }, i,
230
- element == curArr.front () || element == curArr.back (),
231
- element == curArr.front ());
223
+ auto & curArr = parallel_element_matrix_[i];
224
+ if (curArr.size () > 1 ) {
225
+ for (const auto & element : curArr) {
226
+ thread_pool_->executeWithTid ([this , element] { parallelRunOne (element); }, i,
227
+ element == curArr.front () || element == curArr.back (),
228
+ element == curArr.front ());
229
+ }
230
+ } else {
231
+ // 仅有一个任务的情况,无法使用 executeWithTid 函数,故走这边的逻辑
232
+ const auto & element = curArr.front ();
233
+ thread_pool_->execute ([this , element] {
234
+ parallelRunOne (element); }, element->binding_index_ );
232
235
}
233
236
}
234
237
0 commit comments