Link graph: Don't place jobs with different join dates in the same job set

This commit is contained in:
Jonathan G Rennison
2019-02-22 00:53:59 +00:00
parent 36ac643749
commit e0e490112c

View File

@@ -280,11 +280,12 @@ void LinkGraphJobGroup::JoinThread() {
const uint thread_budget = 200000; const uint thread_budget = 200000;
std::sort(jobs.begin(), jobs.end(), [](const JobInfo &a, const JobInfo &b) { std::sort(jobs.begin(), jobs.end(), [](const JobInfo &a, const JobInfo &b) {
return a.cost_estimate < b.cost_estimate; return std::make_pair(a.job->JoinDateTicks(), a.cost_estimate) < std::make_pair(b.job->JoinDateTicks(), b.cost_estimate);
}); });
std::vector<LinkGraphJob *> bucket; std::vector<LinkGraphJob *> bucket;
uint bucket_cost = 0; uint bucket_cost = 0;
DateTicks bucket_join_date = 0;
auto flush_bucket = [&]() { auto flush_bucket = [&]() {
if (!bucket_cost) return; if (!bucket_cost) return;
DEBUG(linkgraph, 2, "LinkGraphJobGroup::ExecuteJobSet: Creating Job Group: jobs: " PRINTF_SIZE ", cost: %u", bucket.size(), bucket_cost); DEBUG(linkgraph, 2, "LinkGraphJobGroup::ExecuteJobSet: Creating Job Group: jobs: " PRINTF_SIZE ", cost: %u", bucket.size(), bucket_cost);
@@ -295,7 +296,8 @@ void LinkGraphJobGroup::JoinThread() {
}; };
for (JobInfo &it : jobs) { for (JobInfo &it : jobs) {
if (bucket_cost && (bucket_cost + it.cost_estimate > thread_budget)) flush_bucket(); if (bucket_cost && (bucket_join_date != it.job->JoinDateTicks() || (bucket_cost + it.cost_estimate > thread_budget))) flush_bucket();
bucket_join_date = it.job->JoinDateTicks();
bucket.push_back(it.job); bucket.push_back(it.job);
bucket_cost += it.cost_estimate; bucket_cost += it.cost_estimate;
} }