【问题标题】:What is the Reduce for a parallel_reduce in tbb?tbb 中 parallel_reduce 的 Reduce 是多少?
【发布时间】:2013-12-15 05:38:46
【问题描述】:

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&amp; reduction 签名,我正在研究这个 lambda,试图更改正文或值,但它什么也没做(即使我在里面放了一个 cout,也没有任何反应),看起来就像它没有任何理由一样。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 这件事在那个页面上用其他术语解释或者我是盲人,我无法在页面上看到?
    • 全部压缩成这句话:“函数形式 parallel_reduce(range,identity,func,reduction) 通过将 func 应用于范围内的子范围并使用二元运算符归约来归约结果来执行并行归约。”
    • 嗯,那个,以及紧随其后的表格,其中显示 Func“从初始值 x 开始为子范围累积结果”和归约“合并结果 x 和 y”。
    • 另外,0.f 是,如该页面所述,“Func::operator() 的左标识元素”。在示例中,0 是加法的标识(加 0 不会改变结果)。 这为func 提供了一个起点 - 它可能已传递给init 参数。
    • @AlexanderKondratskiy:谢谢,我忽略了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    相关资源
    最近更新 更多