2015-02-05 41 views
1

我有一个需要推出大量期货的计划;具体而言,超过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_fvector<bool>很可能不是线程安全的)。由于count_lines开始 - >busy_f[i_future]=0,以及何时完成 - >busy_f[i_future]=1

有没有更快的方法?

+0

'size_t'不是一个数字,它是一个类型。你的意思是“超过'std :: numeric_limits :: max()'”? – Casey 2015-02-05 22:24:38

+0

是的,谢谢! – 2015-02-06 01:54:26

回答

1

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

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

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

在TBB他们有一个parallel_reduce模板函数,它看起来就像你需要什么,并注意他们的诺言:

如果范围和身体取O(1)空间,范围分成 几乎相等,则空间复杂度为O(P log(N)),其中N 是范围的大小,P是线程的数量。

然而,TBB所有范围被限制为size_t ...也许你可以写从更大的问题为size_t元素的外循环,“品牌”,“块”,然后对每个块你可以调用并行降低并总结其结果。

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