使用PEOPLE或TBB并行聚合集合

时间:2014-11-12 05:25:56

标签: c++ parallel-processing aggregation ppl parallel-for

我决定编写一个算法来利用并行聚合。这是我想要转换的单线程代码。

vector<vector<double>> sum;

for (const auto* fold : _obj.GetFolds())
     sum.push_back(move(vector<double>(fold->GetSize())));

for (int index : sequence)
{
     vector<vector<double>> values = Calculate(vec1[index], vec2[index]);

     for (int i = 0; i < sum.size(); i++)
     {
          for (int j = 0; j < sum[i].size(); j++)
               sum[i][j] += values[i][j];
     }
}

我查看了MSDN页面http://msdn.microsoft.com/en-us/library/gg663540.aspx,其中包含parallel_for with combinable,http://msdn.microsoft.com/en-us/library/dd470426.aspx#map_reduce_example显示parallel_transform with parallel_reduce,但它们只是一个计数器的简单示例。

vector<int> sequence = ...

  combinable<int> count([]() { return 0; });     

  parallel_for_each(sequence.cbegin(), sequence.cend(), 
    [&count](int i)
    {
        count.local() += IsPrime(i) ? 1 : 0;
    });
  return count.combine(plus<int>());

我很难找到一些示例,我将使用上面概述的vector<vector<double>> sum并行循环进行汇总。

另外,我正在寻找关于是否将parallel_for和combinable或parallel_transform与parallel_reduce一起使用的建议?上面的第一个链接指出:

  

parallel_reduce函数通常是推荐的方法   无论什么时候需要在其中应用并行聚合模式   使用PPL的应用程序。它的声明性使它不那么容易发生   错误比其他方法,以及它在多核上的表现   计算机与他们竞争。实现并行聚合   使用parallel_reduce并不需要在代码中添加锁。   相反,所有同步都在内部发生。当然,如果   parallel_reduce不能满足您的需求,或者您更喜欢减少需求   声明式编码,也可以使用可组合类   使用parallel_for或parallel_for_each来实现并行   聚合。

     

您应该知道并行添加了parallel_for和parallel_for_each   由于支持取消等功能而导致开销   动态范围窃取。另外,调用combinable :: local()方法   并行循环内部将散列表查找的成本添加到每个循环中   循环的迭代。通常,使用并行聚合   迭代执行复杂计算时提高性能。

感谢。

0 个答案:

没有答案