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