2013-12-15 445 views
0

parallel_reduce提供2個接口,可以使用一個用於Lambda表達式像顯示,在上一個鏈接什麼是tbb中的parallel_reduce的減少?

#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; 
     } 
    );      
} 

第二拉姆達在const Reduction& reduction簽名適合,我學習這個拉姆達試圖改變身體或值,但它沒有任何作用(即使我把cout放在裏面,也沒有任何反應),看起來好像沒有任何理由。

這個Reduction的目的是什麼? 跟0f有什麼關係?對於我得到的那個0f是一個謂詞,用於檢測可以跳過的值是什麼,但我仍然無法弄清楚lambda是什麼...

回答

5

第一個lambda計算表達式的範圍,給出該範圍的結果。

第二個lambda結合了兩個範圍計算的結果,給出了兩個範圍組合的結果。

如果parallel_reduce將操作拆分爲多個範圍,則只會調用第二個lambda。

+0

這件事在其他條款的頁面上解釋,或者我是盲人,我無法在頁面上看到? – user2485710

+1

它全部壓縮成這句話:「函數形式parallel_reduce(範圍,標識,函數,簡化)通過將func應用於範圍中的子範圍並使用二元運算符簡化來減少結果,從而執行並行簡化。」 –

+0

那麼,以及剛纔的表格,它表示Func「累積結果的子範圍,從初始值x開始」和減少「結合結果x和y」。 –

相關問題