【发布时间】: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 在捕获列表中。你还有哪些选择?