自發表「老子是偉大的多核計算科學家」(欲看此文,請點這裡
)一文來,收到許多網友的強烈反響,褒揚者有之,砸板磚者亦有之。不過板磚數量倒是在我的意料之中,凡是跟哲學或者說是玄學的東西沾上邊的,總會招來一陣口舌之爭。雖然砸板磚者也沒有說出任何反駁的道理來,但是並不代表那篇文章就很完美,沒有不足的地方。實際上那篇文章中只涉及了多核程式設計的乙個層面的思想,還有另外三層思想沒有被提及,這也許可以算作是那篇文章的不足之處吧。為彌補其不足之處,下面從四個層面來闡述多核程式設計的基本思想。
第一層的基本思想就是「老子是偉大的多核計算科學家」一文中所提及的幾個基本思想:「貪心」、「自私」、「偷」等。這些東西是先天存在的,是人類的一種本能,它又可以看作是方法、策略,因此把這層叫作「先天·方法·策略層」。
先天的方法策略並不限於「貪心」、「自私」、「偷」這三種,去年的sd大會上,我講過乙個基於搶奪的分布式記憶體管理演算法,說明「搶」也是一種先天的方法策略。所謂:
「人之初,性本貪,性自私,性喜偷,性喜搶。」
為避免誤解,這裡先說明一下,這裡所說的「偷」、「搶」和通常意義的偷、搶並不完全相同。「偷」和道家意義上的偷是同乙個含義,即「不與取」之意;「搶」則是取「不歸還」之意。
昔范蠡雲:「且夫天輿弗取,反受其咎」。既然上天給了我們這麼多好的方法策略,不用它的話顯然是一種糟蹋。在多核程式設計中如何使用這些策略來進行程式設計,開源專案tbb中可以找到詳細的**例子。
先天的方法策略,雖然看似簡單,但要用好它並不是一件容易的事情。自私、貪心、偷、搶等先天方法既可以用來做好事,也可以用來做壞事。這就牽涉到如何評價是否用好了這些先天方法策略的問題,也就是第二層目標·需求·評價層所需要解決的問題。
並不能為了使用先天方法策略而使用它,而是用它來滿足我們的需求,到達一定的目標。那麼這個需求和目標是什麼呢?
在這裡不想對一般的需求進行分析,只分析優化方面的需求。要達到優化,可以理解為各種資源的有效利用,可能有很多人已經有這方面的理解【
1】。這些資源可以分為以下幾個方面:
1)時間資源, 時間資源指的就是時間,比如一段程式或演算法需要執行多長時間。
2)空間資源,如記憶體、硬碟、網路、各種io裝置資源等均屬於空間資源。
3)計算資源,如cpu、gpu、各種板卡上的處理器等均屬於計算資源。
4)能源資源,通常指的是電能的消耗量,由於全球變軟,環保問題的日益重要,這個在以往被忽視的資源也變得重要起來。
如何有效利用上述資源,並在各種資源利用間取得均衡,是制定目標和需求的基礎,也是評價程式或演算法優化程度的基礎。
資源的有效利用,可不是一件簡單的事情。在單核時代,許多程式設計師已有時間資源和空間資源的利用及均衡方面的豐富經驗,那時幾乎不用考慮計算資源的利用問題,因為處理器只有乙個。
然而,在多核系統中,計算資源的利用成了頭號問題,多個處理器的使用,使得程式設計師必須考慮如何將程式在各個處理器上並行地執行,這就牽涉到乙個負載均衡問題。
負載均衡問題歷來屬於難題,由於客觀上存在大量的共享資源,各種不同的共享資源情況複雜,並不能簡單地將負載平均一下就攤到各個cpu核上去執行。那麼用什麼來保障負載平衡呢?如何去達到資源有效利用的終極目標需求呢?
要保障目標需求的實現,其核心就是公平、正義問題。當然,對公平、正義這兩個詞的理解,現實情況中存在多種解釋,這裡採用更廣義的解釋,凡是可從正確的前提通過邏輯推導出來的定義,均視做正義,例如自然科學中的所有公理、定理及推論,均屬於正義。在人類社會中,一些公認的道德標準、法律條文,也屬於正義。
以動態偷取的排程演算法為例,一般都是設計成每個執行緒一次偷取乙個任務,實際上已經隱含地使用公平正義對偷取的數量做了限制,倘若不如此,任由乙個執行緒一次將佇列中所有任務都偷走,那麼其他執行緒就偷不到任務了,這樣就會出現負載不均衡,無法有效地利用多個處理器的計算資源。
再比如基於搶奪的記憶體分配演算法,每個執行緒使用了共享記憶體後,它並不返回給它的屬主線程,而是據為己有,這樣時間一長,必然有某些執行緒占有了過多的記憶體資源。為了解決這個問題,解決方法就是每次搶完後,都需要判斷一下自己占有的記憶體數量是否過多,過多的話則主動將一部分記憶體歸返給公共記憶體池,從而實現負載均衡。可以看出基於搶奪的記憶體分配演算法中也使用了公平、正義以確保負載均衡。
公平、正義問題可以說是演算法之本,全域性效率之源。為什麼這麼說呢?不妨看看現在美國發生的次貸危機,其根本原因是由於銀行將貸款發放給無償返能力的客戶所造成的。從公平、正義的角度看,實質上是銀行為了自身的貪心、自私,違反了基本的公平、正義問題。次貸危機的後果,無需我多言,大家均已看到。可見,沒有公平正義,貪心、自私等先天方法策略必然會被濫用,其結果必然導致全域性的不優。
由此可見,公平、正義是保障貪心、自私、偷、搶等先天方法策略得以正確使用的前提條件。本層名稱中的本質、根源、保障,說的就是公平、正義。
需要提及的是,在人類社會的現實中,由於人是有情感的,公平正義在執行中總會存在偏差,這時就需要仁愛來彌補其不足,這也許是儒家思想能夠流傳兩千多年而不滅的根本原因。當然,如果把仁愛思想也看作是道德標準的一部分的話,按照前面給出的正義的定義,其實仁愛也屬於正義的範疇。
通過上面三個層面的闡述,可以知道先天的方法策略是實現優化的基本手段,資源有效利用則是實現優化的目標需求及評價條件,公平、正義則是保障先天的方法策略合理使用的前提條件。是不是有了這幾樣東西就可以做到達成優化的最終結果呢?
答案是「非也」。如果上面那幾個東西就可以達成優化的結果,那麼從街上隨便抓個人恐怕都可以寫出很好的多核程式來了,還要程式設計師幹嘛,還要去學習多核程式設計的各種模式、技巧及演算法幹嘛?
就像學了牛頓力學一樣,有些人可以設計出摩天大廈,造出各種機械,有些人卻啥也做不了。何也?運用好壞之不同也。要寫出好的多核程式,同樣牽涉導如何運用上面三層中的基本原理思想方法的問題,而要用好這些基本原理思想,更多的還是要靠程式設計師自身的知識及能力,最終依賴於演算法或程式的具體實現。就像有了道家,儒家,卻仍然少不了法家、農家、醫家等各個領域的諸子百家。
怎樣寫出好的多核算法或程式來? 「好好學習、天天向上」是也【2】。
備註:
【1】 08年深秋,與孟巖先生在上海相聚,一起聊到對多核計算的理解時,他談起了各種資源如cpu資源的有效利用問題。
【2】 關於學習寫多核程式,提供一些學習材料給大家參考如下。
1)tbb開源專案:
曾有人說過:「源**是最好的文件」。這個開源專案的內容不僅是目前多核程式設計方面做得最好的,更重要的是它裡面還掛有很多其他平行計算方面的開源專案的鏈結,因此值得上去看一看。
2)當然這條和最後一條都有給我自己做廣告的嫌疑,之所以不計嫌疑地推薦大家看這篇文章, 主要的原因是這篇文章裡有我對現在市面上有關多核程式設計和平行計算書籍的乙個點評。可以給大家購買書籍作為乙個參考。
3)intel軟體社群多核論壇:
4)我的部落格:
裡面有一些關於多核程式設計方面的文章。
上面列出的學習材料沒有包括多執行緒程式設計的基礎方面的書籍資料,這方面的資料網路上可以搜尋到一大批,出版過的書籍眾多,請恕我在這裡不一一列出。
程式設計能力的四種境界
如果想弄清楚理解它們跟我們的思想 感覺 認知 判斷和動機 這些在我們每日生活 職場中里的關鍵因素 有什麼關聯,我們可以把自己想象成乙個冰山。冰山的尖端,唯一能從水面看到的一部分,可以當作是我們的的意識。它是有邏輯 有組織的,可控的,但這部分很小。而龐大的水下部分則是我們的潛意識。它們是無組織 無邏輯...
程式設計能力的四種境界
人類心理學研究中的乙個基礎支撐課題就是分析人的思維意識和潛意識。sigmund freud是最早的一位能夠清楚的認定和描述我們的心理活動 領域 的人。在他著名的一生中的早期,他就指出我們的意識裡分 潛意識 前意識 意識 如果想弄清楚理解它們跟我們的思想 感覺 認知 判斷和動機 這些在我們每日生活 職...
程式設計的三層境界 器 術 道
不知不覺,踏入程式設計這一行,已經十幾年了。無論是否功成名就,對於程式設計師來說,十幾年的工作經驗都能夠算是 資深 了。張愛玲曾經說過 活過半輩子的人,大都有一點真切的生活經驗,一點獨到的見解。他們從來沒想到把它寫下來,事過境遷,就此湮沒了。雖然我的自然年紀遠遠不足半年,但程式設計生涯,無疑早就過半...