我决定编写一个算法来利用并行聚合。这是我想要转换的单线程代码。
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()方法 并行循环内部将散列表查找的成本添加到每个循环中 循环的迭代。通常,使用并行聚合 迭代执行复杂计算时提高性能。
感谢。