資源描述:
《淺談并行編程中的任務(wù)分解模式》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、淺談并行編程中的任務(wù)分解模式?????并行編程使用線程來使得多個(gè)操作能夠同時(shí)運(yùn)行。并行編程主要包括應(yīng)用程序中線程設(shè)計(jì),開發(fā)和部署以及線程間相互協(xié)調(diào)和各自的操作。?????在下文中我們將討論怎樣分割適合線程化大小的編程任務(wù)來多任務(wù)化一個(gè)應(yīng)用程序。設(shè)計(jì)線程?????不熟悉并行編程的開發(fā)者通常對(duì)例如面向?qū)ο蟮膫鹘y(tǒng)的編程模式感到非常適應(yīng)。在傳統(tǒng)的編程模式下,程序以預(yù)先定義的起點(diǎn)開始運(yùn)行,譬如main函數(shù),然后接連地做完一系列任務(wù)。如果程序依賴用戶交互,主要的工作代碼通常被封裝在一個(gè)處理用戶事件的循環(huán)里。?????從一個(gè)約定事件開始,譬如點(diǎn)擊
2、按鈕,程序運(yùn)行一段已經(jīng)制定的順序行為,最終以等待用戶下個(gè)動(dòng)作結(jié)束。?????當(dāng)設(shè)計(jì)這樣的程序時(shí),程序員喜歡一個(gè)相對(duì)簡(jiǎn)單的編程模式因?yàn)樵谌我庖欢谓o定的時(shí)間內(nèi)只有一個(gè)事件發(fā)生。如果程序任務(wù)必須按某種方式順序運(yùn)行,程序員必須在這些事件上特意安排順序。在這個(gè)過程的任一時(shí)刻,程序運(yùn)行一步接著下一步,最終基于預(yù)先確定的參數(shù)到達(dá)一個(gè)預(yù)見的結(jié)果。?????從這種線性的模式到并行編程模式,程序設(shè)計(jì)者必須重新思考程序的過程流。相比順序執(zhí)行序列限制,程序員應(yīng)該識(shí)別出那些能被并行化的行為。?????要這樣做,他們必須把程序看作一組相互間有依賴關(guān)系的任務(wù)。把
3、程序分解成一些獨(dú)立的任務(wù)并識(shí)別這些任務(wù)間的依賴性。這個(gè)過程被稱為分解。?????一個(gè)問題有許多分解方式:按任務(wù),數(shù)據(jù),或者按數(shù)據(jù)流。下面的表總結(jié)了這些分解的形式。您將很快看到,這些不同分解形式對(duì)應(yīng)了不同的編程行為。分解類型設(shè)計(jì)評(píng)論任務(wù)不同的行為分配給不同的線程通常在GUI應(yīng)用數(shù)據(jù)多個(gè)線程對(duì)不同的數(shù)據(jù)集執(zhí)行同樣的操作通常在音頻處理,做圖和科學(xué)編程數(shù)據(jù)流一個(gè)線程的輸出是第二個(gè)線程的輸入需要特別關(guān)注消除開始和結(jié)束的延遲主要的分解形式總結(jié)任務(wù)分解?????按功能分解一個(gè)程序被稱為任務(wù)分解。這是一種實(shí)現(xiàn)并行執(zhí)行最簡(jiǎn)單的方式。使用這種方法,每個(gè)
4、任務(wù)被按目錄分類。?????如果它們中的兩個(gè)能同時(shí)運(yùn)行,它們會(huì)被程序員按此調(diào)度。以這種方式并行運(yùn)行任務(wù)通常需要對(duì)每個(gè)函數(shù)做小量修改來避免沖突,并指出這些任務(wù)已經(jīng)不再連續(xù)。?????以園藝工作舉例,任務(wù)分解會(huì)建議園丁按工作本身的屬性分配任務(wù):如果兩個(gè)園丁到達(dá)一個(gè)客戶家,一個(gè)修剪草坪,另一個(gè)鏟除雜草。修剪草坪和鏟除雜草是兩個(gè)被分開的功能。?????要完成這兩個(gè)功能,園丁們需要確保他們之間相互協(xié)調(diào),這樣鏟除雜草的園丁就不會(huì)坐在待修剪草坪的中間。?????舉個(gè)編程的例子,一個(gè)任務(wù)分解的典型案例是文字處理軟件,譬如微軟的Word。當(dāng)用戶打開一
5、個(gè)很長(zhǎng)的文檔的時(shí)候,他(她)能夠馬上開始輸入文字。當(dāng)用戶輸入文字時(shí),文檔分頁在后臺(tái)發(fā)生,于是他(她)能夠很容易地看到狀態(tài)欄中頁數(shù)的增加。?????文檔輸入和分頁是兩個(gè)獨(dú)立的任務(wù),程序員按功能將它們分開來并行運(yùn)行。如果程序員沒有這樣設(shè)計(jì),用戶將不得不在能夠輸入任何文字之前等待整個(gè)文檔被分頁。有些朋友可能回憶起這種現(xiàn)象在早期的個(gè)人電腦文字處理器中非常常見。數(shù)據(jù)分解?????數(shù)據(jù)分解,也被認(rèn)為是數(shù)據(jù)級(jí)并行,將任務(wù)按它們處理的數(shù)據(jù)進(jìn)行分解,而不是按照任務(wù)本身的性質(zhì)。使用數(shù)據(jù)分解的程序通常有許多線程在執(zhí)行同樣的任務(wù),只是處理的數(shù)據(jù)項(xiàng)不同。??
6、???舉個(gè)例子,假設(shè)在一個(gè)大的電子數(shù)據(jù)表里計(jì)算值。相比一個(gè)線程執(zhí)行所有的計(jì)算,數(shù)據(jù)分解會(huì)建議有兩個(gè)線程,每個(gè)執(zhí)行一半的計(jì)算量,或者n個(gè)線程執(zhí)行1/n的工作量。?????如果園丁應(yīng)用數(shù)據(jù)分解來分解他們的任務(wù),他們兩個(gè)會(huì)同時(shí)修剪一半的草坪,然后兩個(gè)人分別鏟除一半的雜草。在計(jì)算領(lǐng)域,決定哪一種分解形式更高效取決于系統(tǒng)的限制。?????舉例說,如果需要修剪草坪的地塊非常小以至于沒必要有兩個(gè)人來修剪草坪,修剪草坪這個(gè)任務(wù)最好只被分配給一個(gè)園丁做,那么任務(wù)分解在這一步是最好的選擇。數(shù)據(jù)分解或許適用于其它的任務(wù)序列,譬如當(dāng)修剪草坪完成后,兩個(gè)園丁
7、并行地來鏟除雜草。?????隨著處理器核心數(shù)目的增加,數(shù)據(jù)分解使得任務(wù)處理規(guī)模增加。這允許在同樣的時(shí)間內(nèi)做更多的工作。?????舉園丁的例子,假設(shè)有另外兩個(gè)園丁加入了工作。相比分配所有四個(gè)園丁到一個(gè)地塊工作,我們不如分配兩個(gè)新的園丁去另一個(gè)地塊,非常有效地增加我們總的任務(wù)處理量。?????假設(shè)兩位新園丁和兩位老園丁能夠做同樣多的工作,兩個(gè)地塊的大小也是一樣的,我們已經(jīng)在同樣的時(shí)間內(nèi)把工作量翻倍了。數(shù)據(jù)流分解?????許多時(shí)候,當(dāng)分解一個(gè)問題時(shí),關(guān)鍵不是任務(wù)應(yīng)該做什么事情,而是數(shù)據(jù)在不同任務(wù)中怎樣傳遞。在這些情況下,數(shù)據(jù)流分解將問題按
8、數(shù)據(jù)在任務(wù)中傳遞的方式來分解。?????生產(chǎn)者/消費(fèi)者問題是數(shù)據(jù)流影響程序并行執(zhí)行能力的著名例子。這里,一個(gè)生產(chǎn)者任務(wù)的輸出,成為另一個(gè)消費(fèi)者的輸入。兩個(gè)任務(wù)被不同的線程執(zhí)行,直到生產(chǎn)者完成他的部分工作,消費(fèi)者不能開始工作。?????