gpt4 book ai didi

c++ - 中断 parallel_for_each 的子任务

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:17:00 28 4
gpt4 key购买 nike

我有一个很大的项目 vector ,这些项目是根据它们的一个字段排序的,例如一个成本属性,我想对这些项目中的每一个进行一些处理以找到不同属性的最大值......这里的约束是如果该项目的成本超过,我们不能使用该项目来计算最大值一些任意的价格。

单线程 for 循环如下所示:

auto maxValue = -MAX_FLT;
for(const auto& foo: foos) {

// Break if the cost is too high.
if(foo.cost() > 46290) {
break;
}

maxValue = max(maxValue , foo.value());
}

我已经能够某种程度上将其转换为 parallel_for_each。 (免责声明:我是 PPL 的新手。)

combinable<float> localMaxValue([]{ return -MAX_FLT; });

parallel_for_each(begin(foos), end(foos), [&](const auto& foo) {

// Attempt to early out if the cost is too high.
if(foo.getCost() > 46290) {
return;
}

localMaxValue.local() = max(localMaxValue.local(), foo.getValue());
}

auto maxValue = localMaxValue.combine(
[](const auto& first, const auto& second) {
return max<float>(first, second);
});

parallel_for 中的 return 语句感觉效率低下,因为它仍在对每个项目执行,在这种情况下,parallel_for 很可能最终迭代成本太高的 vector 的多个部分。

我如何利用 vector 已经按成本排序的事实?

我研究过使用取消 token ,但这种方法似乎不正确,因为它会导致 parallel_for 的所有子任务被取消,这意味着我可能会得到错误的最大值。

是否有取消 token 之类的东西可以取消 parallel_for 的特定子任务,或者在这种情况下是否有比 parallel_for 更好的工具?

最佳答案

如果 vector 按成本排序,那么您可以仅迭代成本低于成本限制的项目。

如果成本是x。找到等于或大于 x 的第一项迭代器。你可以使用 std::lower_bound。然后使用 parallel_for_each 从 vector 的开头到找到的迭代器。

combinable<float> localMaxValue([]{ return -MAX_FLT; });

//I'm assuming foos is std::vector.
int cost_limit = 46290;
auto it_end = std::lower_bound(foos.begin(), foos.end(), cost_limit, [](const auto& foo, int cost_limit)
{
return foo.getCost() < cost_limit;
});

parallel_for_each(foos.begin(), foos.end(), [&](const auto& foo) {
localMaxValue.local() = max(localMaxValue.local(), foo.getValue());
}

auto maxValue = localMaxValue.combine(
[](const auto& first, const auto& second) {
return max<float>(first, second);
});

关于c++ - 中断 parallel_for_each 的子任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32196052/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com