什么是tbb中parallel_reduce的Reduce?

时间:2013-12-15 05:38:47

标签: c++ multithreading c++11 lambda tbb

parallel_reduce提供2个接口,lambdas的接口可以像上一个链接中显示的那样使用

#include "tbb/parallel_reduce.h"
#include "tbb/blocked_range.h"

using namespace tbb;

float ParallelSum( float array[], size_t n ) {
    return parallel_reduce( 
        blocked_range<float*>( array, array+n ), 
        0.f, 
        [](const blocked_range<float*>& r, float init)->float {
            for( float* a=r.begin(); a!=r.end(); ++a ) 
                init += *a;
            return init;
        },
        []( float x, float y )->float { // what this lambda does ?
            return x+y;
        }
    );                    
}

第二个lambda符合const Reduction& reduction签名,我正在研究这个lambda试图改变身体或值,但它确实没有做任何事情(即使我把cout放在里面,没什么发生),看起来就像没有任何理由一样。

这个Reduction的目的是什么? 与0f有关系吗?我得到的是0f是一个用于检测可以跳过的值的谓词,但我仍然无法弄清楚lambda的作用......

1 个答案:

答案 0 :(得分:5)

第一个lambda计算范围内的表达式,给出该范围的结果。

第二个lambda结合了两个范围计算的结果,给出了两个范围组合的结果。

如果parallel_reduce将操作分解为多个范围,则只会调用第二个lambda。