tbb中平行Reduce的Reduce是什么

What is the Reduce for a parallel_reduce in tbb?

本文关键字:Reduce 是什么 tbb      更新时间:2023-10-16

parallel_reduce提供了两个接口,其中一个用于Lambda,可以像前面的链接中所示那样使用

#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的作用。。。

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

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

只有当parallel_reduce将运算分解为多个范围时,才会调用第二个lambda。