【问题标题】:Removing finished futures to keep their number constant删除已完成的期货以保持其数量不变
【发布时间】:2015-02-05 21:55:00
【问题描述】:

我有一个程序需要启动大量期货;具体来说,超过size_t。拥有许多期货的正常方法是将它们放在一个容器中,但由于它们太多,我将不得不移除成品。程序需要计算并行的新行数。

这就是我想为n>size_t工作的:

vector<future<int>> vf;
for(size_t i=0; i<n;++i){
  vf.emplace_back(async([&](){ return count_lines(part_of_an_array);});
}
double cnt=0;
for(auto i:vf) cnt+=i;

我想到的一种方法是保留vector&lt;char&gt; busy_fvector&lt;bool&gt; 可能不是线程安全的)。 count_lines 开始时 --> busy_f[i_future]=0,以及何时结束 --> busy_f[i_future]=1

有更快的方法吗?

【问题讨论】:

  • size_t 不是数字,而是类型。你的意思是“超过std::numeric_limits&lt;size_t&gt;::max()”吗?

标签: c++11 asynchronous containers bigdata future


【解决方案1】:

在这种情况下“手动”创建线程甚至期货通常不是一个好主意,因为很难创建“正确数量”的线程:请记住,您只有相对少量的实际内核/线程继续执行,并创建所有额外的未来,这些未来不会立即映射到线程,只是阻塞和等待并占用内存空间是浪费的。

我会使用某种更高级别的并行化原语,例如“parallel for”或并行 map-reduce 实现。

我不知道您使用的是什么操作系统/编译器,所以我建议使用 TBB 作为跨平台解决方案。如果您在 Microsoft 堆栈上,他们有自己的并行库,在某些方面比 TBB 更好。

在 TBB 中,他们有一个 parallel_reduce 模板函数,看起来完全符合您的需要,并注意他们的承诺:

如果 range 和 body 占用 O(1) 空间,则 range 拆分为 几乎相等的部分,则空间复杂度为 O(P log(N)),其中 N 是范围的大小,P 是线程数。

但是,TBB 中的所有范围都限制为 size_t...也许您可以编写一个外部循环,从更大的问题中“生成”size_t 元素的“块”,然后对于每个块,您可以调用 parallel_reduce 和总结他们的结果。

double result = 0;
for(BingNumber offset = 0; offset < n; offset += BigNumber(size_t_size))
{
   result += parallel_reduce( ... )
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    相关资源
    最近更新 更多