【问题标题】:lambda tbb parallel reduce with a few arguments带有几个参数的 lambda tbb 并行减少
【发布时间】:2015-10-21 21:47:40
【问题描述】:

我想使用 tbb 并行减少来计算方差。 以 lambda 表达式形式表达以下代码的最佳方式是什么。

谢谢。

struct Sum {
    float sum, sum2;
    Sum() : sum(0), sum2(0) {}
    Sum( Sum& s, tbb::split ) {sum = 0; sum2 = 0; }
    void operator()(const tbb::blocked_range<float*>& r ) {
        float temp = sum;
        float temp2 = sum2;
        for( float* a=r.begin(); a!=r.end(); ++a ) {
            temp += *a;
            temp2 += (*a)*(*a);
        }
        sum = temp;
        sum2 = temp2;
    }
    void join( Sum& rhs ) {sum += rhs.sum; sum2 += rhs.sum2; }
    float variance(size_t n){ return (sum2-(sum*sum)/n)/(n - 1); }
};
Sum t;
tbb::parallel_reduce( tbb::blocked_range<float*>( pSrc, pSrc+n ), t );
variance = (t.sum2 - (t.sum * t.sum)/n)/(n - 1);

【问题讨论】:

  • 将所有内容写入一个 lambda 函数,其中 sum,sum2 在捕获列表中。你还有哪些选择?

标签: c++ lambda reduce tbb


【解决方案1】:

感谢大卫的灵感。这是我的解决方案。

struct Sum {
    float x, x2;
    Sum(float _x, float _x2): x(_x), x2(_x2) {}
    Sum(): x(0), x2(0) {};
};  

Sum sum = tbb::parallel_reduce(tbb::blocked_range<size_t>(0, n), Sum(),
    [&](const tbb::blocked_range<size_t> &r, Sum temp)->Sum{
        for(size_t i=r.begin(); i!=r.end(); ++i){
            temp.x+=pSrc[i];
            temp.x2+=pSrc[i]*pSrc[i];
        }
        return temp;
    },
    [](Sum a, Sum b)->Sum {
        a.x+=b.x;
        a.x2+=b.x2;
        return a;
    });

variance= (sum.x2-(sum.x*sum.x)/n)/(n - 1);

【讨论】:

    猜你喜欢
    • 2017-10-22
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 2021-12-23
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    相关资源
    最近更新 更多