【问题标题】:Find max value with ppl.h使用 ppl.h 查找最大值
【发布时间】:2014-04-08 13:50:42
【问题描述】:

在 C++ 的 ppl 库中是否有一个简单的函数,您可以在其中执行 Concurrency::max(vec) 之类的操作,其中 vec 是数字向量?我可以自己写,但我希望我可以节省自己的工作。

编辑:对不起,我可能不够清楚。我需要 max 函数来利用并行化。

【问题讨论】:

  • 看起来你需要do a map-reduce,但说实话这确实是一个分区分治问题。
  • 我不知道如何使用 map-reduce。我想我必须编写自己的分而治之的方法。
  • 老实说,除非这个向量是千兆字节并且部分交换到磁盘。使用value based max 的单线程方法可能会并行击败任何东西。现代 CPU 非常适合这种事情。

标签: c++ max ppl


【解决方案1】:

没有内置任何东西,但它很简单,可以组合(一个归约变量)和一个并行循环(这里是 parallel_for_each)。但是,如果您正在做的工作只是“最大”的数字,除非您正在查看的数字数量非常大,否则可能很难看到加速。

您可以在msdn 上阅读更多相关信息:

#include <ppl.h>
#include <climits>
#include <vector>
#include <numeric>
#include <iostream>
using namespace Concurrency;
int main(int argc, _TCHAR* argv[])
{
    std::vector<int> vec(10);
    std::iota( begin(vec), end(vec), 1);
    combinable<int> locals([]{ return INT_MIN; });
    parallel_for_each( begin(vec), end(vec), [&locals](int cur){
        auto & localMax = locals.local();
        localMax = std::max(cur, localMax);
    });
    std::cout << "max is " << locals.combine([](int left, int right){ return std::max<int>(left, right);}) << std::endl;
    return 0;
}

【讨论】:

    【解决方案2】:

    它只是一个std::vector吗?如果是这样,您可以使用max_element

    auto it = std::max_element(std::begin(vec), std::end(vec));
    

    迭代器it然后指向具有最大值的向量元素。

    【讨论】:

    • 这是否并行运行?
    • 对于单个向量 vec 不,我不相信。它基本上只是将整个向量从begin() 走到end() 并跟踪最大元素。
    • 我很抱歉不够清楚。我希望 max 函数利用我所有的 CPU 内核。我正在遍历的向量相当大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 2022-01-15
    • 2022-01-12
    • 2021-01-24
    • 2018-09-11
    • 2018-09-21
    相关资源
    最近更新 更多