亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

用動態任務調度器實現Parallel_For

系統 1791 0

注:本文主要內容摘自筆者所著的《多核計算與程序設計》一書,略有修改,后續還會繼續發布系列文章,如有需要,可以考慮將一下地址加入到您的瀏覽器收藏夾中: http://software.intel.com/zh-cn/blogs/category/multicore/

從前面的 CNestTaskScheduler 的使用方法中可以發現,采用嵌套任務調度,可以很方便地將一個大區間拆分成更多的小區間,將各個拆分后的區間放入分布式隊列中,然后各個線程再從分布式隊列中取出相應的區間進行處理。

對于一個 for 循環來說,通常處理的都是一個區間,因此也可以使用任務調度的方式將其拆分成更小的區間進行并行化執行。下面就利用嵌套任務調度的方法來實現一個 Parall_For 功能。

1. ??????? 區間的描述: CRange

要實現對區間的分拆功能,使用一個類 CRange 來描述區間。在實際情況中,區間通??梢杂蓛蓚€整數表示區間開始和結束位置,也可以由兩個迭代器變量來表示區間開始和結束位置。不過 CRange 是一個抽象接口類,它并不定義區間的開始和結束位置,區間的開始和結束位置由繼承它的類去定義。 CRange 類用 C++ 定義如下:

class CRange {

protected:

??? CNestTaskScheduler ? * m_pTaskScheduler ;

public:

??? CRange (){};

??? CRange ( CNestTaskScheduler * p );

??? void SetTaskScheduler ( CNestTaskScheduler * p );

??? CNestTaskScheduler * GetTaskScheduler ();

?

??? virtual CRange * Split () = 0;

};

CRange 類中,最重要的一個接口是 Split() 接口,這個接口負責將一個區間拆分成兩個區間,一個區間繼續存放在原來的 CRange 對象中,另外一個區間存放在返回的 CRange 對象中。如果返回值為 NULL ,表明原來的區間不需要進行分拆。

CRange 類本身是一個接口類,用它主要是作為 Parallel_For() 函數的接口函數, Parallel_For() 函數的原型如下:

void Parallel_For(CRange *pRange );

由于 Split() 是一個純虛函數,因此傳給 Parallel_For() 函數的參數必須是一個繼續了 CRange 類的派生類的實例。

2. ??????? CRange 對象的處理過程

對于每個 CRange 對象, Parallel_For() 中需要對它進行處理,處理是通過任務調度器中的任務入口函數來處理的,處理過程如下圖所示:

?

4 ? CRange 對象的處理過程

上面的處理過程可以用 C++ 代碼實現如下:

/** ?? CRange 的任務處理入口函數

?

???????? @param ? void *pArg - 實際為一個 CRange 指針

???????? @return ? unsigned int WINAPI - CAPI_FAILED 表示失敗, CAPI_SUCCESS 表示成功 ??

*/

unsigned int WINAPI RangeProcessTask(void *pArg)

{

??? CRange * pRange = ( CRange *) pArg ;

?

??? if ( pRange == NULL )

??? {

??????? return CAPI_FAILED ;

??? }

?

??? CRange * pNewRange = pRange -> Split ();

??? if ( pNewRange == NULL )

??? {

??????? delete pRange ;

?????? ? return CAPI_SUCCESS ;

??? }

?

??? CNestTaskScheduler * pTaskSched = pRange -> GetTaskScheduler ();

?

??? pNewRange -> SetTaskScheduler ( pTaskSched );

?

??? TASK t1 , t2 ;

??? t1 . pArg = ( void *) pRange ;

??? t1 . func = RangeProcessTask ;

??? t2 . pArg = ( void *) pNewRange ;

?? ? t2 . func = RangeProcessTask ;

?

??? pTaskSched -> SpawnLocalTask ( t1 );

??? pTaskSched -> SpawnTask ( t2 );

?

??? return CAPI_SUCCESS ;

}

?

3. ? Parall_For 的處理流程

有了上面的 RangeProcessTask() 函數后,就可以用它作為嵌套任務調度器的任務入口函數,以實現 Parallel_For 功能。

Parallel_For() 中,主要實現對 CRange 對象的任務調度處理,需要將參數 pRange 作為根任務傳入到任務調度器中進行處理。

Parallel_For() 的處理過程如下:

?

5 ? Parallel_For 的處理過程

Parallel_For() 的代碼如下:

/** ?? 并行 for 循的處理函數

??? 將一個 CRange 進行并行處理

?

???????? @param ? CRange *pRange - CRange 指針 ????

???????? @return ? void - ?

*/

void Parallel_For(CRange *pRange )

{

??? CNestTaskScheduler ? * p = new CNestTaskScheduler ;

??? TASK ??? task ;

?

??? task . func = RangeProcessTask ;

??? task . pArg = pRange ;

?

??? pRange -> SetTaskScheduler ( p );

?

??? p -> BeginRootThread ( task );

?

??? delete p ;

}

用動態任務調度器實現Parallel_For


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 精品免费久久久久国产一区 | 一级aaa级毛片午夜在线播放 | 香蕉福利| 国产精品大全国产精品 | 伊在人亚洲香蕉精品播放 | 欧美国产亚洲精品a第一页 欧美国产亚洲精品高清不卡 | 免费观看男女羞羞的视频网站 | 婷婷综合在线观看丁香 | 久久精品国产精品亚洲20 | 亚洲国产日韩综合久久精品 | 四虎国产精品免费久久麻豆 | 五月天婷婷在线免费观看 | 欧美亚洲一区二区三区在线 | 日本在线观看中文字幕 | 一本久道久综合久久鬼色 | 国产日韩在线播放 | 亚洲精品不卡午夜精品 | 男女很黄很色床视频网站免 | 精品国产日韩亚洲一区在线 | h片免费在线观看 | 久草热线| 四虎4hu永久免费国产精品 | 亚洲精品第一综合99久久 | 日本精品久久久久中文字幕2 | 亚洲综合成人在线 | 久久密| 四虎永久在线精品影院 | 综合久久久久6亚洲综合 | 色偷偷网址 | 亚洲国产福利精品一区二区 | 久久国内精品 | 狠色狠狠色狠狠狠色综合久久 | 成人短视频在线观看视频 | 亚洲成人日韩 | 午夜大片免费男女爽爽影院久久 | 国产精品久久久久影院色老大 | 久久91综合国产91久久精品 | 精品视频www | 欧美一级片免费 | 99久久亚洲 | 狠狠色成人综合网图片区 |