多核編程的四層境界
自發(fā)表“老子是偉大的多核計(jì)算科學(xué)家”(欲看此文,請(qǐng)點(diǎn)這里) 一文來(lái),收到許多網(wǎng)友的強(qiáng)烈反響,褒揚(yáng)者有之,砸板磚者亦有之。不過(guò)板磚數(shù)量倒是在我的意料之中,凡是跟哲學(xué)或者說(shuō)是玄學(xué)的東西沾上邊的,總會(huì)招來(lái)一陣口 舌之爭(zhēng)。雖然砸板磚者也沒(méi)有說(shuō)出任何反駁的道理來(lái),但是并不代表那篇文章就很***,沒(méi)有不足的地方。實(shí)際上那篇文章中只涉及了多核編程的一個(gè)層面的思想, 還有另外三層思想沒(méi)有被提及,這也許可以算作是那篇文章的不足之處吧。為彌補(bǔ)其不足之處,下面從四個(gè)層面來(lái)闡述多核編程的基本思想。
***層 先天·方法·策略層
***層的基本思想就是“老子是偉大的多核計(jì)算科學(xué)家”一文中所提及的幾個(gè)基本思想:“貪心”、“自私”、“偷”等。這些東西是先天存在的,是人類(lèi)的一種本能,它又可以看作是方法、策略,因此把這層叫作“先天·方法·策略層”。
先天的方法策略并不限于“貪心”、“自私”、“偷”這三種,去年的SD大會(huì)上,我講過(guò)一個(gè)基于搶奪的分布式內(nèi)存管理算法,說(shuō)明“搶”也是一種先天的方法策略。所謂:
“人之初,性本貪,性自私,性喜偷,性喜搶。”
為避免誤解,這里先說(shuō)明一下,這里所說(shuō)的“偷”、“搶”和通常意義的偷、搶并不完全相同。“偷”和道家意義上的偷是同一個(gè)含義,即“不與取”之意;“搶”則是取“不歸還”之意。
昔范蠡云:“且夫天輿弗取,反受其咎”。既然上天給了我們這么多好的方法策略,不用它的話(huà)顯然是一種糟蹋。在多核編程中如何使用這些策略來(lái)進(jìn)行編程,開(kāi)源項(xiàng)目TBB中可以找到詳細(xì)的代碼例子。
第二層 目標(biāo)·需求·評(píng)價(jià)層
先天的方法策略,雖然看似簡(jiǎn)單,但要用好它并不是一件容易的事情。自私、貪心、偷、搶等先天方法既可以用來(lái)做好事,也可以用來(lái)做壞事。這就牽涉到如何評(píng)價(jià)是否用好了這些先天方法策略的問(wèn)題,也就是第二層目標(biāo)·需求·評(píng)價(jià)層所需要解決的問(wèn)題。
并不能為了使用先天方法策略而使用它,而是用它來(lái)滿(mǎn)足我們的需求,到達(dá)一定的目標(biāo)。那么這個(gè)需求和目標(biāo)是什么呢?
在這里不想對(duì)一般的需求進(jìn)行分析,只分析優(yōu)化方面的需求。要達(dá)到優(yōu)化,可以理解為各種資源的有效利用,可能有很多人已經(jīng)有這方面的理解【1】。這些資源可以分為以下幾個(gè)方面:
- 時(shí)間資源, 時(shí)間資源指的就是時(shí)間,比如一段程序或算法需要運(yùn)行多長(zhǎng)時(shí)間。
- 空間資源,如內(nèi)存、硬盤(pán)、網(wǎng)絡(luò)、各種IO設(shè)備資源等均屬于空間資源。
- 計(jì)算資源,如CPU、GPU、各種板卡上的處理器等均屬于計(jì)算資源。
- 能源資源,通常指的是電能的消耗量,由于全球變軟,環(huán)保問(wèn)題的日益重要,這個(gè)在以往被忽視的資源也變得重要起來(lái)。
如何有效利用上述資源,并在各種資源利用間取得均衡,是制定目標(biāo)和需求的基礎(chǔ),也是評(píng)價(jià)程序或算法優(yōu)化程度的基礎(chǔ)。
第三層 本質(zhì)·根源·保障層
資源的有效利用,可不是一件簡(jiǎn)單的事情。在單核時(shí)代,許多程序員已有時(shí)間資源和空間資源的利用及均衡方面的豐富經(jīng)驗(yàn),那時(shí)幾乎不用考慮計(jì)算資源的利用問(wèn)題,因?yàn)樘幚砥髦挥幸粋€(gè)。
然而,在多核系統(tǒng)中,計(jì)算資源的利用成了頭號(hào)問(wèn)題,多個(gè)處理器的使用,使得程序員必須考慮如何將程序在各個(gè)處理器上并行地執(zhí)行,這就牽涉到一個(gè)負(fù)載均衡問(wèn)題。
負(fù)載均衡問(wèn)題歷來(lái)屬于難題,由于客觀(guān)上存在大量的共享資源,各種不同的共享資源情況復(fù)雜,并不能簡(jiǎn)單地將負(fù)載平均一下就攤到各個(gè)CPU核上去執(zhí)行。那么用什么來(lái)保障負(fù)載平衡呢?如何去達(dá)到資源有效利用的***目標(biāo)需求呢?
要 保障目標(biāo)需求的實(shí)現(xiàn),其核心就是公平、正義問(wèn)題。當(dāng)然,對(duì)公平、正義這兩個(gè)詞的理解,現(xiàn)實(shí)情況中存在多種解釋?zhuān)@里采用更廣義的解釋?zhuān)彩强蓮恼_的前提 通過(guò)邏輯推導(dǎo)出來(lái)的定義,均視做正義,例如自然科學(xué)中的所有公理、定理及推論,均屬于正義。在人類(lèi)社會(huì)中,一些公認(rèn)的道德標(biāo)準(zhǔn)、法律條文,也屬于正義。
以動(dòng)態(tài)偷取的調(diào)度算法為例,一般都是設(shè)計(jì)成每個(gè)線(xiàn)程一次偷取一個(gè)任務(wù),實(shí)際上已經(jīng)隱含地使用公平正義對(duì)偷取的數(shù)量做了限制,倘若不如此,任由一個(gè)線(xiàn)程一次將隊(duì)列中所有任務(wù)都偷走,那么其他線(xiàn)程就偷不到任務(wù)了,這樣就會(huì)出現(xiàn)負(fù)載不均衡,無(wú)法有效地利用多個(gè)處理器的計(jì)算資源。
再 比如基于搶奪的內(nèi)存分配算法,每個(gè)線(xiàn)程使用了共享內(nèi)存后,它并不返回給它的屬主線(xiàn)程,而是據(jù)為己有,這樣時(shí)間一長(zhǎng),必然有某些線(xiàn)程占有了過(guò)多的內(nèi)存資源。 為了解決這個(gè)問(wèn)題,解決方法就是每次搶完后,都需要判斷一下自己占有的內(nèi)存數(shù)量是否過(guò)多,過(guò)多的話(huà)則主動(dòng)將一部分內(nèi)存歸返給公共內(nèi)存池,從而實(shí)現(xiàn)負(fù)載均 衡??梢钥闯龌趽寠Z的內(nèi)存分配算法中也使用了公平、正義以確保負(fù)載均衡。
公 平、正義問(wèn)題可以說(shuō)是算法之本,全局效率之源。為什么這么說(shuō)呢?不妨看看現(xiàn)在美國(guó)發(fā)生的次貸危機(jī),其根本原因是由于銀行將貸款發(fā)放給無(wú)償返能力的客戶(hù)所造 成的。從公平、正義的角度看,實(shí)質(zhì)上是銀行為了自身的貪心、自私,違反了基本的公平、正義問(wèn)題。次貸危機(jī)的后果,無(wú)需我多言,大家均已看到??梢?jiàn),沒(méi)有公 平正義,貪心、自私等先天方法策略必然會(huì)被濫用,其結(jié)果必然導(dǎo)致全局的不優(yōu)。
由此可見(jiàn),公平、正義是保障貪心、自私、偷、搶等先天方法策略得以正確使用的前提條件。本層名稱(chēng)中的本質(zhì)、根源、保障,說(shuō)的就是公平、正義。
需 要提及的是,在人類(lèi)社會(huì)的現(xiàn)實(shí)中,由于人是有情感的,公平正義在執(zhí)行中總會(huì)存在偏差,這時(shí)就需要仁愛(ài)來(lái)彌補(bǔ)其不足,這也許是儒家思想能夠流傳兩千多年而不 滅的根本原因。當(dāng)然,如果把仁愛(ài)思想也看作是道德標(biāo)準(zhǔn)的一部分的話(huà),按照前面給出的正義的定義,其實(shí)仁愛(ài)也屬于正義的范疇。
第四層 算法·實(shí)現(xiàn)·執(zhí)行層
通過(guò)上面三個(gè)層面的闡述,可以知道先天的方法策略是實(shí)現(xiàn)優(yōu)化的基本手段,資源有效利用則是實(shí)現(xiàn)優(yōu)化的目標(biāo)需求及評(píng)價(jià)條件,公平、正義則是保障先天的方法策略合理使用的前提條件。是不是有了這幾樣?xùn)|西就可以做到達(dá)成優(yōu)化的最終結(jié)果呢?
答案是“非也”。如果上面那幾個(gè)東西就可以達(dá)成優(yōu)化的結(jié)果,那么從街上隨便抓個(gè)人恐怕都可以寫(xiě)出很好的多核程序來(lái)了,還要程序員干嘛,還要去學(xué)習(xí)多核編程的各種模式、技巧及算法干嘛?
就 像學(xué)了牛頓力學(xué)一樣,有些人可以設(shè)計(jì)出摩天大廈,造出各種機(jī)械,有些人卻啥也做不了。何也?運(yùn)用好壞之不同也。要寫(xiě)出好的多核程序,同樣牽涉導(dǎo)如何運(yùn)用上 面三層中的基本原理思想方法的問(wèn)題,而要用好這些基本原理思想,更多的還是要靠程序員自身的知識(shí)及能力,最終依賴(lài)于算法或程序的具體實(shí)現(xiàn)。就像有了道家, 儒家,卻仍然少不了法家、農(nóng)家、醫(yī)家等各個(gè)領(lǐng)域的諸子百家。
怎樣寫(xiě)出好的多核算法或程序來(lái)? “好好學(xué)習(xí)、天天向上”是也。
原文鏈接:http://blog.csdn.net/drzhouweiming/article/details/3996958