Networked Data Flow Graph Machine
G-machine: 協同平行動態配置運算即調整鏈結狀態
Graph machine("圖論機",亦稱"動態連結網路式資料流機")的operators自主存取switches-map上的linking-state,配置線路的同時進行配置好的線路的運算,而運算除了產生新值到operands外亦可能存取switches-map上linking-state,有可能運算完其配置的線路就自動釋放,也有可能在運算完後更改運算線路的鏈結狀態以供往後的運算。此機制相當有用於方程式推導,不像傳統運算機程式的算式都是單方向堆疊計算且式子是固定不可變動的,即便程式是設定成可於runtime自我改寫那也是更改instruction codes,而Sense based Graph machine則是直接更改virtual wires,Sense G-machine不使用instruction code decoder而採用直接匹配比對sense entries所link的symbols產生shiftable switch states的方式。採用新方式的前提是virtual wires上switch states的memory cells電路總體積必須小於原先decorder組合閘電路體積(後者會隨運算資源單元數增加decoder的gate level及gatecon count,以解碼器解碼定址的方式其address bandwidth對擴展彈性是一大問題;前者只需增加switch memory,以相同的bandwidth延伸用於比對symbols的bus)才符合系統晶片設計的成本考量,所以採用MRAM cell相較於SRAM/DRAM頭一個在空間上就是一項利多。Graph的linkages不是永遠存在enhanced switches network上的,它們是可swap-in/out的,非運作時可轉成symbols回存到MEM槽列裡。ALUs能夠自主存取switches-map上的linking-state,可以依序將script透過switches-network逐一比對sense entries所link的symbols,匹配產生浮動游標到switches-map上,接著依操作子(operator)結合優先權順序讓operators(ALUs)與operands(MEMs)自己去互動,即在配置線路的同時進行配置好的線路的運算,而運算除了產生新值到operands外亦可能存取switches-map上linking-state,有可能運算完其配置的線路就自動釋放。至於比對匹配不存在的symbols則自動產生新的senses。G-machine相較於傳統處理器有一個很大的差異是它沒有program counter,純然在switches-network上配置"=>"操作子(NextStep)定義流程。如果你質疑這不是一下子就寫滿了switches-network?請回顧一下此則網誌前面的這句話:"配置線路的同時進行配置好的線路的運算,而運算除了產生新值到operands外亦可能存取switches-map上linking-state,有可能運算完其配置的線路就自動釋放,也有可能在運算完後更改運算線路的鏈結狀態以供往後的運算。"
而computing flow graph的linking state可於整體運算期間被動態更改的機制為什麼這麼重要?舉例:傳統單方向代値入公式堆疊計算出答案的方式,每代入一次三角或對數指數函數的値就是一次誤差;為大幅減少誤差當然是要先把方程式代換成最少函數項再代入値算出的答案才精確,由於同一道方程式每次運算已知項與未知項未必相同,故於運算間動態調整算子(等號"="也是一個算子)算元連接狀態是必需的。換言之,數值方法的使用應留到最後,之前應先做好符號鏈結處理的工作。另外,對於解graph traveling問題,直接以virtual wires為G點間的linkages,在traveling的同時能夠更改linkage也是許多graph演算的基本需求。Graph machine比起傳統數値定址空間stack machine在硬件層次就更適合且更直接處理這類問題。 符號處理器之所以重要於純數值計算機,往往我們要記憶的是簡化約分後的式子而非有誤差的數值,例如: n/N、N^(1/n)、log (n,N)、 三角函數。一道數學式應先調整為乘積項(指數為正)與除分項(指數為負)分群,分別乘積後再相除誤差才能減至最小。
Computing flow graph的linking state可於整體運算期間被動態更改的機制亦滿足了flow path control。傳統指令流處理器是用條件式分支(跳躍)指令載入新的address到program counter控制程序流程走向;G-machine用條件判斷算子即時存取開關網路動態變更資料流向(路徑)。迴圈亦然,但有些情況,傳統指令流處理器上的迴圈也是屬於可平行化的巨集演算,只是處理器不支援,此種狀況在G-machine則跟一般的運算網路配置一樣,除非運算資源不夠用,才會形成循序的情況。
* 傳統指令流CPU可用軟體程序以較慢的速度模擬G-machine的硬體行為;而G-machine亦可以配置出傳統指令流CPU的電路結構。
早期design COMPUTER都脫離不了用數值解碼切換器來定址,交換機早期只考慮到端對端通訊用途不管有沒有分封也都用數值標示節點,現今,我們不要MAC/IP address,我們要重新design DistributedCOMPUTER,COMPUTER NETWORK就等於是在grid-chips間的bus插入附有轉接頭的延長線或天線拉大其間距離。
- Control-driven:
Operator被invoke時即驅動運算,在SYNAPSE結構機制下這必須靠pulseline的ripple來達成,因為在NEURONS結構機制operator被invoke時只是配置了flowgraph,必須有value進入flowgraph才會啟動運算。 - Data(event)-driven:
資料備妥新的資料來到時即驅動運算(pulse line的ripple來到時),如此event的傳遞就不是藉由不同的傳統多工處理器processes/threads在put/get共用訊息佇列以行程間通訊方式模擬event傳遞。 - Goal-driven:
一道命題方程式的collection/package被invoke就配置好必要的flowgraph,由其無值的operand(s)自動search其它需要的命題方程式並invoke使未項變為已知每當有新value進入該net時即自動調整inner-linkages至最佳備算狀態(相當於是在整理式子)。
彈性變動帶寬: - ALU與REG(MEM)還有netlist的數量要能自動隨運算傳遞的value的長度變化,ALU與REG(MEM)還有netlist在槽列或槽柵上要可shift以動態插入或回收顆粒單元。
晶片陣列間除了concurrent channels資料直接傳遞外更有sequential交談埠以message(script/description/language)交流,陣列中每個晶片的功能不盡相同而介面則保持一致,邏輯電路設計遵循"空間遞迴結構"(一結構體由若干個自己所組成)的設計原則:
- 小顆粒組織成大顆粒的結構形式相同於更小顆粒組織成小顆粒的結構形式 (無限的空間遞迴結構) 。
- 若干小顆粒組成的大顆粒跟一體成形的大顆粒互可取代。
- 對外界互動者就溝通上而,小顆粒跟大顆粒的介面相同無異,不會因為顆粒數目的改變而使介面有異。
平行處理語言解析組合
將scripts透過switches network比對sense entries所link的symbols匹配產生浮動游標到switches map上的動作可以平行處理。解析成sense graph與computing flow graph後運算,其運算後的結果也有可能產生scripts輸出:依據switches map上的linking state組織sense entries所link的symbols串成script。組合的動作也跟解析的動作一樣是平行處理,組成script然後再循序輸出。
VonNeumann bottleneck
"凡紐曼瓶頸"是指運算邏輯單元與記憶單元分隔於兩獨立空間其間僅以極少的帶寬連接使得運算子集與運算元群無法充份連結而形成的效能瓶頸。在1940年代計算機架構如此設計埋下沿用至今仍未革新邏輯結構上的先天設計缺陷,主要有兩個原因:
- 在數理邏輯上當代設計思維是模擬人在處理算術時的模式,一次只處理一個算術,處理完才處理下一個,在一單位時間只有一個運算子與極少的運算元連接。(然而對現代處理器設計而言,我們應進一步考慮到,有人在處理邏輯命題數理方程時是一張graph同時處理而非的一個一個單元符號循序處理的,微處理器設計也應該參考這個模式。 )
- 在半導體元件物理上,不論哪個年代,運算邏輯元件與記憶元件做在一起的話良率很低故障率很高,是製程技術上的難題。
傳統處理器其單一管線中的"平行化"(不是指多管線"超純量(super scalar)"平行)僅是增加運算子與運算元之間二個(一輸入一輸出)或三個(二輸入一輸出)資料帶的位元數將原來要兩個以上單位時間操作的運算於一個單位時間處理,但沒有增加單位時間運算子集與運算元群間的動態連結(可程式的連結)數量。而所謂的"硬體加速"是把多個運算子直接連接(靜態連結)成單一個固定的複合運算子使原先循序執行的工作平行化在一單位時間完成,也由於不是在不同時間單位所以運算子其間不需運算元暫存(管線latch暫存器除外)就直接相連,於是只有存取最前端輸入和最後端輸出動態連接的記憶單元,一樣無關運算子集與運算元群之間的動態連結。所謂"動態連結"是指透過記憶體開關決定相連與否而非直接的相連,有人稱之"virtual wire",傳統處理器將這個開關陣列接上decoder匯至較開關數少的輸入以較少的bit決定每一單位時間要開啟連結的開關,這樣的缺點是每一單位時間只有極少的連結開啟,造成所謂的"凡紐曼瓶頸"。直接在每一連接開關上對應一個latch記憶體才能將運算子集與運算元群間的可程式連結數量增至最大,但相對的電路所占空間會隨連結開關數量的增多而增多,一個準則是多增的latch記憶體總占空間最好與去除的decoder相等,但或許為了克服"凡紐曼瓶頸"為開關記憶體叢集擴增空間本來就是應該的。而且,參考生物腦神經網絡結構,記憶單元(突觸synapses)與運算邏輯單元(神經細胞neurons)亦是大量的多對多連接,如果要微處理器具備人工神經網路的功能,這一點是必為的。附帶一提,從Harvard架構開始處理器將程式記憶與資料記憶分開放置,主要是存取權限的問題。我現在設計的微處理器不區分程式與資料,主要是因為我遇到的很多情況下,程式即資料,資料即程式,沒辦法分。但我有在硬體上做一個基於sense的物件導向式access permission機制,更細緻地管理記憶體讀寫權限,所以不用擔心會有程式被誤寫的情形。
傳統上,在ENIAC/VonNeumann改良型系列循序處理器的記憶空間分programcode/staticdata/ stack&heap三種節段,processes(同一程式段不同資料段)/threads(同一程式段同一資料段)在stack上操作,而在與stack同節段由另一端開始與stack相反方向grow的heap是此類型處理器唯一動態資料可以在processes/threads離開sub-procedure後仍保存的動態記憶節段。當processes/ threads離開sub-procedure後,sub-stack復原到stack上sub-procedure被call前所在處,原先存在return前sub-stack裡的object references跟著釋放不再參照到heap裡的objects。此時,告知objects解除referring是由references所在處做,軟體方式是由compiler將指令片段附加到sub-procedure的return動作,硬體方式是直接將告知動作合併到return硬體指令由processor做。而heap段slots的資料分佈之動態整理配給壓縮或展開可以foke出額外的thread(s)來處理,不管是single pipeline的分時多工還是multiple pipeline的硬體平行多工。除此之外,在記憶體slots間就提供shift通道latch電路以平行化配置回收與整理的動作。未來,在graph machine,stack包含在heap裡,不做為stack machine(P-machine)處理操作用。未來在graph machine還會有類似processes/threads的觀念存在,但它們不再是一段program counter與stack registers的context狀態記載,不再是一組輪流等待被load入工作暫存器(不論是一或多個處理單元的)並在離開context時暫存的values,而是跑在graph circuit switches-network的runners,往來在眾單位ALU與單位MEM(I/O-port與MEM視為相同的slot,一樣可shift一樣可有區域限制)之間。可以思考一下:不具方向性的雙向linkage要怎麼用電路實作?用以取代"雙鏈"。
以往我們對"程式"的觀念是在連續時間依序對一組物質做不同的操作,一方面可以從此一組物質受操作後的反應獲得回饋。VonNeumann computer基本上是一個control FSM與一個REG-ALU-MEM pipeline組成的Bi-cycle雙循環(兩輪轉動)"腳踏車",如果把這個操作的觀點由processor轉移分散到各個operators,讓operators自己當主角,每個operator本身就是ALU + control unit,但operators的control unit比起原來processor的control unit小得非常多。如此,operators為"主動子",operands及sense entities為"被動元",當一段description被送進1顆Neuron Chip的Sense Core時,其內的"匹配神經"(附於開關網路的comparing bus)將輸入的description化解分解為一系列的linkages放到free-shiftable switches bar上,operators一透過這個bar上的linkages"接觸"到其餘的被動元就觸動引起"反應",主動子改變switches-network上的linking state,"結合"被動元成value-flow graphes("結合力"較強的主動子優先進行"結合")。之後,被動元一被主動子"結合",裡頭的values就傾向整個graph沒有values的地方流,運算流藉由此發生,而記載"definition"的sense graph鏈結狀態與values也因而改變。此謂"自動接觸結合反應機制",而operands、operators、sense-entities之間的linkages是動態消長的: 接觸 => 結合 => 反應 => 可能消失。Worst-case: 預料之中,Neuron Chips在可供配置的資源不足的情況下,原本的平行就會暫時變成循序。NeuronChips於1998年我在海軍服役期間構想之初就設定要滿足:當entities或channels不夠用而導致當機時,必須能讓user拼組加裝額外的Neuron Chips即可恢復繼續運作。也就是說,1顆Neuron Chip未匹配分解配置完的description片段會被SenseCore依chips熱接時決定的MSTP(最小展開樹狀路徑)分送出去,繼續完成運算線路的配置。如此,達到"電腦即網路,網路即電腦""平行即分散,分散即平行","電腦網路/網路電腦",整個NEURONS網路(NEURONS電腦)的referring / indexing空間聯為一體。當兩堆運作中的Neuron Chips要熱接時,倘若裡面有兩個以上sense domain的名稱(從root sense以降)相同,必須獲得每個相同domain name的sense entities的認可方能熱接成功,因為不同chips裡擁有相同名稱(從root sense以降)的sense entities將是同一個domain。反之,chips要分離時也必須告知任何於此間有linkage(s)的sense entities,惟在其間所有linkages都被回收或挪到別處後方可分離。
Direct-Symbol-Referring的觀念,是來自1997年上半我一次微積分方程式處理的OOP工作,阿信 在旁的一句"不要用address定址,直接用name指標"激發了我直接用字碼串參照資料結構的靈感。然事實上,自古至今file-system老早就已經在使用symbol-referring了,是我們自己的眼界侷限於traditional programming而忽略了。只是file-system僅僅具備tree的結構,而建於file-system上的database也是一樣,雖然只具備matrixs的結構。至於rulebase一道道的因果式與formula-base一道道的等式不等式,是資料? 是程式? 其實可算是資料也可算是程式,file-system、database、rulebase、formula-base......等等都不過是1組資料結構,用1組複合graphes既可全部滿足,何必讓它們分開? 以往ENIAC-programmer的觀念是以address pointer單方向記錄nodes的linkages,會如此這樣是由於VonNeuman等古人承襲Turing machine在1度線性記憶空間──1條格子段帶上讀出→計算或操作→寫入的觀念把operators(neurons)與operands(synapses)分開獨立於兩個空間其間僅以極少的頻寬相連才在格子裡紀錄跳接格子的偏置量(格數),操作單元記住讀寫頭所在格子裡的value然後根據這個記住的value為count(座標or向量)移動讀寫頭到欲跳接的格子去。畢竟,他們是數學家,並不是電子電路設計的專家,也不是生物腦神經生理的專家。而我會想到要用switches network於object oriented data structures的linkages也是淵源於1997年某一個晚上我在畫UML做OOD時 LEIFONE 在一旁觀看時的一句"好像在畫電路圖喔"激發了我這樣的靈感。如此,任一個單元不但不依賴CPU(分時interrupt其process)而各自隨時直接透過開關網路獲知data-structure狀態(在此架構也沒有所謂的CPU了),還可直接利用enhanced switches network上free-shiftable switches所構成的pathes,以產生cursors放入path的方式自動travel。其traveling的cursors任何時候所駐留單元的資訊當然也是直接透過開關網路上一條跟隨移動的channel主動向需求單元回報,同理,放出cursors的單元也是直接透過這個dynamic-channel與cursors通訊,乃至於回收cursors。
電腦程式自己可以修改自己與電腦程式自己會寫程式
這就是一種左腦人工智慧。而所謂"程式"是指一組運算操作子(神經元細胞)與運算操作元(神經突觸鍵結)間隨網絡資料流變化的非循序離散廣鏈結狀態,不同於當今普及的循序處理器程式是依據程式指標器循序於個別獨立不同時間點指定的運算操作子與運算操作元間狹鏈結狀態。電腦程式具備自我修改撰寫能力意味也具備著自我理解與理解外部程式及資料的能力,而程式與資料其實被SENRON電腦視為相同的事物,無法分割的同一種概念。電腦程式自己可以修改自己與電腦程式自己會寫程式是Project SENSE@NEURONS一個很重要很主要的目的,在基礎結構初始設計就已為滿足此一目的考量程式資料結構的易變更性,於基礎程式資料結構算子算元基底層級就採用動態聯結機制。為具備自我理解與理解外部程式及資料的能力,在基礎結構初始設計就已為滿足此一目的考量程式資料結構的易理解性,對照於當今第四代電腦為方便反編譯而保留到執行時期的編譯時期程式資料定義資訊,但使其更緊密量身訂做地於基礎程式資料結構就予以滿足,SENRON電腦是採用Direct Symbol Referring透過開關網路比對字符產生鏈結狀態與透過開關網路反向由鏈結狀態組合出symbols串成的述句的機制,不同於傳統處理器從數值解碼鏈結狀態的方式,所以不需在數值與字符間編譯反編譯,所有定義資訊跟程式資料結構本身一樣直接由開關網路鏈結狀態記載,只有資料結構末端值才是與傳統處理器一樣記載在運算操作元(神經突觸鍵結)。
From the starting point of software operating system, everything is Sense and all time are runtime.
From the starting point of hardware processor, everything is Neuron and there is only one kind of interface among grid chips.
沒有留言:
張貼留言