c++ - tbb 中 parallel_reduce 的 Reduce 是什么?

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

parallel_reduce提供 2 个接口(interface),一个用于 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 inside, nothing happens ), 看起来它毫无理由地在那里。

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

最佳答案

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

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

仅当 parallel_reduce 将操作分解为多个范围时,才会调用第二个 lambda。

关于c++ - tbb 中 parallel_reduce 的 Reduce 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20591561/

相关文章:

c++ - 使用 list<Object*> C++ 的迭代器编译器错误

.net - Interlocked.CompareExchange(double,double,double) 在 32 位操作系统中工作吗?

c++ - 原子 CAS 中的后缀评估

c++11 类内成员初始化

c++ - 可变类中的模板函数

c++ - 如何实现两个第三方类型之间的转换?

c++ - 在带有 GPU 的 Halide 上使用 extern

c++ - 将虚拟锁传递给 std::condition_variable_any::wait

c++ - 是否有适用于其他平台的 Visual C++ 运行时实现?

c++ - 如何使应用程序线程安全?