九九热这里直有精品,1区二区三区在线播放,玖玖爱在线观看资源,国产aⅴ综合网,午夜福利男女,日本亚洲欧美三级,日韩无码黄色导航,内射少妇13区,中文字幕高清网

您身邊的軟件定制專家--9年開發(fā)經驗為您護航

18678812288
0531-88887250

發(fā)布一個c++11開發(fā)的輕量級的并行Task庫TaskCpp

文章作者:濟南軟件開發(fā) 時間:2016年12月20日

TaskCpp簡介

  TaskCpp是c++11開發(fā)的一個跨平臺的并行task庫,它的設計思路來源于微軟的并行計算庫ppl和intel的并行計算庫tbb,關于ppl和tbb我在前面有介紹。既然已經有了這兩個大公司開發(fā)的并行計算庫,我為什么還要開發(fā)自己的并行計算庫。有兩個原因:

 

ppl只能在windows上用不能跨平臺,tbb能跨平臺,但是受限于原始設計,tbb的task比較弱沒有ppl的強大,所以他們不能完全滿足我的要求;

我覺得可以用c++11可以開發(fā)出一個輕量級的好用的并行task庫。

  TaskCpp在接口設計上盡量和ppl保持一致,因為我覺得ppl的接口很好很強大。因此,TaskCpp的接口用法和語義和ppl基本是一致的。因為TaskCpp是一個輕量級的task庫,總共也不過三百多行代碼,本著簡單夠用的原則,只提供了一些和ppl類似的常用用法, 有些不常用的特性不考慮支持。比如,不支持任務的取消,因為加入任務的取消會導致增加很多復雜性,而實際中用得比較少,所以不考慮支持,夠用就好。

 

支持的平臺

需要支持c++11的編譯器,建議編譯器:

 

linux: GCC4.7+

windows: vs2012 nov ctp+, 最好是vs2013

庫的使用

  使用TaskCpp僅僅需要包含頭文件即可,在程序中使用只需要包含#include <TaskCpp.h>和少量的boost頭文件即可。

 

TaskCpp的功能

TaskCpp提供一下功能:

 

并行任務:一種并行執(zhí)行若干工作任務的機制。

基本的異步任務

延續(xù)的任務

組合任務

WhenAll

WhenAny

任務組

并行算法:并行作用于數(shù)據(jù)集合的泛型算法。

ParallelForeach算法

ParallelInvoke算法

ParallelReduce算法

TaskCpp用法介紹

并行任務

基本的異步任務Task

 

  Task會創(chuàng)建一個異步操作,這個異步操作發(fā)起方式是延遲加載方式發(fā)起的,即在調用Task的Wait或者Get時才真正發(fā)起異步操作。Task可以通過std::function或者lambda表達式去創(chuàng)建,不支持直接原生函數(shù)創(chuàng)建,如果要用原生函數(shù)需要先通過lambda或者std::function包裝一下。Task的Wait接口只是等待異步操作結束。Task的Get接口接收參數(shù)并等待異步操作結束并返回結果。PPL中的get接口是不能接收參數(shù)的,TaskCpp的Get接口是可以接受任意參數(shù)的,更靈活一點,算是較PPL的一個小優(yōu)點吧。下面是Task的基本用法:

 

 View Code

組合任務--WhenAll

 

  WhenAll保證一個任務集合中所有的任務完成。WhenAll函數(shù)會生成一個任務,該任務可在完成一組任務之后完成。 此函數(shù)可返回一個std::vector 對象,該對象包含集合中每個任務的結果。 以下基本示例使用WhenAll創(chuàng)建表示完成其他三個任務的任務。下面是WhenAll的基本用法:

 

 View Code

  注意:WhenAll是非阻塞的,它只是創(chuàng)建一個任務,在Wait或Get時才發(fā)起異步操作。傳遞給WhenAll的任務必須是統(tǒng)一的。 換言之,它們必須都返回相同類型。

 

組合任務--WhenAny

 

  WhenAny在任務集合中任意一個任務結束之后就返回。函數(shù)會生成一個任務,該任務可在完成一組任務的第一個任務之后完成。 此函數(shù)可返回一個 std::pair 對象,該對象包含已完成任務的結果和集合中任務的索引。下面是WhenAny的基本用法:

 

 View Code

 

  注意:WhenAny是非阻塞的,它只是創(chuàng)建一個任務,在Wait或Get時才發(fā)起異步操作。傳遞給WhenAny的任務必須是統(tǒng)一的。 換言之,它們必須都返回相同類型。

 

任務組--TaskGroup

 

  TaskGroup可以并行的處理一組任務,TaskGroup可以接受多個task或者function,TaskGroup的Wait等待所有任務完成。下面是TaskGroup的基本用法:

 

 View Code

  PPL的task_group的任務只能是void()形式的,TaskCpp允許一些簡單類型的任務如int()、double()、string()等,其實任務的返回類型沒有實際意義,因為Wait沒有返回值,這里支持多種返回類型的任務只不過是為了減少一點限制,用起來稍微方便一點罷了。PPL加入任務只能一個一個Run,要加入多個任務時有點繁瑣,TaskCpp可以一次Run多個任務,比PPL要方便一些。這兩點算是較PPL的兩個小優(yōu)點吧。

 

并行算法

ParallelForeach算法

 

  ParallelForeach算法與 STL std::for_each 算法類似,只是 parallel_for_each 算法并發(fā)執(zhí)行任務。用法比較簡單:

 

 View Code

ParallelInvoke算法

 

  ParallelInvoke算法并行執(zhí)行一組任務。 在完成所有任務之前,此算法不會返回。 當您需要同時執(zhí)行多個獨立的任務時,此算法很有用。ParallelInvoke和TaskGroup的作用是一樣的。用法比較簡單:

 

void TestParaInvoke()

{

    auto f = []{cout << "1" << endl; return 1; };

    ParallelInvoke(f, []{cout << "2" << endl; });

}

ParallelReduce算法

 

  ParallelReduce算法在實際應用中比較常用,有點類似于map-reduce,可以并行的對一個集合進行reduce操作。ParallelReduce的用法稍微復雜一點,它的原型:

 

ParallelReduce(range,init, reduceFunc);

ParallelReduce(range,init, rangeFunc, reduceFunc);

  第一個參數(shù)是集合,第二個參數(shù)是算法的初始值,第三個參數(shù)rangeFunc是一個聲稱中間結果的函數(shù),第四個參數(shù)是中間結果的匯聚函數(shù)。如果調用ParallelReduce(range,init, reduceFunc),則表示rangeFunc和reduceFunc是一個函數(shù)。


想要了解更多詳情歡迎來電咨詢18678812288
登陸網址:m.h6244.cn。
聯(lián)系人:王經理。

伊吾县| 涟水县| 东城区| 陆丰市| 宝鸡市| 信阳市| 澳门| 尤溪县| 永靖县| 关岭| 亚东县| 蕲春县| 岱山县| 阳曲县| 神农架林区| 平顺县| 望奎县| 富民县| 隆昌县| 常德市| 新民市| 湘潭市| 伊金霍洛旗| 大丰市| 呈贡县| 马龙县| 衡东县| 寿阳县| 大足县| 绍兴县| 额济纳旗| 罗城| 泰和县| 桃园市| 城固县| 惠东县| 庆安县| 绵竹市| 寻甸| 大连市| 远安县|