Skip to content

Commit 3c976b9

Browse files
committed
[perf] optimize parallel engine
1 parent e5ebd03 commit 3c976b9

File tree

4 files changed

+40
-28
lines changed

4 files changed

+40
-28
lines changed

src/GraphCtrl/GraphElement/GElementDefine.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ enum class GElementShape {
5757
NORMAL = 0, // 普通的元素
5858
LINKABLE = 1, // 后继是唯一元素的情况(类似 list)
5959
ROOT = 2, // 所有后继元素,只有一个前驱的情况(类似tree root)
60+
TAIL = 3, // 尾部节点
6061
};
6162
CGRAPH_INTERNAL_NAMESPACE_END
6263

src/GraphCtrl/GraphElement/_GEngine/GDynamicEngine/GDynamicEngine.cpp

Lines changed: 36 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ CVoid GDynamicEngine::process(GElementPtr element, CBool affinity) {
133133
// 当且仅当整体状正常,且当前状态异常的时候,进入赋值逻辑。确保不重复赋值
134134
CGRAPH_LOCK_GUARD lk(status_lock_);
135135
cur_status_ += curStatus;
136+
locker_.cv_.notify_one();
136137
}
137138
afterElementRun(element);
138139
};
@@ -148,37 +149,45 @@ CVoid GDynamicEngine::process(GElementPtr element, CBool affinity) {
148149

149150
CVoid GDynamicEngine::afterElementRun(GElementPtr element) {
150151
element->done_ = true;
151-
if (!element->run_before_.empty() && cur_status_.isOK()) {
152-
if (internal::GElementShape::LINKABLE == element->shape_) {
153-
process(element->run_before_.front(), true);
154-
} else if (internal::GElementShape::ROOT == element->shape_) {
155-
for (CSize i = 0; i < element->run_before_.size(); i++) {
156-
process(element->run_before_[i], i == element->run_before_.size() - 1);
152+
if (unlikely(cur_status_.isErr())) {
153+
return;
154+
}
155+
156+
switch (element->shape_) {
157+
case internal::GElementShape::NORMAL:
158+
{
159+
GElementPtr reserved = nullptr;
160+
for (auto* cur : element->run_before_) {
161+
if (--cur->left_depend_ <= 0) {
162+
if (reserved) {
163+
process(cur, false);
164+
} else {
165+
reserved = cur; // 留一个作为亲和性的,在当前线程运行
166+
}
167+
}
168+
}
169+
170+
if (reserved) { process(reserved, true); }
157171
}
158-
} else {
159-
GElementPtr reserved = nullptr;
172+
break;
173+
case internal::GElementShape::LINKABLE:
174+
process(element->run_before_.front(), true);
175+
break;
176+
case internal::GElementShape::ROOT:
160177
for (auto* cur : element->run_before_) {
161-
if (--cur->left_depend_ <= 0) {
162-
if (reserved) {
163-
process(cur, false);
164-
} else {
165-
reserved = cur; // 留一个作为亲和性的,在当前线程运行
166-
}
178+
process(cur, element->run_before_.back() == cur);
179+
}
180+
break;
181+
case internal::GElementShape::TAIL:
182+
{
183+
CGRAPH_LOCK_GUARD lock(locker_.mtx_);
184+
if ((++finished_end_size_ >= total_end_size_)) {
185+
locker_.cv_.notify_one();
167186
}
168187
}
169-
if (reserved) { process(reserved, true); }
170-
}
171-
} else {
172-
CGRAPH_LOCK_GUARD lock(locker_.mtx_);
173-
/**
174-
* 满足一下条件之一,则通知wait函数停止等待
175-
* 1,无后缀节点全部执行完毕(在运行正常的情况下,只有无后缀节点执行完成的时候,才可能整体运行结束)
176-
* 2,有节点执行状态异常
177-
*/
178-
if ((element->run_before_.empty() && (++finished_end_size_ >= total_end_size_))
179-
|| cur_status_.isErr()) {
180-
locker_.cv_.notify_one();
181-
}
188+
break;
189+
default:
190+
break;
182191
}
183192
}
184193

src/GraphCtrl/GraphElement/_GEngine/GDynamicEngine/GDynamicEngine.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ class GDynamicEngine : public GEngine {
9797
CSize finished_end_size_ = 0; // 执行结束节点数量
9898
CStatus cur_status_; // 当前全局的状态信息
9999
std::atomic<CSize> parallel_run_num_ {0}; // 纯并行时,执行的个数信息
100-
GElementPtrMat2D parallel_element_matrix_ {}; // 纯并行时,记录
100+
GElementPtrMat2D parallel_element_matrix_ {}; // 纯并行时,记录分解后的数据
101101

102102
internal::GEngineDagType dag_type_ = { internal::GEngineDagType::COMMON }; // 当前元素的排布形式
103103

src/GraphCtrl/GraphElement/_GEngine/GEngine.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ class GEngine : public GElementObject {
5757
&& std::all_of(succession.begin(), succession.end(),
5858
[](GElementPtr ptr) { return 1 == ptr->dependence_.size();})) {
5959
element->shape_ = internal::GElementShape::ROOT;
60+
} else if (element->run_before_.empty()) {
61+
element->shape_ = internal::GElementShape::TAIL;
6062
} else {
6163
element->shape_ = internal::GElementShape::NORMAL;
6264
}

0 commit comments

Comments
 (0)