什么是tbb中parallel_reduce的Reduce?

use*_*710 0 c++ lambda multithreading tbb c++11

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;
        }
    );                    
}
Run Code Online (Sandbox Code Playgroud)

第二个lambda符合const Reduction& reduction签名,我正在研究这个lambda试图改变身体或价值观,但它确实没有做任何事情(即使我把一个cout内部,没有任何事情发生),看起来它完全没有任何理由.

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

Joe*_*e Z 5

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

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

只有在parallel_reduce将操作分解为多个范围时,才会调用第二个lambda .

  • 此外,`0.f`是,如该页面所述"Func :: operator()的左侧标识元素".在示例中,"0"是加法的标识(添加0不会更改结果)._这为`func`_提供了一个起点 - 它可能传递给`init`参数. (3认同)