c 平行計算庫TBB和PPL的基本用法

2021-09-06 13:26:26 字數 4070 閱讀 5151

並行庫充分利用多核的優勢,通過並行運算提高程式效率,本文主要介紹c++中兩個知名的並行庫,乙個是intel開發的tbb,乙個是微軟開發的ppl。本文只介紹其基本的常用用法:並行演算法和任務。

並行演算法

任務排程

並行容器

同步原語

記憶體分配器

parallel_for:並行方式遍歷乙個區間。

parallel_for(1, 20000, (int i));

parallel_for(blocked_range

(0, 20000), (blocked_range&r)

);

parallel_do和parallel_for_each:將演算法應用於乙個區間

vectorv;

parallel_do(v.begin(), v.end(), (size_t i));

parallel_for_each(v.begin(), v.end(), (size_t i));

parallel_reduce

類似於map_reduce,但是有區別。它先將區間自動分組,對每個分組進行聚合(accumulate)計算,每組得到乙個結果,最後將各組的結果進行匯聚(reduce)。這個演算法稍微複雜一點,parallel_reduce(range,identity,func,reduction),第乙個引數是區間範圍,第二個引數是計算的初始值,第三個引數是聚合函式,第四個引數是匯聚引數。

float parallelsum(float

array , size_t n) ,

std::plus

());

}

這個對陣列求和的例子就是先自動分組然後對各組中的元素進行聚合累加,最後將各組結果匯聚相加。

parallel_pipeline:並行的管道過濾器

資料流經過乙個管道,在資料流動的過程中依次要經過一些過濾器的處理,其中有些過濾器可能會並行處理資料,這時就可以用到並行的管道過濾器。舉乙個例子,比如我要讀入乙個檔案,先將檔案中的數字提取出來,再將提取出來的數字做乙個轉換,最後將轉換後的數字輸出到另外乙個檔案中。其中讀檔案和輸出檔案不能並興去做,但是中間數字轉換的環節可以並行去做的。parallel_pipeline的原型:

parallel_pipeline( max_number_of_live_tokens, 

make_filter

(mode0,g0) &make_filter

(mode1,g1) &make_filter

(mode2,g2) &...

make_filter

void>(moden,gn) );

第乙個引數是最大的並行數,我們可以通過&連線多個filter,這些filter是順序執行的,前乙個filter的輸出是下乙個filter的輸入。

float rootmeansquare( float* first, float*last )  

else

}

) &make_filter

(filter::parallel,

(float* p)

) &make_filter

(filter::serial,

[&](float x) ));

return

sqrt(sum);

}

第乙個filter生成資料(如從檔案中讀取資料等),第二個filter對產生的資料進行轉換,第三個filter是對轉換後的資料做累加。其中第二個filter是可以並行處理的,通過filter::parallel來指定其處理模式。

parallel_sort:並行排序

const

int n = 1000000

;float

a[n];

float

b[n];

parallel_sort(a, a +n);

parallel_sort(b, b + n, std::greater());

parallel_invoke:並行呼叫,並行呼叫多個函式

void

f();

extern

void bar(int

);void

runfunctionsinparallel() , );

}

task_group表示可以等待或者取消的任務集合

task_group g;

g.run();

g.run();

g.run();

g.wait();

ppl是微軟開發的平行計算庫,它的功能和tbb是差不多的,但是ppl只能在windows上使用。二者在並行演算法的使用上基本上是一樣的, 但還是有差異的。二者的差異:

parallel_reduce的原型有些不同,ppl的paraller_reduce函式多乙個引數,原型為parallel_reduce(begin,end,identity,func,reduction), 比tbb多了乙個引數,但是表達的意思差不多,乙個是區間,乙個是區間迭代器。

ppl中沒有parallel_pipeline介面。

tbb的task沒有ppl的task強大,ppl的task可以鏈式連續執行還可以組合任務,tbb的task則不行。

ppl任務的鏈式連續執行then

int

main()

);

//create a lambda that increments its input value.

auto increment = (int n) ;

//run a chain of continuations and print the result.

int result = t.then(increment).then(increment).then(increment).get

(); cout

<< result

3*/

ppl任務的組合

1.when_all可以執行一組任務,所有任務完成之後將所有任務的結果返回到乙個集合中。要求該組任務中的所有任務的返回值型別都相同。

arrayint>, 3> tasks =),

create_task(() -> int ),

create_task(() -> int )

};auto jointask = when_all(begin(tasks), end(tasks)).then((vectorresults)

);//

print a message from the joining thread.

cout << "

hello from the joining thread.

"

jointask.wait();

2.when_any任務組中的某乙個任務執行完成之後,返回乙個pair,鍵值對是結果和任務序號。

arrayint>, 3> tasks =),

create_task(() -> int ),

create_task(() -> int )

};//select the first to finish.

when_any(begin(tasks), end(tasks)).then((pairresult)

).wait();

//output: first task to finish returns 42 and has index 1.

ppl和tbb兩個並行運算庫功能相似,如果需要跨平台則選擇tbb,  否則選擇ppl。ppl在任務排程上比tbb強大,tbb由於設計上的原因不能做到任務的連續執行以及任務的組合,但是tbb有跨平台的優勢。

VS中C 專案使用Cuda平行計算的注意事項

先上例項 include include include kernel.cu define n 256 extern c void addkernel int a,int b,int c,int size int main int argc,char ar extern c void addkern...

《平行計算的程式設計模型》一3 2 設計理念和根據

shmem和openshmem的構思和發展都假設它們和底層硬體系統體系結構有密不可分的關係。由克雷研究公司開發和 的克雷t3d和t3e計算機系統在其網路架構中包含幾個高階的硬體加速特徵,是與shmem合作設計的,用以最大化可用的頻寬及最小化系統的3d torus網路延遲 85 克雷公司,即原來克雷研...

的核數和程序 MATLAB平行計算之多程序連續濾波

為了提高matalb的濾波效率,採用了spmd平行計算來提高濾波速度。針對大資料分塊後濾波的不連續問題,每次分段濾波時,設定每段overlap值等於濾波器中暫存器的個數。下面直接上 function multiprocessfilter objfilter,rawfile,processfile,m...