我有一个需要推出大量期货的计划;特别是,超过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<char> busy_f
(vector<bool>
可能不是线程安全的)。当count_lines
开始时 - &gt; busy_f[i_future]=0
,以及何时完成 - &gt; busy_f[i_future]=1
。
有更快的方法吗?
答案 0 :(得分:1)
在这种情况下“手动”创建线程甚至期货通常不是一个好主意,因为很难创建它们的“正确数量”:记住你只有相对较少的实际内核/线程执行,并创建所有额外的未来,不立即映射到一个线程,只是阻止,等待和占用内存空间是浪费。
我使用某种更高级别的并行化原语,比如'parallel for'或并行map-reduce实现。
我不知道你正在使用什么操作系统/编译器,所以我建议将TBB用作跨平台解决方案。如果您使用的是Microsoft堆栈,则它们拥有自己的并行库,这在某些方面优于TBB。
在TBB中,他们有parallel_reduce模板功能,看起来与您的需求完全相同,并注明他们的承诺:
如果范围和正文占用O(1)空格,则范围分成 几乎相等的部分,那么空间复杂度是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( ... )
}