




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 HYPERLINK / 適應(yīng)經(jīng)驗(yàn)的強(qiáng)大慣性,源自于背景的長期穩(wěn)定性。軟件體系的快速變革,讓我們忽視了硬件體系的長期穩(wěn)定。這種穩(wěn)定性使得專門多適應(yīng)經(jīng)驗(yàn)變成了不言自明的信條。 大多數(shù)的軟件設(shè)計(jì)方法的革新只只是是用舊石斧打造出來新石斧。在C中我們使用getc,putc來進(jìn)行IO,在Java中無非是變成了 System.in.read(),System.out.print ()。什么緣故IO必定是這種形式呢?這是因?yàn)槲覀冮L期使用著同一種計(jì)算機(jī)。我們明白PC/Mac如此的計(jì)算機(jī)中CPU與IO設(shè)備進(jìn)行通信,需要通過各種總 線。下面這張圖演示了CPU與IO設(shè)備之間通信的差不多過程. 以 C語言為代表的傳統(tǒng)
2、的IO,實(shí)際上是單CPU上單任務(wù)工作模式的投影。在單臺計(jì)算機(jī)上, 傳統(tǒng)計(jì)算機(jī)體系結(jié)構(gòu)決定了CPU處于操縱者和決策者的地位。換而言之,我們歷來適應(yīng)于以CPU的視角來考慮程序的IO邏輯.程序員是將自己假設(shè)為CPU. 程序員關(guān)懷的IO設(shè)施只是一個(gè)黑盒.我們只需要往IO發(fā)送一個(gè)請求,然后等待請求回來進(jìn)行運(yùn)算,完全不關(guān)懷這一來一回之間到底發(fā)生了什么過程. 然而當(dāng)我們打開黑盒,觀看CPU與IO的通信過程的時(shí)候, IO Monad就從幕后走向了臺前。以總線的角度看,CPU和外設(shè)是等同的,都只是一個(gè)具有運(yùn)算能力和輸入輸出端口的黑盒.總線正如 Bind/=函數(shù)一樣不關(guān)懷這些黑盒子里如何運(yùn)算的,它只關(guān)懷從那個(gè)黑盒
3、拿數(shù)據(jù)出來放入那個(gè)黑盒. 從整個(gè)計(jì)算機(jī)的體系結(jié)構(gòu)看,傳統(tǒng)的IO觀念只只是是IO Monad的一個(gè)局部化形態(tài)。 IO Monad實(shí)則上在一些接近操作系統(tǒng)底層的軟件中,經(jīng)常扮演者數(shù)據(jù)總線這種核心角色。比如講Unix/linux shell的管道命令確實(shí)是徹頭徹尾的IO Monad. cat,命令是return/Unit函數(shù),|管道符確實(shí)是bind/=函數(shù)。例如:cat sample.txt|grep High|wc l .cat 將sample.txt的文件內(nèi)容包裝成stdout,|管道符將stdout的內(nèi)容傳給grep 命令查詢所有單詞位High的行,查詢的結(jié)果又被轉(zhuǎn)化為stdout,再通過|管
4、道符傳送給wc命令進(jìn)行行數(shù)統(tǒng)計(jì)。微軟最新的Shell取名為 Monad,其言下之意可能無需贅述了. 不僅如此,IO Monad在結(jié)構(gòu)化程序語言的最初演化的時(shí)期也殘留了一些蹤跡.專門多古老的Pascal程序,都保留了在程序首部書寫Input Outpu參數(shù)的適應(yīng). program fac_n(input,output); var n:integer; function fac(n:integer):integer; begin if n=1 then fac:=1 else fac:=n*fac(n-1); end; 這確實(shí)是把程序的主體看成IO Monad上的一個(gè)計(jì)算函數(shù)。所有的Pascal函
5、數(shù)能夠通過操作系統(tǒng)的IO設(shè)施串聯(lián)起來.因此隨著程序語言往CPU中心化的演化,這些痕跡就逐漸消逝了. Monad僅僅是一個(gè)數(shù)學(xué)框架,并沒有提供什么新的軟件技術(shù)。在Monad 誕生之前,程序員們就差不多在廣泛的使用類似的軟件設(shè)計(jì)方法。然而這些設(shè)計(jì)方法本身卻無法回答我們一系列的追 問:Exception,IO,Pipeline,什么緣故這些毫不相關(guān)的領(lǐng)域中都會出現(xiàn)相同的數(shù)學(xué)結(jié)構(gòu)?什么緣故在不同的領(lǐng)域內(nèi)呈現(xiàn)的Monad 特性完全不同,有的多有的少有的甚至完全消逝?這些相同的結(jié)構(gòu)的背后又預(yù)示著什么?以及,我們什么緣故要問這么多什么緣故?這些問題的答案對我們的編程實(shí)踐又 有什么意義? (2)關(guān)于兩個(gè)世界體
6、系的對話 并行計(jì)算,是一群頑皮的孩童,充滿著生機(jī)勃勃的活力,卻又不失惡作劇式的頑皮。他們仿佛是一座活躍的“火山”。他們身上驚人的能量只有正確的引導(dǎo) 下,才能完全的綻放出來而不致埋沒;他們身上頑皮的天性只有在嚴(yán)格的教導(dǎo)中,才可不能變成脫韁的野馬而無法駕馭。正如兒童的教育首先需要深入他們的內(nèi)心世 界,我們也必須深入并行計(jì)算的本質(zhì),去探究這些小孩內(nèi)心中的陌生而又奇妙的世界。 在這群小孩們中間,并發(fā)是與我們最為的親熱也是最讓我們頭疼的一位。如何應(yīng)付并發(fā)?目前存在兩個(gè)截然對立的答案,Thread Model Vs Event Driven.對這兩個(gè)模型,在編程實(shí)踐的層面上我們都通過了嚴(yán)格的探討,也有專門
7、多人通過各種途徑去嘗試調(diào)和其中的分歧。然而Which is a bad idea?是一個(gè)至今爭論不休的問題。我認(rèn)為這不是僅靠分析他們各自優(yōu)劣就能解決的問題,而是必須解釋清晰什么緣故會產(chǎn)生這兩種截然不同的方案。知其然,必 先知其因此然。只有回到問題的源頭,才能以更寬廣的視野去選擇道路。 在我們介紹IO Monad的部分時(shí),曾經(jīng)略帶提過計(jì)算機(jī)體系結(jié)構(gòu)決定了程序員以CPU為考慮中心的適應(yīng)。那個(gè)計(jì)算機(jī)模型,確實(shí)是統(tǒng)治我們現(xiàn)在大多數(shù)計(jì)算機(jī)內(nèi)部構(gòu)造的馮諾依曼模型。 在計(jì)算機(jī)中存在兩種不同的流,一種稱為操縱流(Control Flow),另外一種則是數(shù)據(jù)流(Data Flow)。計(jì)算機(jī)要進(jìn)行工作必須要通過其
8、中一種進(jìn)行驅(qū)動(dòng)。馮諾依曼機(jī)的核心工作方式是操縱流(指令流)驅(qū)動(dòng)。即按照指令的執(zhí)行序列,依次讀取指令,然 后依照指令所含的操縱信息,調(diào)用數(shù)據(jù)進(jìn)行處理。馮諾依曼機(jī)為了操縱指令序列的執(zhí)行順序,設(shè)置一個(gè)程序(指令) 計(jì)數(shù)器PC(Program Counter),讓它存放當(dāng)前指令所在的存儲單元的地址。假如程序現(xiàn)在是順序執(zhí)行的,每取出一條指令后PC內(nèi)容加l,指示下一條指令該從何處取得。假如 程序?qū)⑥D(zhuǎn)移到某處,就將轉(zhuǎn)移的目標(biāo)地址送入PC,以便按新地址讀取后繼指令。 Program Counter是一個(gè)遞增的自然數(shù)。我們明白,自然數(shù)集具有嚴(yán)格的順序性,123,這種特性的集合在數(shù)學(xué)上被稱為偏序集。假如我們在兩個(gè)
9、偏序集中找到一個(gè)函數(shù) 那么我們稱f為保序的連續(xù)映射. 在馮諾依曼機(jī)中,正是通過時(shí)鐘發(fā)生器與PC,PC與內(nèi)存地址之間的連續(xù)映射把CPU時(shí)刻的順序性映射到了代碼的順序性。比如X86 CPU大致就能夠分為下面幾個(gè)時(shí)鐘周期.(FC為取指令周期,SC為源操作數(shù)周期,DC為目的操作數(shù)周期,EC執(zhí)行周期,IC中斷相應(yīng)周 期,DMA,DMA傳送周期) 馮諾依曼機(jī)的數(shù)據(jù)流是由操縱流驅(qū)動(dòng),比如X86Cpu中,數(shù)據(jù)是在CPU取指以后在SC周期讀取的.這點(diǎn)在大多數(shù)人看來是不言自明無足輕重的。但 是他們卻涉及到了傳統(tǒng)編程語言中最為本質(zhì)的問題。Fortran之父John Backus在它圖林獎(jiǎng)?lì)I(lǐng)獎(jiǎng)演講中, 毫不諱言的道出
10、了這一點(diǎn): 引用” Von Neumann programming languages use variables to imitate the computers storage cells; control statements elaborate its jump and test instructions; and assignment statements imitate its fetching, storing.The primary statement in that world is the assignment statement itself. All the other
11、 statements of the language exist in order to make it possible to perform a computation that must be based on this primitive construct: the assignment statement.” “馮諾依曼型的語言,使用變量來模仿計(jì)算機(jī)的存儲單元;操縱語句來描述跳轉(zhuǎn)和測試指令;賦值語句模仿數(shù)據(jù)的獵取,存儲.那個(gè)世界最核心的語句確實(shí)是賦值語句本身。所有其它語句的存在,只是為了能使那些根植于賦值語句的計(jì)算結(jié)構(gòu)能夠正確地運(yùn)行。”這回答了我們一個(gè)問題,什么緣故在傳統(tǒng)語言中I
12、O的行為是與Monad截然對立的? 賦值語句本身是一種CPU內(nèi)部的隱式IO操作。因此傳統(tǒng)IO函數(shù)與賦值語句是可復(fù)合的,它的確讓我們的程序看上去自然舒適,而不像IO Monad那樣不扭。然而這種臨時(shí)的自然舒適,給我們帶來了無盡的苦惱。我們能夠放心的讓計(jì)算機(jī)運(yùn)算1+1是因?yàn)橛袌D林機(jī)和lambda演作為保障。隱式 的賦值語句將IO混入了計(jì)算后,會發(fā)生什么呢?顯然這是這兩個(gè)模型無法回答,而又需要我們深入探究的問題。作為結(jié)構(gòu)化語言的發(fā)明人John Backus在同一片演講里,反復(fù)強(qiáng)調(diào)了對賦值語句所帶來的困擾 引用” Moreover, the assignment statement splits pr
13、ogramming into two worlds.The first world comprises the right sides of assignment statements. This is an orderly world of expressions, a world that has useful algebraic propertiesIt is the world in which most useful computation takes place. The second world of conventional programming languages is t
14、he world of statements.This world of statements is a disorderly one, with few useful mathematical properties. Structured programming can be seen as a modest effort to introduce some order into this chaotic world, but it accomplishes little in attacking the fundamental problems created by the word-at
15、-a-time von Neumann style of programming, with its primitive use of loops, subscripts, and branching flow of control.” 更重要的是,賦值語句將程序割裂為兩個(gè)世界。第一個(gè)世界是賦值語句右邊的世界。這是一個(gè)有序的表達(dá)式世界,那個(gè)世界有許多有用的代數(shù)特 性.。最有用的計(jì)算都發(fā)生在那個(gè)地點(diǎn)。第二個(gè)世界是語句的世界,這是一個(gè)無序的世界,在那兒找不到什么有用的數(shù)學(xué)特性。結(jié)構(gòu)化編程一定層度上為那個(gè)混亂的 世界帶來一些秩序,然而它那些原始的循環(huán),子函數(shù),分支流程技術(shù)從未擊中過馮諾依曼型語言的本
16、質(zhì)問題-一次一條指令的操縱流模式”John Backus的演講,差不多過去31年了,他老人家也差不多駕鶴西去。相比于Backus的年代,我們在編程實(shí)踐上差不多有特不豐富的手段來應(yīng)付那個(gè)混亂的世 界,結(jié)構(gòu)化,面向?qū)ο螅嫦蚍矫?動(dòng)態(tài)語言。在這些方法看來,賦值語句與計(jì)確實(shí)是等價(jià)的、同質(zhì)的、混合使用是天經(jīng)地義無需置疑的;IO只是局部領(lǐng)域內(nèi)的專有 問題(比如網(wǎng)絡(luò)通信)而不是全局性的問題。然而另一方面理論研究者們遵循John Backus觀點(diǎn),用數(shù)學(xué)理論構(gòu)建IO世界的內(nèi)在秩序。這些數(shù)學(xué)理論的推演告訴我們?nèi)绱艘粋€(gè)結(jié)果: 在馮諾依曼型語言中IO問題不是局部的而是全局性的。IO具有并發(fā)性,而計(jì)確實(shí)是非并發(fā)的,
17、這兩種操作需要分不處理。當(dāng)程序中引入越來越多的并行/并發(fā)背景 的時(shí)候,John Backus的遠(yuǎn)見卓識就越顯示出他深邃的洞察力。 并發(fā)占主流的程序里,IO的并發(fā)性意味著單臺計(jì)算機(jī)面對的將不是唯一的時(shí)鐘。比如兩臺以TCP連接的服務(wù)器,他們時(shí)鐘速度未必是等同的,即便是等 同的我們也無法忽略時(shí)鐘信號傳遞的延時(shí)。當(dāng)兩個(gè)時(shí)序不一樣的時(shí)鐘共同驅(qū)動(dòng)一份代碼的時(shí)候,馮諾依曼機(jī)的全然性難題也隨之而來。馮諾依曼機(jī)的程序指令是按照 CPU的時(shí)序順序執(zhí)行的,并發(fā)多任務(wù)程序也不例外。偏序集的有一個(gè)特性叫做傳遞性,12,24,那么14.這種傳遞性。這使得自 然數(shù)集的若干個(gè)子集的并集同樣存在偏序性. 在馮諾依曼機(jī)上,任何與
18、順序有關(guān)的問題,最為簡易的方式確實(shí)是依靠偏序的傳遞性,從底層自低向上地一級一級傳遞CPU的時(shí)鐘序列。Thread Model模型之因此易于開發(fā),也正是因?yàn)椴僮飨到y(tǒng)在底層操縱了時(shí)刻片的分配,使得每一個(gè)Thread的時(shí)鐘序列和代碼順序保持一致。換而言之 Thread Model是一個(gè)放大了的馮諾依曼機(jī),要在那個(gè)模型中處理并發(fā),我們必須面一個(gè)問題時(shí)鐘校準(zhǔn)。 時(shí)鐘校準(zhǔn)可能是那個(gè)世界最本質(zhì)的問題之一,它直接導(dǎo)致了上世紀(jì)最為詭異的理論相對論的誕生。從物理學(xué)上講,信號傳遞是時(shí)鐘校準(zhǔn)的唯一方法。 在計(jì)算機(jī)中也不能例外,馮諾依曼機(jī)要校準(zhǔn)不同的時(shí)鐘序列,就必須解決如何獵取外來信號的問題。操縱流驅(qū)動(dòng)模式?jīng)Q定了馮諾依
19、曼機(jī)不同意外界的信號直接驅(qū)動(dòng)指 令執(zhí)行。CPU只能通過本地時(shí)鐘觸發(fā)操縱流,周期性發(fā)起狀態(tài)查詢。CPU在某個(gè)周期向其他時(shí)鐘源發(fā)送信號,在收到遠(yuǎn)端時(shí)鐘的反饋信號后計(jì)算得出本地代碼序 列上的同步點(diǎn),然后移動(dòng)PC指針指向同步點(diǎn)。不管是早期CPU的輪詢模式依舊現(xiàn)在廣泛采納的中斷方式,其差不多的校準(zhǔn)模式并沒有改變,只只是查詢對象由最初 的IO設(shè)備演變?yōu)橹袛嗉拇嫫鳌?基于信號查詢的校準(zhǔn)方式,讓馮諾依曼機(jī)在處理并發(fā)問題上就像是帶著鐐銬跳舞。操縱流驅(qū)動(dòng)首先無可幸免地導(dǎo)致了鎖機(jī)制的產(chǎn)生。John Backus 告訴我們賦值語句事實(shí)上是一種IO,它意味著賦值運(yùn)算符兩邊數(shù)據(jù)的單向的數(shù)據(jù)流淌。然而馮諾依曼機(jī)的查詢式時(shí)鐘
20、校準(zhǔn)機(jī)制,必定意味著一次雙向的數(shù)據(jù)流淌。如 果以兩條賦值指令來驅(qū)動(dòng)一次雙向數(shù)據(jù)交換,那么勢必就要同步兩條指令的先后執(zhí)行順序。然而要同步指令的執(zhí)行順序,又必須先校準(zhǔn)時(shí)序。因此那個(gè)地點(diǎn)我們陷入了類 似于相對論的邏輯困境。兩個(gè)慣性系中要校準(zhǔn)時(shí)鐘必須首先明白光速的傳播速度,而要明白光速的傳播速度必須首先校準(zhǔn)時(shí)鐘。愛因斯坦為了幸免這種邏輯無窮倒 退,引入了速度不變的光信號。類似地在馮諾依曼機(jī)下我們必須強(qiáng)迫一次雙向的數(shù)據(jù)交換在一個(gè)指令中瞬時(shí)的完成,比如X86下的test&set, exchange等等。這些指令的使用就導(dǎo)致了Mutex, Semaphore, Critical Section各種五花八門的
21、鎖結(jié)構(gòu)。隨著鎖機(jī)制的引入,鎖競爭,死鎖,粒度操縱,各種并發(fā)性的苦惱滾滾而來。然而我們的苦惱還遠(yuǎn)沒有結(jié)束。 操縱流驅(qū)動(dòng)還會導(dǎo)致馮諾依曼綜合癥中的 “Memory Wall”效應(yīng)(另外兩個(gè)效應(yīng)是”Energy Wall“和“Education Wall“)。因?yàn)槊恳淮沃噶畹膱?zhí)行都必須伴隨著計(jì)算數(shù)據(jù)地址,狀態(tài)地址,指令地址等等額外的數(shù)據(jù)流淌開銷。隨著指令數(shù)量的增加Memory Wall會越來越厚,最終會堵塞操縱流的運(yùn)行,使其而無法及時(shí)響應(yīng)IO信號。Context Switch確實(shí)是最為聞名的Memeory Wall.在外界的IO信號未到達(dá)之前,Thread必須不間斷地定期執(zhí)行信號查詢代碼。每次查詢完
22、畢讓出CPU后就要執(zhí)行復(fù)雜的數(shù)據(jù)流淌(比如 Register save/restore,Cache refill等)。為了幸免這種開銷,現(xiàn)在專門多語言采納消耗更低的Green thread的方案. 這些方案能夠一定程度上降低消耗然而無法完全根除。在并發(fā)性達(dá)一定數(shù)量級后即便是Erlang如此的語言也無法忽視“Memory Wall”的存在。因?yàn)門hread 模型的困難不是來自于局部實(shí)現(xiàn)上的疥癬之癢,而是馮諾依曼模型所帶來無法根治的頑疾。 在馮諾依曼機(jī)統(tǒng)治計(jì)算機(jī)業(yè)的長達(dá)60多年,它帶來的Education Wall使得專門多人特不是戰(zhàn)斗在開發(fā)第一線的程序員們專門難想象有非馮諾依曼結(jié)構(gòu)的存在。事實(shí)上
23、令人更加難以想象的是,在馮諾依曼這位教皇統(tǒng)治現(xiàn)代計(jì)算機(jī)工業(yè) 之前,絕大多數(shù)的電子計(jì)算機(jī)是并行計(jì)算的。有一個(gè)傳講流傳甚廣馮諾依曼制造了第一臺計(jì)算機(jī)ENIAC。事實(shí)上馮諾依曼本人未曾參與ENIAC的制造,那 篇奠定馮諾依曼機(jī)結(jié)構(gòu)的101頁報(bào)告也是在ENIAC運(yùn)行了一年后才發(fā)表的,更重要的是ENIAC是一臺并行計(jì)算機(jī)。馮諾依曼對計(jì)算機(jī)的興趣,來自于曼哈 頓工程中大量的數(shù)值計(jì)算。1944年馮諾依曼在火車站上偶遇了ENIAC總設(shè)計(jì)師戈?duì)査固购蟛艆⒂^了當(dāng)時(shí)ENIAC的研制小組。當(dāng)時(shí)馮諾依曼發(fā)覺, 引用“the machines abilities for parallel operations made
24、programming significantly more complicated. This taught him to focus on single-instruction code where parallel handling of operands was guaranteed not to occur” “這些機(jī)器的并行操作的能力使得程序編制極為復(fù)雜。這一事實(shí)讓馮諾依曼更多的關(guān)注于順序指令代碼,企圖以此來保證并行操作決可不能出現(xiàn)。” William Aspray 1990.馮諾依曼事實(shí)上不只一次地在陰溝里翻過船。相關(guān)于量子力學(xué)的可加性假設(shè),反對Backus設(shè)計(jì)Fortran語言
25、來講,馮諾依曼綜合癥還算不上是一 種失誤。因?yàn)榧幢阍谖覀兡莻€(gè)軟硬件高度發(fā)達(dá)的年代里,并行計(jì)算仍然是一個(gè)漂移的幽靈。能夠想象,在那個(gè)電子管和打孔機(jī)的年代里,并行計(jì)算的難度可能是連這 位能心算無窮級數(shù)的天才級數(shù)學(xué)大師都望而生畏的東西。然而不管如何,馮諾依曼的設(shè)計(jì)的確為后世的計(jì)算機(jī)工業(yè)帶上了一個(gè)難以解套的緊箍咒。今日許多天才程序 員為之殫精竭慮的并行計(jì)算,事實(shí)上是一個(gè)特不幽默的問題如何在一臺原本設(shè)計(jì)用來杜絕并行計(jì)算的機(jī)器上進(jìn)行并行編程? 由于馮諾依曼機(jī)在并行計(jì)算上的困難是本質(zhì)性的,專門難在它之上做零碎的修改來完全治愈馮諾依曼綜合癥。我們迫切需要適合并行計(jì)算的計(jì)算機(jī)模型。計(jì)算 機(jī)科學(xué)家們發(fā)覺,運(yùn)算之間
26、的時(shí)序性事實(shí)上只取決于運(yùn)算之間結(jié)果依靠性。比如講如此一個(gè)計(jì)算(2+3)*(4+6)。假設(shè)我們有兩個(gè)CPU,顯然兩個(gè)加法能夠 同時(shí)進(jìn)行.他們的開始執(zhí)行時(shí)依靠于兩個(gè)參數(shù)的輸入時(shí)刻,乘法的開始執(zhí)行時(shí)刻依靠于最后一個(gè)加法的完成時(shí)刻。 這種計(jì)算機(jī)模型稱為數(shù)據(jù)流機(jī)。在這種計(jì)算機(jī)上,首先需要依靠編譯器分析程序中的數(shù)據(jù)依靠性。與馮諾依曼結(jié)構(gòu)為每一個(gè)內(nèi)存單元表識一個(gè)變量名不同, 編譯器為每一個(gè)運(yùn)算上的依靠節(jié)點(diǎn)標(biāo)記一個(gè)唯一的Tag.比如上面那個(gè)運(yùn)算,我們能夠?yàn)樗械腎nput標(biāo)記Tag(Input1.Input4),為乘 法運(yùn)算所依靠的兩個(gè)加法運(yùn)算標(biāo)記兩個(gè)Tag(Add1,Add2)。編譯后的運(yùn)算指令和Tag一起
27、被合并到一種叫instruction storage的包。比如2+3就變成了(Input1,Input2,+,Add1).當(dāng)程序運(yùn)行時(shí)這些數(shù)據(jù)包就會加載到一種叫做CAM的內(nèi)存中。 CAM(Content-addressable memory)與我們一般使用的線性編址隨機(jī)訪問的RAM(Random Access memory)不同。在RAM中我們給出一個(gè)地址,它返回那個(gè)地址的存儲的data word。而CAM是給它一個(gè)data word,它會搜索地址空間給出所有存儲那個(gè)data-word的地址。當(dāng)一個(gè)instruction storage的所有tag處于到達(dá)狀態(tài)時(shí)比如(2,3,+,Add1),(
28、4,6,+,Add2),就會把運(yùn)算數(shù)據(jù)和操作指令打包成 instruction token交給運(yùn)算單元進(jìn)行并行運(yùn)算.一旦運(yùn)算完成,運(yùn)算單元會將運(yùn)算結(jié)果和輸出Tag打成一個(gè)data token數(shù)據(jù)包發(fā)送給CAM.CAM就搜索所有依靠于此Tag的instruction storage搜索出來,將對應(yīng)的tag標(biāo)記為到達(dá)狀態(tài)比如(5,Add2,*,Output)。 在DataFlow機(jī)上整個(gè)計(jì)算過程由數(shù)據(jù)流驅(qū)動(dòng)操縱流。每一個(gè)指令有一系列類似黑盒的Input Output以及相關(guān)的運(yùn)算操作組成。程序的運(yùn)算順序依靠于數(shù)據(jù)的輸入順序,而不依靠于系統(tǒng)的時(shí)鐘序列。數(shù)據(jù)也可不能像馮諾依曼機(jī)一樣長久的存儲于內(nèi)存單元
29、 當(dāng)中,而變成在instruction storage之間傳遞的數(shù)據(jù)消息。這種模式在應(yīng)對針對外部的并發(fā)信號時(shí),程序無需進(jìn)行毫無必要的輪詢操作,而是在信號到達(dá)的即刻立即響應(yīng)處理數(shù)據(jù)。沒有 了操縱流帶來的Memory wall,也不需要引入鎖機(jī)制。那個(gè)陰魂不散的賦值運(yùn)算符所帶來的混亂也消逝的無影無蹤。 專門多程序員在學(xué)習(xí)Monad模型時(shí),對它那種抽象違反直覺的模型產(chǎn)生本能的反感,認(rèn)為Monad只是一種純粹為了形式化而形式化的奇技淫巧。這 種現(xiàn)象并不驚奇,正所謂不識廬山真面目,只緣身在此山中。我們假如在馮諾依曼機(jī)的順序執(zhí)行的背景下去考察Monad,看到的勢必是并發(fā)世界在順序模型上的 扭曲投影。而在D
30、ataFlow模型下,Monad模型自然而然地回歸到了并發(fā)形態(tài)。我提到過一個(gè)IO Monad 的例子 getline().DO (X=X.ToUpper().IO().DO (X=putline(X); 我們曾把Monad比作聯(lián)邦快遞,現(xiàn)在來看那個(gè)聯(lián)邦快遞所作的工作確實(shí)是在快遞數(shù)據(jù)。每一個(gè)被Bind/=復(fù)合的函數(shù)差不多上一個(gè)能夠 并行計(jì)算的instruction storage,而Bind/=則是描述了運(yùn)算與運(yùn)算之間的依靠性和數(shù)據(jù)流的走向。IO Monad的各個(gè)部件在數(shù)據(jù)流驅(qū)動(dòng)模型中一一對應(yīng)必不可少的。現(xiàn)在我們再回過頭去關(guān)注一下Unix Pipe和早期的Pascal程序,可能就可不能對他們具有
31、Monad結(jié)構(gòu)而感到驚奇了。Unix發(fā)明人Dennis M. Ritchie在中講道: 引用“Of course, the fundamental idea was by no means new; the pipeline is merely a specific form of coroutine.” “因此,管道的差不多概念沒有什么新意;它只是一種特不形式的協(xié)程”Monad結(jié)構(gòu)之因此會在PipeLine的層面上發(fā)揚(yáng)光大,完全是因?yàn)閜ipeline所需要面對的是一群并發(fā)的進(jìn)程。在Ritchie的同一 片文章里,我們還能看到早期Unix系統(tǒng)中地的并發(fā)性問題是依靠管道,消息隊(duì)列等操作系統(tǒng)機(jī)制來
32、完成的。也確實(shí)是講早期的Unix系統(tǒng)本身確實(shí)是一個(gè)使用 Monad結(jié)構(gòu)來構(gòu)造的并發(fā)系統(tǒng)。傳統(tǒng)程序語言只是設(shè)計(jì)用來編寫那個(gè)并發(fā)系統(tǒng)上的非并發(fā)的順序型代碼。隨著技術(shù)的進(jìn)展,當(dāng)操作系統(tǒng)層面上的工具無法應(yīng)付越 來越復(fù)雜的并發(fā)問題時(shí),我們才想起往傳統(tǒng)編程語言中增加并發(fā)性的支持。 Monad模型在并發(fā)問題上展現(xiàn)出來的強(qiáng)大能力實(shí)非偶然。整個(gè)DataFlow的計(jì)算過程類似一棵表達(dá)式展開樹。在更加復(fù)雜的例子中,比如引入遞 歸的情況下,DataFlow就會形成一張網(wǎng)或者講圖。在DataFlow誕生以來,計(jì)算機(jī)科學(xué)家們對DataFlow網(wǎng)結(jié)構(gòu)特性進(jìn)行了大量的研究。比如 Thomas Hildebrandt在1998
33、年工作,給出了一個(gè)基于traced monoidial category的模型.Tarmo Uustalu and Varmo Vene,2005年在此基礎(chǔ)上直接給出了一個(gè)基于Co-Monad的DataFlow interpreter. 隨著研究的接著深入,人們甚至發(fā)覺并發(fā)機(jī)制可能更多的與代數(shù)幾何的拓?fù)湫再|(zhì)有關(guān)。比如并發(fā)實(shí)體之間的狀態(tài)組合會隨并發(fā)數(shù)量的增加而導(dǎo)致狀態(tài)爆炸 (state space explosion problem).狀態(tài)爆炸意味著我們無法通過機(jī)械的手段來操縱和檢驗(yàn)并發(fā)狀態(tài)的變換和轉(zhuǎn)移,只能依靠人力來檢查。現(xiàn)在學(xué)者普遍認(rèn)為現(xiàn)狀態(tài)空間之間極有可 能存在代數(shù)幾何中的同倫變換,假如我
34、們能夠找到各個(gè)狀態(tài)空間之間的同倫變換,那么我們就無需遍歷所有的狀態(tài)。( HYPERLINK http:/www.di.ens.fr/%7Egoubault/index1.html t _blank 現(xiàn)在大多數(shù)研究者相信, 順序型問題與并發(fā)并行是兩個(gè)完全不同的領(lǐng)域。前者可能具有更多的代數(shù)性質(zhì),而后者則是一個(gè)完全幾何化的問題。這些前沿的研究方向,不是本文的重點(diǎn)。只是我 們值得注意的是Monad./Co-Monad是代數(shù)幾何基礎(chǔ)理論-Topos的核心方法。我們能夠如此推測,Monad之因此與DataFlow模 型兼容,極有可能是因?yàn)樗哂信c并發(fā)系統(tǒng)相一致的幾何性質(zhì)。我們還能夠更進(jìn)一步地推測, Eug
35、enio Moggi論文中用Monad所描述的6種計(jì)算可能差不多上具有并發(fā)性的。比如Exception確實(shí)是一個(gè)并發(fā)性的問題。這一點(diǎn)在Erlang中體現(xiàn)的最為自 然,Erlang中Exception演變?yōu)檫M(jìn)程與進(jìn)程之間的通信消息,Erlang不在需要一層層的try_catch防衛(wèi)代碼。一個(gè)進(jìn)程中的代碼出現(xiàn) 異常自己死亡,在死亡之前給link進(jìn)程發(fā)送一個(gè)消息由link進(jìn)程決定如何處理異常。 假如這些數(shù)學(xué)理論的推測都能得到證實(shí)的話,我們可能面臨的是一個(gè)編程觀念上的極為重要的轉(zhuǎn)折點(diǎn)。在順序型領(lǐng)域種種軟件結(jié)構(gòu)的代數(shù)性質(zhì)問題,在未 來都需要在并行/并發(fā)的幾何結(jié)構(gòu)上進(jìn)行重新探討。這一點(diǎn)也與代數(shù)幾何的種種結(jié)
36、果不謀而合,在代數(shù)幾何下幾乎全部交換代數(shù)定理都有明顯的幾何意義。因此這些 問題是我們無法深究的依舊需要留給數(shù)學(xué)家們?nèi)ヮ^疼,只是這些前沿理論給我們的編程實(shí)踐點(diǎn)亮前進(jìn)的燈塔“The world is parallel “。Joe Armstrong的這句箴言應(yīng)該成為以后軟件設(shè)計(jì)的首要準(zhǔn)則。 DataFlow盡管在并行/并發(fā)中有著巨大的優(yōu)勢,然而至今沒有什么成功的商業(yè)型的應(yīng)用。那個(gè)地點(diǎn)有著眾多緣故,首先是硬件設(shè)備的制造,與現(xiàn)在動(dòng)不 動(dòng)幾個(gè)G的RAM來相比,大容量的CAM特不難以制造。因此CAM現(xiàn)在只是用在一些專門的設(shè)備上,比如網(wǎng)絡(luò)交換機(jī)和路由器差不多依靠CAM來實(shí)現(xiàn)地址查找。 其次是軟件設(shè)計(jì)如何去兼
37、顧硬件的限制,指令與數(shù)據(jù)的依靠性分析需要對程序進(jìn)行切分,然而切分到什么樣的顆粒度則完全依靠于硬件的限制。假如切分的太細(xì)那么 硬件之間的通信網(wǎng)絡(luò)就無法承受大量的數(shù)據(jù)流。最后是如何能夠充分的兼容馮諾依曼機(jī)上的軟件。這些差不多上DataFlow模型在工程實(shí)踐方面尚不成熟的領(lǐng)域。 然而DataFlow模型上有相當(dāng)多的成熟技術(shù)差不多廣泛應(yīng)用于我們?nèi)粘5能浻布铩T谥噶罴墝用妫热鏧86CPU處理器從Cache預(yù)取了一 批指令后,通過數(shù)據(jù)流分析(data flow analysis)分析找出沒有互相依靠的并發(fā)執(zhí)行的指令,送到幾個(gè)獨(dú)立的執(zhí)行單元進(jìn)行亂序執(zhí)行(Out-of-order execution),最
38、后依靠Cache恢復(fù)指令序列。這確實(shí)是一個(gè)縮減化的DataFlow模型。在高級語言層面,許多編譯器都能對源代碼做數(shù)據(jù)依靠分 析從而進(jìn)行代碼重排優(yōu)化,將可并行的指令盡量靠近排列,以便CPU一次能夠盡量取到更多的并行指令。 在軟件結(jié)構(gòu)的層面上,最直接的案例確實(shí)是Event Driven。原始的同步/異步IO仍然是一種輪詢信號的做法,唯一的不同在于同步IO是Thread內(nèi)部輪詢,異步IO是程序員手工編寫輪詢編碼。為了 進(jìn)一步提高并發(fā)性能,現(xiàn)在主流的操作系統(tǒng)都提供了觸發(fā)式的IO,比如windows下的完成端口,Linux下的EPOLL/KQueue.這些 Event Driven的模型是一個(gè)放大了的D
39、ataFlow模型。它將多個(gè)臺機(jī)器上的獨(dú)立的運(yùn)算過程,看成是一個(gè)DataFlow整體計(jì)算。程序員將事件對應(yīng)的代 碼片斷,注冊在內(nèi)存中的一張Hash表或者線性表里。只有當(dāng)外部IO的信號到達(dá)的那一刻程序才會查詢事件注冊表找到對應(yīng)的程序片斷開始執(zhí)行。Event Driven相比于Thread的優(yōu)勢是顯而易見的,沒有Context Switch,外部IO事件幾乎能夠得到實(shí)時(shí)地響應(yīng),沒有鎖機(jī)制和內(nèi)存共享,程序的魯棒性和可擴(kuò)展性大大提到。然而它的缺點(diǎn)也是難以回避的。我們怎么講依舊 在馮諾依曼機(jī)器上編寫代碼,我們的編碼仍然要受到Program Counter的限制。與Thread自底向上同步時(shí)鐘序列的模式不
40、同。Event Driven無法依靠偏序集的傳遞性自動(dòng)地將外部IO時(shí)序與代碼之間的順序映射起來。這也就意味著它必須以一種自頂向下地點(diǎn)式手工維護(hù)兩者時(shí)序的映射關(guān) 系。Event Driven難以編寫和維護(hù)。原本按照本地時(shí)鐘順序自然編寫的代碼,需要程序員手工切分成若干塊,以及手工維護(hù)復(fù)雜的狀態(tài)機(jī)來驅(qū)動(dòng)代碼塊切換時(shí)所產(chǎn)生的數(shù) 據(jù)流淌。 魚與熊掌如何兼得,就成為了程序員們在處理并發(fā)問題上最為頭痛的問題.融合Thread和Event Driven,歷來有兩種不同方向的解決方案。第一種比較主流的方案,是以馮諾依曼機(jī)的角度動(dòng)身,以Thread設(shè)施兼容Event Driven,比如Fiber, co-rout
41、ine, cooperative-thread等等。這一方案的好處在于,實(shí)施簡單無需在原先的Thread代碼上做太多的更動(dòng)。缺點(diǎn)在于,第一無法消除馮諾依曼 機(jī)的Memory Wall, 是一個(gè)用空間復(fù)雜度換取時(shí)刻復(fù)雜度的方案。 像Fiber如此的解決方案以Stack switch替代Context Switch. 為每一個(gè)Fiber保留Stack受到了內(nèi)存的限制,在C/C+如此大量使用Stack 變量的語言里需要為每一個(gè)Fiber預(yù)留1M左右的Stack.第二,我們將在后文看到這種方案盡管能夠解決并發(fā)問題,然而無法解決并行問題。在多核系統(tǒng) 上,多個(gè)Event Loop之間的任務(wù)調(diào)度是一個(gè)巨大的
42、難題。 第二種方案是以DataFlow機(jī)的角度動(dòng)身,用Continuation Monad & Lazy Evaluation將Event Driven的代碼片斷組合出Thread順序語義。這一工作是,最早是由Koen Claessen在1999年做出的。2007年由Peng Li, Simon Marlow, Simon Peyton Jones 在Haskell上給出了第一個(gè)實(shí)現(xiàn)。這回答了我們一個(gè)問題,什么緣故在傳統(tǒng)語言中IO的行為是與Monad截然對立的? 賦值語句本身是一種CPU內(nèi)部的隱式IO操作。因此傳統(tǒng)IO函數(shù)與賦值語句是可復(fù)合的,它的確讓我們的程序看上去自然舒適,而不像IO Mo
43、nad那樣不扭。然而這種臨時(shí)的自然舒適,給我們帶來了無盡的苦惱。我們能夠放心的讓計(jì)算機(jī)運(yùn)算1+1是因?yàn)橛袌D林機(jī)和lambda演作為保障。隱式的賦值語句將IO混入了計(jì)算后,會發(fā)生什么呢?顯然這是這兩個(gè)模型無法回答,而又需要我們深入探究的問題。作為結(jié)構(gòu)化語言的發(fā)明人John Backus在同一片演講里,反復(fù)強(qiáng)調(diào)了對賦值語句所帶來的困擾引用” Moreover, the assignment statement splits programming into two worlds.Thefirst world comprises the right sides of assignment state
44、ments. This is anorderly world of expressions, a world that has useful algebraicpropertiesIt is the world in which most useful computation takes place.The second world of conventional programming languages is the world ofstatements.This world of statements is a disorderly one, with few usefulmathema
45、tical properties. Structured programming can be seen as a modesteffort to introduce some order into this chaotic world, but it accomplisheslittle in attacking the fundamental problems created by the word-at-a-timevon Neumann style of programming, with its primitive use of loops,subscripts, and branc
46、hing flow of control.”更重要的是,賦值語句將程序割裂為兩個(gè)世界。第一個(gè)世界是賦值語句右邊的世界。這是一個(gè)有序的表達(dá)式世界,那個(gè)世界有許多有用的代數(shù)特性.。最有用的計(jì)算都發(fā)生在那個(gè)地點(diǎn)。第二個(gè)世界是語句的世界,這是一個(gè)無序的世界,在那兒找不到什么有用的數(shù)學(xué)特性。結(jié)構(gòu)化編程一定層度上為那個(gè)混亂的世界帶來一些秩序,然而它那些原始的循環(huán),子函數(shù),分支流程技術(shù)從未擊中過馮諾依曼型語言的本質(zhì)問題-一次一條指令的操縱流模式”John Backus的演講,差不多過去31年了,他老人家也差不多駕鶴西去。相比于Backus的年代,我們在編程實(shí)踐上差不多有特不豐富的手段來應(yīng)付那個(gè)混亂的世界,結(jié)
47、構(gòu)化,面向?qū)ο螅嫦蚍矫?動(dòng)態(tài)語言。在這些方法看來,賦值語句與計(jì)確實(shí)是等價(jià)的、同質(zhì)的、混合使用是天經(jīng)地義無需置疑的;IO只是局部領(lǐng)域內(nèi)的專有問題(比如網(wǎng)絡(luò)通信)而不是全局性的問題。然而另一方面理論研究者們遵循John Backus觀點(diǎn),用數(shù)學(xué)理論構(gòu)建IO世界的內(nèi)在秩序。這些數(shù)學(xué)理論的推演告訴我們?nèi)绱艘粋€(gè)結(jié)果: 在馮諾依曼型語言中IO問題不是局部的而是全局性的。IO具有并發(fā)性,而計(jì)確實(shí)是非并發(fā)的,這兩種操作需要分不處理。當(dāng)程序中引入越來越多的并行/并發(fā)背景的時(shí)候,John Backus的遠(yuǎn)見卓識就越顯示出他深邃的洞察力。并發(fā)占主流的程序里,IO的并發(fā)性意味著單臺計(jì)算機(jī)面對的將不是唯一的時(shí)鐘。比如
48、兩臺以TCP連接的服務(wù)器,他們時(shí)鐘速度未必是等同的,即便是等同的我們也無法忽略時(shí)鐘信號傳遞的延時(shí)。當(dāng)兩個(gè)時(shí)序不一樣的時(shí)鐘共同驅(qū)動(dòng)一份代碼的時(shí)候,馮諾依曼機(jī)的全然性難題也隨之而來。馮諾依曼機(jī)的程序指令是按照 CPU的時(shí)序順序執(zhí)行的,并發(fā)多任務(wù)程序也不例外。偏序集的有一個(gè)特性叫做傳遞性,12,24,那么14.這種傳遞性。這使得自然數(shù)集的若干個(gè)子集的并集同樣存在偏序性. 在馮諾依曼機(jī)上,任何與順序有關(guān)的問題,最為簡易的方式確實(shí)是依靠偏序的傳遞性,從底層自低向上地一級一級傳遞CPU的時(shí)鐘序列。Thread Model模型之因此易于開發(fā),也正是因?yàn)椴僮飨到y(tǒng)在底層操縱了時(shí)刻片的分配,使得每一個(gè)Thread
49、的時(shí)鐘序列和代碼順序保持一致。換而言之 Thread Model是一個(gè)放大了的馮諾依曼機(jī),要在那個(gè)模型中處理并發(fā),我們必須面一個(gè)問題時(shí)鐘校準(zhǔn)。時(shí)鐘校準(zhǔn)可能是那個(gè)世界最本質(zhì)的問題之一,它直接導(dǎo)致了上世紀(jì)最為詭異的理論相對論的誕生。從物理學(xué)上講,信號傳遞是時(shí)鐘校準(zhǔn)的唯一方法。在計(jì)算機(jī)中也不能例外,馮諾依曼機(jī)要校準(zhǔn)不同的時(shí)鐘序列,就必須解決如何獵取外來信號的問題。操縱流驅(qū)動(dòng)模式?jīng)Q定了馮諾依曼機(jī)不同意外界的信號直接驅(qū)動(dòng)指令執(zhí)行。CPU只能通過本地時(shí)鐘觸發(fā)操縱流,周期性發(fā)起狀態(tài)查詢。CPU在某個(gè)周期向其他時(shí)鐘源發(fā)送信號,在收到遠(yuǎn)端時(shí)鐘的反饋信號后計(jì)算得出本地代碼序列上的同步點(diǎn),然后移動(dòng)PC指針指向同步點(diǎn)
50、。不管是早期CPU的輪詢模式依舊現(xiàn)在廣泛采納的中斷方式,其差不多的校準(zhǔn)模式并沒有改變,只只是查詢對象由最初的IO設(shè)備演變?yōu)橹袛嗉拇嫫鳌;谛盘柌樵兊男?zhǔn)方式,讓馮諾依曼機(jī)在處理并發(fā)問題上就像是帶著鐐銬跳舞。操縱流驅(qū)動(dòng)首先無可幸免地導(dǎo)致了鎖機(jī)制的產(chǎn)生。John Backus 告訴我們賦值語句事實(shí)上是一種IO,它意味著賦值運(yùn)算符兩邊數(shù)據(jù)的單向的數(shù)據(jù)流淌。然而馮諾依曼機(jī)的查詢式時(shí)鐘校準(zhǔn)機(jī)制,必定意味著一次雙向的數(shù)據(jù)流淌。假如以兩條賦值指令來驅(qū)動(dòng)一次雙向數(shù)據(jù)交換,那么勢必就要同步兩條指令的先后執(zhí)行順序。然而要同步指令的執(zhí)行順序,又必須先校準(zhǔn)時(shí)序。因此那個(gè)地點(diǎn)我們陷入了類似于相對論的邏輯困境。兩個(gè)慣性系
51、中要校準(zhǔn)時(shí)鐘必須首先明白光速的傳播速度,而要明白光速的傳播速度必須首先校準(zhǔn)時(shí)鐘。愛因斯坦為了幸免這種邏輯無窮倒退,引入了速度不變的光信號。類似地在馮諾依曼機(jī)下我們必須強(qiáng)迫一次雙向的數(shù)據(jù)交換在一個(gè)指令中瞬時(shí)的完成,比如X86下的test&set, exchange等等。這些指令的使用就導(dǎo)致了Mutex, Semaphore, Critical Section各種五花八門的鎖結(jié)構(gòu)。隨著鎖機(jī)制的引入,鎖競爭,死鎖,粒度操縱,各種并發(fā)性的苦惱滾滾而來。然而我們的苦惱還遠(yuǎn)沒有結(jié)束。操縱流驅(qū)動(dòng)還會導(dǎo)致馮諾依曼綜合癥中的 “Memory Wall”效應(yīng)(另外兩個(gè)效應(yīng)是”EnergyWall“和“Educat
52、ion Wall“)。因?yàn)槊恳淮沃噶畹膱?zhí)行都必須伴隨著計(jì)算數(shù)據(jù)地址,狀態(tài)地址,指令地址等等額外的數(shù)據(jù)流淌開銷。隨著指令數(shù)量的增加Memory Wall會越來越厚,最終會堵塞操縱流的運(yùn)行,使其而無法及時(shí)響應(yīng)IO信號。Context Switch確實(shí)是最為著名的Memeory Wall.在外界的IO信號未到達(dá)之前,Thread必須不間斷地定期執(zhí)行信號查詢代碼。每次查詢完畢讓出CPU后就要執(zhí)行復(fù)雜的數(shù)據(jù)流淌(比如 Registersave/restore,Cache refill等)。為了幸免這種開銷,現(xiàn)在專門多語言采納消耗更低的Green thread的方案. 這些方案能夠一定程度上降低消耗然而無
53、法完全根除。在并發(fā)性達(dá)一定數(shù)量級后即便是Erlang如此的語言也無法忽視“Memory Wall”的存在。因?yàn)門hread模型的困難不是來自于局部實(shí)現(xiàn)上的疥癬之癢,而是馮諾依曼模型所帶來無法根治的頑疾。在馮諾依曼機(jī)統(tǒng)治計(jì)算機(jī)業(yè)的長達(dá)60多年,它帶來的Education Wall使得專門多人特不是戰(zhàn)斗在開發(fā)第一線的程序員們專門難想象有非馮諾依曼結(jié)構(gòu)的存在。事實(shí)上令人更加難以想象的是,在馮諾依曼這位教皇統(tǒng)治現(xiàn)代計(jì)算機(jī)工業(yè)之前,絕大多數(shù)的電子計(jì)算機(jī)是并行計(jì)算的。有一個(gè)傳講流傳甚廣馮諾依曼制造了第一臺計(jì)算機(jī)ENIAC。事實(shí)上馮諾依曼本人未曾參與ENIAC的制造,那篇奠定馮諾依曼機(jī)結(jié)構(gòu)的101頁報(bào)告也是
54、在ENIAC運(yùn)行了一年后才發(fā)表的,更重要的是ENIAC是一臺并行計(jì)算機(jī)。馮諾依曼對計(jì)算機(jī)的興趣,來自于曼哈頓工程中大量的數(shù)值計(jì)算。1944年馮諾依曼在火車站上偶遇了ENIAC總設(shè)計(jì)師戈?duì)査固购蟛艆⒂^了當(dāng)時(shí)ENIAC的研制小組。當(dāng)時(shí)馮諾依曼發(fā)覺,引用“the machines abilities for parallel operations made programmingsignificantly more complicated. This taught him to focus onsingle-instruction code where parallel handling of op
55、erands was guaranteednot to occur”“這些機(jī)器的并行操作的能力使得程序編制極為復(fù)雜。這一事實(shí)讓馮諾依曼更多的關(guān)注于順序指令代碼,企圖以此來保證并行操作決可不能出現(xiàn)。” William Aspray 1990.馮諾依曼事實(shí)上不只一次地在陰溝里翻過船。相關(guān)于量子力學(xué)的可加性假設(shè),反對Backus設(shè)計(jì)Fortran語言來講,馮諾依曼綜合癥還算不上是一種失誤。因?yàn)榧幢阍谖覀兡莻€(gè)軟硬件高度發(fā)達(dá)的年代里,并行計(jì)算仍然是一個(gè)漂移的幽靈。能夠想象,在那個(gè)電子管和打孔機(jī)的年代里,并行計(jì)算的難度可能是連這位能心算無窮級數(shù)的天才級數(shù)學(xué)大師都望而生畏的東西。然而不管如何,馮諾依曼的設(shè)計(jì)
56、的確為后世的計(jì)算機(jī)工業(yè)帶上了一個(gè)難以解套的緊箍咒。今日許多天才程序員為之殫精竭慮的并行計(jì)算,事實(shí)上是一個(gè)特不幽默的問題如何在一臺原本設(shè)計(jì)用來杜絕并行計(jì)算的機(jī)器上進(jìn)行并行編程?由于馮諾依曼機(jī)在并行計(jì)算上的困難是本質(zhì)性的,專門難在它之上做零碎的修改來完全治愈馮諾依曼綜合癥。我們迫切需要適合并行計(jì)算的計(jì)算機(jī)模型。計(jì)算機(jī)科學(xué)家們發(fā)覺,運(yùn)算之間的時(shí)序性事實(shí)上只取決于運(yùn)算之間結(jié)果依靠性。比如講如此一個(gè)計(jì)算(2+3)*(4+6)。假設(shè)我們有兩個(gè)CPU,顯然兩個(gè)加法能夠同時(shí)進(jìn)行.他們的開始執(zhí)行時(shí)依靠于兩個(gè)參數(shù)的輸入時(shí)刻,乘法的開始執(zhí)行時(shí)刻依靠于最后一個(gè)加法的完成時(shí)刻。這確實(shí)是傳講中的交叉引用。 Trustno
57、1 寫道轉(zhuǎn)貼一個(gè)評論,牛人確實(shí)是牛人. 引用本文: 轉(zhuǎn)寄轉(zhuǎn)貼刪除修改回復(fù)作者:dragondevil人氣:86 發(fā)信人: dragondevil(流星見龍?jiān)谔?, 信區(qū): Algorithm 標(biāo) 題: Re: 轉(zhuǎn)載zz 關(guān)于兩個(gè)世界體系的對話 -by Trustno1 發(fā)信站: 瀚海星云 (2008年08月23日13:26:20 星期六), 站內(nèi)信件 WWWPOST 不錯(cuò)的文章。不超出基于Von帶來的認(rèn)識,就可不能發(fā)覺計(jì)算的本質(zhì),既不是函數(shù)也不是數(shù)據(jù) 結(jié)構(gòu),僅僅是數(shù)據(jù)流本身。Education wall,正是最令人擔(dān)心的。注意到即便是CAM模型, 也只是是為Anti-Von有意反其道而行罷了,
58、仍然有查詢,并不直接的實(shí)踐數(shù)據(jù)流向的交換。 當(dāng)實(shí)踐了一組指令模塊的輸出向輸入的任意調(diào)度,使這些模塊持續(xù)工作,程序的功能就只剩 下約定哪個(gè)時(shí)鐘沿將哪個(gè)模塊的輸出送到哪個(gè)模塊的輸入。這種方法要求嚴(yán)格精確的時(shí)刻約 定,必須在編譯時(shí)進(jìn)行指明,而不大可能實(shí)時(shí)產(chǎn)生(也不排除這種可能,只是我懷疑其功耗 和運(yùn)算量),這就導(dǎo)致處理器外部導(dǎo)致的時(shí)刻不確定性無法解決,而使那個(gè)方法成為空談。 相比設(shè)計(jì)一個(gè)能包容一定的時(shí)刻不確定性的以數(shù)據(jù)流調(diào)度為核心的指令陣列并行體系,專用 計(jì)算器ASIC的設(shè)計(jì)方式可稱為入門級的訓(xùn)練(不幸的是哪怕那個(gè)入門級的訓(xùn)練也是目前人類 所掌握知識中較為匱乏的一種),因?yàn)槠淦帘瘟藖碜酝獠康娜魏尾淮_
59、定性,并以固化接線實(shí) 現(xiàn)了數(shù)據(jù)流的轉(zhuǎn)接。 數(shù)據(jù)流本身確實(shí)是計(jì)算。遠(yuǎn)離那些在一個(gè)操縱為核心的硬件體系上“虛擬”出的高級語言吧, 那只讓你完全不記得什么是計(jì)算compute,什么是計(jì)算機(jī)computer。5個(gè)局長4個(gè)副局長1個(gè)辦事 員的情況差不多夠令人厭煩,更可惱的是實(shí)際上有20個(gè)辦事員但因?yàn)榫珠L們治理能力有限,總 是只有一兩個(gè)正在工作而其他的統(tǒng)統(tǒng)休息卻不停止消費(fèi)他們的面包(不可能為了幾個(gè)周期的 空閑而關(guān)閉功耗)。 讓所有的辦事員埋頭工作,使傳遞員來提供輸入、適時(shí)的取走輸出并交給下一個(gè)辦事員。這 確實(shí)是我所希望的體系。恩,對高性能計(jì)算而言,Von目前差不多只是個(gè)笑話。我明白那個(gè)家伙講的確實(shí)是FPG
60、A,FGPA,FPGA 哈哈,全世界所有的語言都靈活,唯一不靈活的確實(shí)是硬件. reconfiguration computation,各個(gè)大學(xué)的大夫們差不多叫了N年了,惋惜確實(shí)是PC那個(gè)領(lǐng)域針插不進(jìn)水潑不進(jìn).然而我相信,I記A記每年加內(nèi)核的活計(jì)干不了多青年. PC那個(gè)地點(diǎn),廟小妖風(fēng)大,池淺王八多.Education wall讓專門多人上了賊船就一輩子下不來了,怎么講 terranhao 寫道.馮.落衣慢是我們差不多的理論前提.是我們現(xiàn)在計(jì)算機(jī)工業(yè)的全然.看起來計(jì)算機(jī)工業(yè)只有PC一樣. 引用數(shù)據(jù)流本身確實(shí)是計(jì)算。遠(yuǎn)離那些在一個(gè)操縱為核心的硬件體系上“虛擬”出的高級語言吧,這句話深得吾心,只只是
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T/CCS 052-2023碳捕集、利用與封存工程項(xiàng)目碳排放源篩選指南
- T/CCS 005-2023智能化煤礦工業(yè)軟件開發(fā)接口規(guī)范
- T/CCMA 0140-2022塔式起重機(jī)標(biāo)識
- T/CCMA 0101-2020工程機(jī)械行業(yè)基于Handle的供應(yīng)鏈的信息交互通用數(shù)據(jù)
- T/CCMA 0058-2018場(廠)內(nèi)電動(dòng)巡邏車
- T/CASWSS 009-2023社區(qū)老年中醫(yī)健康管理服務(wù)中心功能性食品調(diào)理規(guī)范
- T/CARSA 1.3-2022基于低空無人機(jī)的高分衛(wèi)星遙感產(chǎn)品真實(shí)性檢驗(yàn)第3部分:光學(xué)遙感影像數(shù)據(jù)獲取
- T/CAQI 183-2021燃煤電廠脫硫廢水處理技術(shù)規(guī)范
- 2024年度江蘇省二級注冊建筑師之建筑結(jié)構(gòu)與設(shè)備通關(guān)試題庫(有答案)
- 管理博士面試題及答案
- 自發(fā)冠脈夾層診療指南解讀
- 養(yǎng)老院老人入(出)院流程圖
- 健康照護(hù)教材課件匯總完整版ppt全套課件最全教學(xué)教程整本書電子教案全書教案課件合集
- 最新-臨時(shí)救助申請審核審批表模板
- 《有效溝通》PPT課件-(2)
- 三級醫(yī)院服務(wù)能力指南2022
- 家庭室內(nèi)裝飾裝修工程驗(yàn)收單
- 青春紅綠燈教學(xué)設(shè)計(jì)中小學(xué)心理健康心理游戲腳本
- 《城鎮(zhèn)土地使用稅納稅申報(bào)表》
- 三年級數(shù)學(xué)下冊口算脫式豎式練習(xí)題
- 電梯困人救援流程圖
評論
0/150
提交評論