專利名稱:消息傳遞處理器的制作方法
技術領域:
一般而言,本發(fā)明涉及計算機處理器。本發(fā)明尤其涉及設計成直接執(zhí)行基于異步π演算的機器代碼地處理器。
背景技術:
π演算提供一種有效地建模松耦合的消息傳遞系統(tǒng)的方法,在該系統(tǒng)中可以動態(tài)地重新組織通信鏈路(例如,當蜂窩電話從一個基站移動到另一個基站時)。在劍橋大學出版社1999年Robin Milner的“Communicating and mobile systemsthe pi-calculus”(通信和移動系統(tǒng)π演算)中具體描述了π演算。最初使用此模型在形式上推理此類系統(tǒng),較近期提議用基于π演算的編程語言來實際地實現系統(tǒng)。并且,原始的π演算是同步模型,其中消息的發(fā)送由接收者確認。已開發(fā)出異步的π演算,其中可發(fā)送消息而無需等待回復(以因特網方式)。
基于π演算方法的形式體系允許以嚴格的方式推理通信系統(tǒng)的行為。例如,可分析兩個并發(fā)的進程來確保它們的通信遵從相同的協(xié)議。用基于π演算的語言編寫的程序具有強加于它們之上的規(guī)則,使得手動或自動的分析比試圖用任意的C#代碼執(zhí)行等效的分析來得更容易。
對于某些人來說,π演算可構成編程語言的基礎是一種極端的想法,但是若干項目已顯示此方法可能具有許多優(yōu)點。目前正在開發(fā)各種基于π演算的編程語言,用于設計和實現松耦合的消息傳遞系統(tǒng),特別是web服務。π演算的一個實際應用包括為web服務分析“合同”。
一種使用基于π演算的編程語言的示例性系統(tǒng)通過在常規(guī)系統(tǒng)軟件(例如,公共語言運行時間(“CLR”)和常規(guī)的處理器架構(例如,Intel的X86處理器)之上執(zhí)行來工作。但是,如果有一種系統(tǒng)架構或處理器可直接執(zhí)行松耦合的消息傳遞程序,那將是合乎需要的。即,要縮小π演算等級的代碼和常規(guī)指令集架構之間的語義差距,有一種直接執(zhí)行基于π演算的程序的消息傳遞處理器系統(tǒng)可能是合乎需要的。
如果將此類系統(tǒng)設計成具有合適的處理器和存儲器架構以確保隨著更多處理器被加入,這些系統(tǒng)可被縮放,那也是合乎需要的。即,如果這樣一個處理器不是通過集中到單個處理引擎中的極度復雜性(如x86架構中的情況),而是通過對許多簡單、小型的處理器的可縮放的部署來實現性能,那么將是尤其合乎需要的?;谒神詈系募軜嫷男⌒吞幚砥魇沟迷谛阅芎湍芰χg權衡變得較為簡單。對于如因特網搜索加速或生物計算等計算復雜的任務,部署數百個處理器可能是合乎需要的。
發(fā)明內容
本文中所描述的發(fā)明提供一種合適的中間編譯技術,用于在常規(guī)處理器上有效地實現基于π演算的程序,并提供新穎的基于π演算原語的指令集架構。已在實際的硬件上設計出并實現了用于π演算的原型處理器。
本發(fā)明提供設計用于在硬件上直接執(zhí)行基于π演算的程序的指令集架構和處理器。盡管本發(fā)明的處理器的示例性實施例可能具有基本的操作系統(tǒng)核心,但是無需編寫代碼來管理多個進程、上下文切換、等等。例如,任務切換可由處理器在硬件中執(zhí)行,且通過使用基于π演算的程序,使得代碼并發(fā)的可能性顯而易見。這也允許代碼在另一個處理器上或甚至在某個遠程位置處運行。
可將此類架構描述成“松耦合的”。即,在不同機器上運行的程序的若干組件可通過傳遞消息來與彼此通信。在常規(guī)處理器的世界中,組件會請求執(zhí)行某個任務,并等待對該請求的回復。在松耦合的架構中,通常沒有控制處理流程的中央處理器。某一處理器僅僅發(fā)送要求執(zhí)行某個功能的消息,并且通常不等待對第一個請求的回復,隨即繼續(xù)執(zhí)行安排它接下來要做的任何事。因此,此類系統(tǒng)是異步的。最終,根據某組規(guī)定的規(guī)則,將由發(fā)送該消息的處理器,或由另一個處理器接收回復。此類架構可能有助于通過提供松耦合的框架,來更好地利用硅片的能力,該框架使得處理器能夠獨立地(因此是并發(fā)地)盡可能多地進行。
但是,在此類松耦合的架構中需要一種理論,以受控制和可預測的方式來調整此類消息傳遞的結果。異步π演算提供這樣一種理論。根據本發(fā)明的處理器集中于異步π演算。在硬件中定義了對應于π演算原語的指令集。同樣,處理器在各線程之間調度其本身,這通常是由軟件實現的功能。例如,可在對直接在FPGA硬件上操作的web服務的設計和實現中使用根據本發(fā)明的處理器系統(tǒng)。
圖1描述了36位存儲器字的示例性實施例。
圖2提供了根據本發(fā)明的處理器架構的示例性實施例的框圖。
圖3描述了來自VHDL仿真器的用戶界面。
圖4描述了來自邏輯分析器的用戶界面。
圖5A和5B分別是典型的現有技術的處理系統(tǒng)和根據本發(fā)明的處理系統(tǒng)的功能性框圖。
圖6所示是可實現本發(fā)明的各個方面的示例性計算環(huán)境的框圖。
具體實施例方式
現在將對直接執(zhí)行基于異步π演算的指令集架構的處理器的一個示例性實施例進行描述。此類處理器通過縮小語言級概念和機器代碼級實現之間的語義差距,提供可用于執(zhí)行用基于異步π演算的語言編寫的程序的引擎。
π演算是一種過程代數,其中通道名稱既可作為傳輸介質,也可作為傳輸數據。因此,π演算可用于對已知為移動系統(tǒng)的自主主體系統(tǒng)進行建模。移動系統(tǒng)是通信網絡的一種形式,其中個體組件以自由地自發(fā)選擇的方式與彼此交互。開發(fā)π演算來對如蜂窩電話網絡、因特網、和面向對象的軟件程序般多樣的并發(fā)計算系統(tǒng)中的交互進行建模。已采納其為由BPMI.org開發(fā)的諸如商務過程建模語言(BPML)和微軟的XLANG(BPEL4WS的先驅)等商務過程規(guī)范的基礎。
異步π演算是不包括用于選擇和給輸出加前綴的顯式算子的π演算的子集?;诋惒溅醒菟愕闹噶罴氖纠詫嵤├幕驹乜砂ㄒ韵?個指令
NEW-動態(tài)創(chuàng)建新的通信通道的指令;
SEND2-異步發(fā)送一對字(直接或者間接)的指令;
RECEIVE2-從通道讀取一對字的指令;
SELECT-聽取一列通道,隨后當在這些通道中的一個上出現數據時執(zhí)行某個動作的指令;
PAR-將新的進程添加到處理器上運行的進程的列表中的指令;
SERVE-產生新的進程來處理通道上剛剛到達的數據值的指令;以及
HALT-停止進程的執(zhí)行的指令。
根據本發(fā)明,可分別定義各個硬件電路來執(zhí)行上述指令中的每一個。根據本發(fā)明的系統(tǒng)可包括這些指令中的一個或多個。因為期望用基于π演算原語的編程語言來編寫軟件,所以可使用對應于π演算原語的硬件指令來管理運行該軟件的機器。因此,在根據本發(fā)明的系統(tǒng)中,可“從頂到底”應用π演算模型。在附錄中提供了用于執(zhí)行這些指令中的每一個的硬件處理器的示例性實施例的硬件定義語言(“HDL”)描述。
選擇雙向的異步發(fā)送,則可通過傳遞“延續(xù)通道”作為第二參數來對同步發(fā)送進行建模。當接收器獲得消息時,它隨即可沿延續(xù)通道向下發(fā)送虛值(dummyvalue)到發(fā)送器來確認接收(即,基本握手協(xié)議)。注意RECEIVE2指令實際上是SELECT指令的退化情況。為效率起見提供RECEIVE2作為原語指令,因為程序通常具有比不確定的選擇多得多的接收。
對這7個指令的使用提供了對任何計算功能的執(zhí)行(即,處理器是“圖靈機完整的”)和對數據類型的建模。但是,為效率起見,較佳的是支持32位的有符號整數作為基本數據類型。通道也可表示為32位的地址。
用異步π演算編寫的程序通常是若干試圖通過各個通道通信或創(chuàng)建新通道的進程的集合。當一個進程通過通道向另一個進程發(fā)送消息時,在發(fā)送該消息期間可能發(fā)生交互。發(fā)送進程可能被刪除(對于異步發(fā)送來說沒有后續(xù)動作),而接收器可用其剛剛接收到的新數據值重新開始執(zhí)行。因此,對程序的執(zhí)行可對應于進程之間的一系列交互。
在較佳的實施例中,可使用能支持36位值的存儲器的FPGA硬件。圖1描述了36位存儲器字的示例性實施例。如圖所示,操作碼(和通道狀態(tài)信息)可存儲在4個最高階的位中(即,在如圖1中所示的最左邊的4個位中)。32位值可存儲在36位字的其余位中(即,最右邊的32位)。
通常,對于大多數指令來說第一個參數將會是通道。通道可由全局存儲器空間中的地址表示。指令集架構不需要用其絕對地址來標識通道。相反,可經由包含絕對通道地址的“變量”來間接地引用通道。例如,可用指定局部變量(即,從當前“??蚣堋?stack frame)起的偏移量)的參數來調用NEW操作碼,其中最近分配的通道的地址應被貯存(deposite)。
SEND2指令也可用同樣方式(即,通過標識??蚣苌习ǖ缹嶋H地址的局部變量)指定通道用于通信。SEND2指令可通過查找局部變量的內容并發(fā)送該內容(例如,通道的絕對地址)來發(fā)送可指定局部變量的間接參數。這允許通過通道來發(fā)送通道,這是π演算的基本特性。SEND2指令還可發(fā)送直接模式(immediatemode)變量。發(fā)送指令的另一種模式允許發(fā)送嵌套范圍內的值。當在如Pascal等語言中使用嵌套過程和函數時,此操作碼類似于NS32016處理器中用于沿著??蚣茏邉拥闹噶?。
SERVE命令可通過在堆(heap)上分配新的任務框架來產生新的進程。此任務框架的第一個字指向封閉的任務框架。
因為用較大類的并發(fā)和分布式應用程序來建立概況可能是合乎需要的,所以可使用已知技術來實現無用信息收集器。由此,在另一個實施例中,現有的??蚣軐⒈豢寺『蛿U展,這使得無用信息收集變得更容易。在這樣一個實施例中,SERVE操作碼可自由地在一個不同的處理器上將所產生的進程實例化。
已編譯的組件的第一個字可包含初始任務框架的地址,第二個字可包含它的大小。這允許運行時間系統(tǒng)計算出堆的初始地址。從而,可在存儲器地址2處開始程序代碼。
有時想要同時監(jiān)聽一個通道集,隨后在數據出現在其中之一上的時候采取適當的行動,并放棄其它監(jiān)聽。此功能可由SELECT指令執(zhí)行,該指令后可跟著一個通道和地址對的列表。處理器可按非指定的順序檢查要監(jiān)聽的通道,當某個通道有了數據的時候,可執(zhí)行對應的代碼。
通過將偏移量添加到PAR和SELECT指令的參數中所指定的絕對地址(以固定的專用通道的地址為模),可將指令集設計成允許可容易地重新分配的機器代碼。指令集架構不需要就如何調度進程或某通道上可容納多少個數據項進行說明。這些考慮事項,包括如公平性等其它考慮事項,可由具體的架構實現來設置。
可將指令集架構設計成適用于基于控制和協(xié)議的應用程序,而不是密集的數字處理應用程序。例如,結合數字密集子組件的一種有效方式是為此功能設計某種專用的硬件,并使用和訪問常規(guī)通道完全相同的通道協(xié)議來與該硬件通信。
應當注意,可將其它指令添加到該指令集而不會偏離本發(fā)明的精神。此類指令的例子包括同步發(fā)送、及一元發(fā)送和接收。但是,應當理解,將這些附加指令包括進來所需的硅面積的增加可能不能證明性能中的些微增益可歸功于將它們包括進來。例如,即使同步發(fā)送可能常見于某些類型的應用程序中,無論如何它們的遠程實現最終退化為某種類型的握手協(xié)議——這是以上所示的基于延續(xù)傳遞的編碼所做的。因此,承受存儲稍大一些的程序(和延續(xù)通道)所需的若干額外字節(jié)的代價、以及局部設置中若干時鐘周期的損失可能是較佳的。
硬件平臺和處理器架構
可在根據本發(fā)明的消息傳遞處理器系統(tǒng)中使用的硬件平臺(或稱“板”)的一個示例性實施例可包括連接到組成多媒體系統(tǒng)的各種資源的現場可編程門陣列(“FPGA”)??砂ㄒ粋€或多個(數十個)根據本發(fā)明設計的處理器的FPGA可連接到多個完全獨立的存儲體(其中每一個存儲體都可以是例如2MB的ZBT存儲器)、視頻輸入/輸出邏輯、音頻輸入/輸出、以太網接口、串行輸入、鍵盤輸入、鼠標輸入、CF接口、及各種轉換開關和LED。
以上就π演算處理器所描述的指令集架構不需要常規(guī)意義的任何寄存器。FPGA架構提供大量雙端口存儲器(例如,在較佳實施例中為56個),其中每一個都可以是例如18K的大小。此類FPGA可用來表示消息傳遞系統(tǒng)中使用的通道,以及用于程序和數據的高速緩存(cache)??山浻晒芾砼c較大存儲器芯片(例如,在較佳實施例中為5個2兆字節(jié)存儲體)的通信的“SDRAM”控制器來訪問主存儲器??捎腥舾蓪S猛ǖ溃峁┡c諸如加法器、乘法器、和用于串行端口通信的UART等硬件資源的連接??赏ㄟ^交換網絡到達另一個處理器所擁有的通道。圖2中示出根據本發(fā)明的處理器架構的示例性實施例的框圖。
用戶程序中的邏輯通道可由雙重(two-tier)分層結構存儲器中的全局地址表示。處理器的一個存儲器端口可通過快速計時接口與本地高速緩存直接通信。另一個端口可與將一個或多個處理器連接到全局存儲器空間中的存儲器“交換開關”通信。但是,這些存儲器之間的接口無須是固定周期的同步接口。正如處理器所支持的底層計算模型,該接口可以是異步發(fā)送請求遠程存儲器位置的內容的存儲器事務(例如,消息)的消息傳遞系統(tǒng)。此類去耦合允許部署可縮放的存儲器架構,而同時保持與為具體處理器包含數據的本地存儲器的高性能鏈路。
32位的地址字可被劃分成標識具體處理器和存儲器組的較高階位和標識在這樣一個組內的位置的較低階位。因此,可通過檢查較高階位來判斷通道是否正在本地環(huán)境中進行通信。當將此架構作為在常規(guī)指令集架構上編譯的跳板使用時,此組織結構可允許優(yōu)化用基于寄存器的操作來取代某些基于通道的計算。
指令集架構的另一個特征是它不需要包括任何算術操作。幾乎所有計算元件都是由諸如加法器和乘法器等外部進程來建模的。這可由以下π演算宏匯編的片段來說明,該片段示出如何將兩數相加并隨后將結果寫到串行端口
2 k1<-new
3 par2(send2(adder,((x,y),k1))
4(do sum<-receive k1
5send uart sum))
此代碼創(chuàng)建新的通道供加法器返回結果(k1)。它隨后并行地執(zhí)行兩個進程。一個進程向專用加法器通道發(fā)送包含要相加的值的兩個通道(x,y),和返回結果的通道(k1)。另一個進程監(jiān)聽通道k1上的結果,隨即將和寫到UART,以供在例如連接到系統(tǒng)的RS232端口的設備上顯示。
應當理解,此類基于通道的操作可轉換為常規(guī)的x86或基于RISC的ADD(加)操作,以在常規(guī)處理器中執(zhí)行。通過將此類指令外部化,就有了小得多的指令集,這導致更緊湊的處理器,它進而允許在給定的芯片區(qū)域中實現多得多的此類處理器。
根據本發(fā)明的基本π演算處理器的示例性單處理器實施例可包括多達592個邏輯單元、308個觸發(fā)器、和代表大約3%可用邏輯資源的中等規(guī)模的FPGA(例如,XC2V2000)的3個18K雙端口存儲器塊。這不包括通常由一個以上處理器共享的供SDRAM控制器用的資源。
已將該示例性實施例的原型設計和構造成在少于10納秒之內執(zhí)行每個時鐘周期,這提供了100兆赫茲的操作頻率。盡管比起諸如Intel的“PENTIUM”處理器等許多公知處理器來說這是顯然較低的操作頻率,但是可通過增加簡單處理器的個數來提高性能,而不是使一個處理器非常復雜。此外應當理解,FPGA的原型設計的技術通常要比定制硅實現慢一個數量級。由此,應當理解,根據本發(fā)明的處理器在例如90nm CMOS硅處理器上的執(zhí)行速度應在1G赫茲以上。
可使用交換矩陣,將多個π演算處理器在通信上耦合到一起。預期在當前可用的最大FPGA上,可將多達100個π演算處理器耦合到一起。
根據本發(fā)明的處理器系統(tǒng)的一個示例性實施例可包括宏匯編器、反匯編器、和用于為處理器初始化引導存儲器的代碼生成器。在原型設計環(huán)境中,處理器本身的實現可以是VHDL代碼的形式,可用公知的工具將該代碼合成為邏輯網表(netlist)。
可將宏匯編器設計成插入到π演算程序編譯器的后端中。還可將基于π演算的程序直接寫入宏匯編器中。例如,以下匯編程序片段在異步π演算框架中編碼了兩個消息的同步發(fā)送
6 prog
7 =do chanl<-new
8 k1<-new
9 k2<-new
10par[send_imm2 chanl(5,k1),
11 do_<-receive k1
12 send_imm2 chanl(7,k2),
13 do_<-receive k2
14 halt,
15 serve chanl.
16 (\(v,k)->.
17 par2(send_ind write_chan v).
18 (send_imm k0)).
19 ].
此程序創(chuàng)建一個通信通道和兩個延續(xù)通道,隨后并行地執(zhí)行以下操作a)向chanl發(fā)送包含值5和延續(xù)k1的對,b)等待延續(xù)k1上的響應,隨后向chanl發(fā)送包含值7和延續(xù)k2的對,c)等待延續(xù)k2上的響應,隨后刪除該進程,以及d)等待chanl上的通信,每次接收到某個數據時,派生一個單獨的進程來處理該數據(在此例中為通過寫到專用通道FFEE來寫某個輸出)。
此程序可編譯成以下匯編代碼
20 00000002NEW 0.
21 00000003NEW 1.
22 00000004NEW 2.
23 00000005PAR 00000009.
24 00000006SEND2 (0)#5(1).
25 00000009PAR 0000000F.
26 0000000ARECEIVE2(1)3.
27 0000000CSEND2 (0)#7(2).
28 0000000FPAR 00000013.
29 00000010RECEIVE2(2)5.
30 00000012HALT.
31 00000013SERVE(0)3.
32 00000015PAR 00000019.
33 00000016SEND2(65518)(1)(1).
34 00000019SEND2(2)#0(0).
35
36 FRAME_BASE at 0000001C.
37 FRAME size=00000007.
38 HEAP_PTR=00000023.
盡管該處理器可能具有基本的操作系統(tǒng)核心,但可能沒有必要編寫代碼來管理多個進程、上下文切換、等等。這些任務可由處理器執(zhí)行。通過使用PAR和SERVE操作碼,可使代碼并發(fā)的可能性顯而易見。該系統(tǒng)因而可自由地在任何給定處理器上或甚至在遠程位置處運行代碼。
可將所生成的匯編代碼轉換成處理器的引導存儲器用的初始化信息,并可用顯示這些指令在800納秒內完成的VHDL仿真器(見圖3)確定對此程序精確到時鐘周期的執(zhí)行。已使用實驗的設置,在上述的實際硬件上執(zhí)行已編譯的π演算程序,并通過閃光的發(fā)光二極管、超級終端等來監(jiān)視它們的進度,或通過使用邏輯分析器(見圖4)來檢查內部狀態(tài)。
圖5A和5B分別是典型的現有技術的處理系統(tǒng)10和根據本發(fā)明的處理器系統(tǒng)20的功能性框圖。如圖5A中所示,多個處理器11可被耦合到通信通路12(例如,可以是總線)。每個處理器11都可包括控制單元13、數據寄存器14、和算術邏輯單元(ALU)15。控制單元13進行指令的執(zhí)行。數據寄存器14包含受控制單元操縱的數據。ALU 15執(zhí)行加法和減法、邏輯操作、屏蔽、和移位(乘法和除法)。隨機存取存儲器(“RAM”)16也被耦合到通信通路12。各處理器11可訪問(即,讀和寫)RAM 16。各處理器共享對RAM的訪問。每個處理器都順序執(zhí)行一組程序指令,并在需要時訪問其自帶的ALU和數據寄存器、及共享的存儲器。
如圖5B中所示,多個指令處理器21可被耦合到通信通路22。RAM 26、ALU服務25、端口27也可被耦合到通信通路22。處理器21共享到ALU服務和RAM的訪問。處理器21還共享端口27。在根據本發(fā)明的系統(tǒng)20中,可經由通過網絡傳遞的消息來執(zhí)行程序。例如,指令處理器21可接收包括指令流的消息。指令處理器21可作用于該指令流,并且在該過程中可訪問共享RAM 26、共享ALU服務25、和共享端口27。指令處理器可從端口讀出數據,或將數據放到端口上??赏ㄟ^簡單地向通信網絡添加更多的指令處理器21來縮放這種系統(tǒng)。
示例性計算環(huán)境
圖6示出了可實現本發(fā)明的合適的計算系統(tǒng)環(huán)境100的示例。計算系統(tǒng)環(huán)境100僅為合適的計算環(huán)境的一個例子,并不試圖對本發(fā)明的使用或功能的范圍提出任何限制。也不應將計算環(huán)境100解釋成具有涉及示例性操作環(huán)境100中所示的各組件中的任何一個或其任何組合的依賴性或要求。
本發(fā)明可用于許多其它通用或專用計算系統(tǒng)環(huán)境或配置。適用于本發(fā)明的公知的計算系統(tǒng)、環(huán)境、和/或配置的例子包括,但不限于,個人計算機、服務器計算機、手持式或膝上設備、多處理器系統(tǒng)、基于微處理器的系統(tǒng)、機頂盒、可編程消費者電子設備、網絡PC、微型計算機、大型計算機、包括任何上述系統(tǒng)或設備的分布式計算環(huán)境、等等。
可以在由計算機執(zhí)行的諸如程序模塊等計算機可執(zhí)行指令的通用環(huán)境中描述本發(fā)明。一般而言,程序模塊包括執(zhí)行特定任務或實現特定抽象數據類型的例程、程序、對象、組件、數據結構等等。本發(fā)明還可在分布式計算環(huán)境中實施,其中任務由通過通信網絡或其它數據傳輸介質連接的遠程處理設備執(zhí)行。在分布式計算環(huán)境中,程序模塊和其它數據可位于包括記憶存儲設備的本地和遠程計算機存儲介質兩者之中。
參考圖6,用于實現本發(fā)明的示例性系統(tǒng)包括計算機110形式的通用計算設備。計算機110的組件可包括,但不限于,處理單元120、系統(tǒng)存儲器130、以及將包括系統(tǒng)存儲器在內的各種系統(tǒng)組件耦合到處理單元120的系統(tǒng)總線121。系統(tǒng)總線121可以是若干類型總線結構的任意一種種,包括存儲器總線或存儲器控制器、外圍總線、及使用各種總線體系結構中的任何一種的局部總線。作為示例,而非限制,此類體系結構包括工業(yè)標準體系結構(ISA)總線、微通道體系結構(MSA)總線、增強ISA(EISA)總線、視頻電子技術標準協(xié)會(VESA)局部總線、外圍部件互聯(PCI)總線(也稱Mezzanine總線)。
計算機110通常包括各種計算機可讀介質。計算機可讀介質可以是可由計算機110訪問的任何可用介質,包括易失性和非易失性介質,可移動和不可移動介質。作為示例而非限制,計算機可讀介質可包括計算機存儲介質和通信介質。計算機存儲介質包括以任何方法或技術實現的用于存儲諸如計算機可讀指令、數據結構、程序模塊或其它數據等信息的易失性和非易失性,可移動和不可移動介質。計算機存儲介質包括,但不限于,RAM、ROM、EEPROM、閃存或其它存儲器技術、CD-ROM、數字多功能盤(DVD)或其它光盤存儲、磁帶盒、磁帶、磁盤存儲或其它磁存儲設備、或可用于存儲所需信息并可由計算機110訪問的任何其它介質。通信介質通常具體化為諸如載波或其它傳輸機制等已調制數據信號中的計算機可讀指令、數據結構、程序模塊或其它數據,并包括任何信息傳送介質。術語“已調制數據信號”指以在信號中將信息編碼的方式設置或改變其一個或多個特征的信號。作為例子而非限制,通信介質包括諸如有線網絡或直線連接等有線介質,及諸如聲學、RF、紅外及其它無線介質等無線介質。上面的任意組合也應被包括在計算機可讀介質的范疇內。
系統(tǒng)存儲器130包括諸如ROM 131和RAM 132等易失性和/或非易失性存儲器形式的計算機存儲介質。包含例如在啟動期間在計算機110內部各元件間傳送信息的基本例程的基本輸入輸出系統(tǒng)133(BIOS)通常存儲在ROM 131中。RAM 132通常包含可由處理單元120立即訪問和/或當前正在操作的數據和/或程序模塊。作為示例而非限制,圖6示出了操作系統(tǒng)134、應用程序135、其它程序模塊136及程序數據137。
計算機110還可包括其它可移動/不可移動,易失性/非易失性計算機存儲介質。僅僅作為例子,圖6示出讀或寫不可移動、非易失性磁介質的磁盤驅動器141、讀或寫可移動、非易失性磁盤152的磁盤驅動器151、以及讀或寫諸如CD-ROM或其它光介質等可移動、非易失性光盤156的光盤驅動器155??稍谑纠圆僮鳝h(huán)境中使用的其它可移動/不可移動、易失性/非易失性計算機存儲介質包括,但不限于,磁帶盒、閃存卡、數字多功能盤、數字錄像帶、固態(tài)RAM、固態(tài)ROM等等。硬盤驅動器141通常通過諸如接口140等不可移動存儲器接口連到系統(tǒng)總線121,磁盤驅動器151和光盤驅動器155通常通過諸如接口150等可移動存儲器接口連到系統(tǒng)總線121。
各驅動器及其相關聯的計算機存儲介質為計算機110提供了計算機可讀指令、數據結構、程序模塊及其它數據的存儲。例如,在圖6中,硬盤驅動器141被示為存儲操作系統(tǒng)144、應用程序145、其它程序模塊146和程序數據147。注意,這些組件可以和操作系統(tǒng)134、應用程序135、其它程序模塊136和程序數據137相同或者相異。此處給操作系統(tǒng)144、應用程序145、其它程序模塊146和程序數據147不同的標號,以說明至少它們是不同的副本。用戶可通過諸如鍵盤162和定位設備161(通常指鼠標、跟蹤球或觸摸墊)等輸入設備將命令和信息輸入到計算機110中。其它輸入設備(未示出)可包括話筒、操縱桿、游戲墊、圓盤式衛(wèi)星天線、掃描儀等等。這些及其它設備常通過耦合到系統(tǒng)總線的用戶輸入接口160連到處理單元120,但也可由諸如并行端口、游戲端口或通用串行總線(USB)等其它接口和總線結構連接。監(jiān)視器191或其它類型的顯示設備也經由諸如視頻接口190等接口連到系統(tǒng)總線121。除了監(jiān)視器之外,計算機還可包括可通過輸出外圍接口195連接的其它外圍輸出設備,諸如揚聲器197和打印機196等。
計算機110可用到諸如遠程計算機180等一個或多個遠程計算機的邏輯連接在聯網環(huán)境中運行。遠程計算機180可以是個人計算機、服務器、路由器、網絡PC、對等設備或其它公共網絡節(jié)點,且通常包括以上相對于計算機110所描述的許多或全部元件,盡管在圖6中僅示出記憶存儲設備181。所示邏輯連接包括LAN 171和WAN 173,但也可包括其它網絡。此類網絡環(huán)境常見于辦公室、企業(yè)范圍計算機網絡、內聯網和因特網。
當用于LAN網絡環(huán)境時,計算機110通過網絡接口或適配器170連到LAN171。當用于WAN網絡環(huán)境時,計算機110通常包括調制解調器172或其它通過諸如因特網等WAN 173建立通信的裝置??梢允莾戎没蛲庵玫恼{制解調器172可經由用戶輸入接口160或其它適當的機制連到系統(tǒng)總線121。在聯網環(huán)境中,相對于計算機110描繪的程序模塊或其部分可存儲于遠程記憶存儲設備中。作為示例而非限制,圖6示出遠程應用程序185駐留在存儲器設備181上。應當理解,所示網絡連接是示例性的,且可使用在計算機之間建立通信鏈路的其它裝置。
如上文所提及的,盡管是就各種計算設備描述了本發(fā)明的示例性實施例,但是基礎的概念可適用于任何計算設備或系統(tǒng)。
可結合硬件或軟件、或在適當處就兩者的組合來實現本文中所述的各種技術。因此,本發(fā)明的方法和裝置或其某些方面可表現為在諸如軟盤、CD-ROM、硬盤驅動器、或任何其它機器可讀存儲介質等有形介質中具體化的程序代碼(即,指令),其中,當諸如計算機等機器加載并執(zhí)行程序代碼時,該機器成為實施本發(fā)明的裝置。在程序代碼在可編程計算機上執(zhí)行的情形中,計算設備一般包括處理器、處理器可讀的存儲介質(包括易失性和非易失性存儲器和/或存儲元件)、至少一個輸入設備、和至少一個輸出設備。如果合乎需要,可用匯編或機器語言實現各個程序。無論在何種情況下,該語言可以是編譯或解釋語言,并可與硬件實現結合。
本發(fā)明的方法和裝置還可經由具體化為諸如通過電線連線或電纜連線、通過光纖、或經由任何其它的傳輸形式等通過某種傳輸介質傳輸的程序代碼形式的通信來實施,其中,當由諸如EPROM、門陣列、可編程邏輯設備(PLD)、客戶計算機等機器接收、加載和執(zhí)行該程序代碼時,該機器成為實施本發(fā)明的裝置。當在通用處理器上實現該程序代碼時,它與處理器結合以提供一種用于調用本發(fā)明的功能的獨特裝置。此外,結合本發(fā)明使用的任何存儲技術可以總是硬件和軟件的組合。
由此,已描述了設計成直接執(zhí)行基于異步π演算的機器代碼的硬件處理器。盡管是結合各附圖中所描述的某些較佳的實施例來描述本發(fā)明,應當理解,可以使用其它類似的實施例,并可為實施本發(fā)明而對所描述的實施例作修改或添加,而不會偏離本發(fā)明。因此,不應將本發(fā)明限制于任何單獨的實施例,相反,應根據所附權利要求書的廣度和范圍來解釋本發(fā)明。
例如,應當理解,FPGA提供了“虛擬硬件”(即,在運行時間將硬件動態(tài)地交換進和交換出芯片)的潛在可能。盡管有許多開發(fā)此能力的手工嘗試,但還沒有令人滿意的動態(tài)重新配置的模型??裳芯恐T如π演算等的移動過程代數的適用性,用于對此類系統(tǒng)進行建模??煽刂频目芍匦屡渲玫募夹g對于能動態(tài)地決定哪些操作需要硬件加速的未來操作系統(tǒng)來說可能非常有用。
另一個近期的技術革新是超高速串行鏈路的使用。如今硅片可訪問多個10GB的串行收發(fā)器,這可用來實現芯片間的、板級的、及以上的高速通信。利用此能力很可能需要為松耦合系統(tǒng)協(xié)議進行仔細的設計和實現。
此外,應當理解,在上述的示例性體系結構中,如果第一個消息已經在該通道等待,則第二個消息可能不被發(fā)送(即,放到通道中)。相反,它可能需要等待,直到第一個消息被移除。由此,一些人可認為上述的示例性架構在最純粹的意義上不是“異步的”,諸如在接收命令有超時但發(fā)送命令沒有的地方,以及當發(fā)送命令張貼一個消息而發(fā)送器對此一無所知的時候,等等。應當理解,將這樣一個“準異步”架構改變成同步架構(例如,發(fā)送者張貼一個消息,接收者執(zhí)行一個功能,且發(fā)送者得回該功能的回答)是直接的。同步架構可能更易于用代碼實現,因此,在某些應用中可能比異步架構更為有用。
附錄
此附錄包括對于用于執(zhí)行基于異步π演算原語的指令的硬件處理器的示例性實施例的硬件定義語言(“HDL”)描述。應當理解,本文中所提供的HDL描述僅僅是示例,任何數量的硬件定義都可以描述執(zhí)行基于異步π演算原語的指令的處理器。
library ieee; use ieee.std_logic_1164.all; use work.hwprocl_package.all; entity memory_block is port(signal doout word36; signal addrin memory_block_address; signal clkin std_logic; signal diin word36; en,wein std_logic); end entity memory_block; library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; library unisim; use unisim.vcomponents.all; architecture memory_organization of memory_block is signal ssrstd_logic=′0′; signal addr_vecstd_logic_vector(8 downto 0); signal di_vec,do_vecstd_logic_vector(31 downto 0); signal dip_vec,dop_vecstd_logic_vector(3 downto 0); begin block_ramramb16_s36 port map(do=>do_vec,dop=>dop_vec, addr=>addr_vec,clk=>clk,<!-- SIPO <DP n="14"> --><dp n="d14"/>di=>di_vec,dip=>dip_vec,en=>en,ssr=>ssr,we=>we);addr_vec<=conv_std_logic_vector(addr,9);di_vec<=conv_std_logic_vector(di.val,32);dip_vec<=conv_std_logic_vector(di.tag,4);do.val<=conv_integer(do_vec);do.tag<=conv_integer(dop_vec);end architecture memory_organization;package debug_package isprocedure trace(messagein string);end package debug_package;package body debug_package isprocedure trace(messagein string)isbeginreport message;end procedure trace;end package body debug_package;<!-- SIPO <DP n="15"> --><dp n="d15"/>library ieee;use ieee.std_logic_1164.all;use work.hwprocl_package.all;entity hwprocl isport(signal clk,rstin std_logic;sigual led1,led2out std_logic;signal ram_outout word36);end entity hwprocl;<!-- SIPO <DP n="16"> --><dp n="d16"/>library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;use work.debug_package.all;use work.memory_package.all;use work.task_memory_Package.all;architecture behavioural of hwprocl isconstant nr_task_slotsnatural=8;--最大值是512signal block1_out,block1_inword36=(0,0);signal addr,pcmemory_block_address=0;signal en,westd_logic=′0′;signal task_addr_out,task_addr_innatural=0;signal task_frame_in,task_frame_outnatural=0;signal task_idmemory_block_address=0;signal task_en,task_westd_logic;signal frame_base,frame_size,heap_ptrmemory_block_address=0;signal arg1,arg2,arg3natural=0;type states is(first_cycle,second_cycle,read_frame_base,read_frame_size,new_task,new_task1,new2,find_task,find_task0,exec,readout_program,fetch_next_instr,--SEND_IMM狀態(tài)send_cycle2,send_cycle3,send_cycle4,send_cycle5,send_cycle6,send_cycle7,send_cycle8,send_cycle8b,send_cycle9,send_cycle10,<!-- SIPO <DP n="17"> --><dp n="d17"/>--PAR狀態(tài)par_cycle2,par_cycle3,find_free_slot,finish_par,read_slot,--RECEIVE狀態(tài)recv,recv2,recv2a,recv2b,recv3a,recv3,recv4,recv5);signal statestates=first_cycle;signal after_resetboolean=false;beginblock1memory_block port map(do=>block1_out,addr=>addr,clk=>clk,di=>block1_in,en=>en,we=>we);task_listtask_memory_block port map(task_addr_out=>task_addr_out,task_frame_out=>task_frame_out,addr=>task_id,clk=>clk,task_addr_in=>task_addr_in,task_frame_in=>task_frame_in,en=>task_en,we=>task_we);top_level_controlprocess(clk,rst)variable led1_value,led2_valuestd_logic=′0′;begin<!-- SIPO <DP n="18"> --><dp n="d18"/>if rst′event and rst=′0′thenafter reset<=true;end if;if clk′event and clk=′1′and after reset thencase state iswhen first_cycle=>--此上電模式確保存儲器單元具有正確的控制信號en<=′1′;--啟用主存儲器we<=′0′;--啟用存儲器的讀模式task_en<=′1′;--啟用任務存儲器task_we<=′0′;addr<=0;state<=second_cycle;when second_cycle=>addr<=addr+1;state<=read_frame_base;--準備要被寫的任務存儲器task_id<=0;when read_frame_base=>--捕捉FRAME BASE寄存器值frame_base<=block1_out.val;--設置要執(zhí)行的第一個任務IDtask_we<=′1′;task_addr_in<=2;--開始ADDRtask_frame_in<=block1_out.val;--TFstate<=read_frame_size;when read_frame_size=>frame_size<=block1_out.val;heap_ptr<=frame_base+block1_out.val;--將任務存儲器置成讀模式--以搜索第一個任務task_we<=′0′;state<=find_task;<!-- SIPO <DP n="19"> --><dp n="d19"/>when find_task=>state<=find_task0;when find_task0=>if task_frame_out=0 then--這是空的任務槽task_id<=(task_id+1)mod nr_task_slots;state<=find_task;else--找到可運行的任務trace(″>>>Found task at slot″& natural′image(task_id)&″pc=″&natural′image(task_addr_out)&″frame_base=″& natural′image(task_frame_out));pc<=task_addr_out;addr<=task_addr_out;frame_base<=task_frame_out;en<=′1′;we<=′0′;state<=fetch_next_instr;end if;when new_task=>--任務id包含下一個要運行的任務的ID--讀任務地址和框架基址task_we<=′0′;state<=new_task1;when new_task1=>--捕捉任務基地址和任務框架基址pc<=task_addr_out;addr<=task_addr_out;frame_base<=task_frame_out;state<=fetch_next_instr;-------------------------------------------------------發(fā)送直接操作碼<!-- SIPO <DP n="20"> --><dp n="d20"/>--------------------------------------------------------Cycle 1(周期1)操作碼、通道ID可用-- 準備讀通道地址--Cycle 2(周期2)通道地址可用,準備讀內容--Cycle 3(周期3)如果通道滿則阻塞,否則準備寫直接參數。--Cycle 4(周期4)直接參數可用,準備將直接參數寫到通道中的第一個槽。--準備讀間接參數以及準備從任務列表刪除此進程。--Cycle 5(周期5)間接參數可用,因此準備將此寫到通道中的第二個槽。--Cycle 6(周期6)間接參數的寫操作完成,開始尋找另一個要運行的進程。--注意考慮合并周期5和6when send_cycle2=>--周期2--準備地址以讀取通道的地址state<=send_cycle3;--將通道地址移到地址總線以讀取其內容when send_cycle3=>--周期3trace(″Channel address is″& natural′image(block1_out.val));arg1<=block1_out.val;addr<=block1_out.val;state<=send_cycle4;--讀取通道的內容when send_cycle4=>--周期4trace(″Channel word1 tag=″& nibble′image(block1_out.tag)&″val=″& natural′image(block1_out.val));--讀取通道val的內容以獲取通道地址<!-- SIPO <DP n="21"> --><dp n="d21"/>if block1_out.tag mod 2=0 thentrace(″Channel is empty.″);--取回直接參數addr<=pc+1;state<=send_cycle5;elsetrace(″Channel is full so SEND blocked.″);task_id<=(task_id+1)mod nr_task_slots;state<=find_task;end if;when send_cycle5=>--等待讀取直接參數addr<=addr+1;state<=send_cycle6;when send_cycle6=>--取回間接的第三參數trace(″SEND_IMM immediate argument is″& natural′image(block1_out.val));arg2<=block1_out.val;state<=send_cycle7;when send_cycle7=>trace(″Indirect argument is″& natural′image(block1_out.val)&″channelvar address″& natural′image(block1_out.val+frame_base));--讀取通道值以發(fā)送addr<=block1_out.val+frame_base;state<=send_cycle8;--刪除此進程task_frame_in<=0;when send_cycle8=><!-- SIPO <DP n="22"> --><dp n="d22"/>--讀取間接參數的值state<=send_cycle8b;when send_cycle8b=>trace(″Indirect value to send is″& natural′image(block1_out.val));--刪除此進程task we<=′1′;arg3<=block1_out.val;--執(zhí)行發(fā)送we<=′1′;addr<=arg1;block1_in.tag<=1;block1_in.val<=arg2;state<=send_cycle9;when send_cycle9=>task_we<=′0′;--寫間接參數addr<=addr+1;block1_in.tag<=0;block1_in.val<=arg3;state<=send_cycle10;--開始尋找另一個任務來運行when send_cycle10=>we<=′0′;task_id<=(task_id+1)mod nr_task_slots;state<=find_task;-----------------------------------------------------------------------PAR操作碼狀態(tài)---------------------------------------------------------------------when par_cycle2=><!-- SIPO <DP n="23"> --><dp n="d23"/>task_we<=′0′;state<=par_cycle3;task_id<=0;when par_cycle3=>--在槽0處讀任務數據state<=find_free_slot;when find_free_slot=>if task_frame_out=0 then-這是空槽所以使用它race(″Found free slot for PAR at″& natural′image(task_id));--為新進程建一個條目task_we<=′1′;task_frame_in<=frame_base;task_addr_in<=arg1;state<=finish_par;addr<=arg1;pc<=arg1;--繼續(xù)運行PAR的進程elsetrace(″Slot″& natural′image(task_id)&″contains addr″&natural′image(task_addr_out)&″frame″& natural′image(task_frame_out));task_id<=(task_id+1)mod nr_task_slots;state<=read_slot;end if;when read_slot=>state<=find_free_slot;when finish_par=>--周期3--將處理器設置成繼續(xù)在由PAR指令參數指定的地址執(zhí)行task_we<=′0′;state<=fetch_next_instr;<!-- SIPO <DP n="24"> --><dp n="d24"/>---------------------------------------------------------------------------RECEIVE操作碼狀態(tài)-------------------------------------------------------------------------when recv=>--周期2trace(″RECEIVE2 Cycle 2addres of channel var is″& natural′image(block1_out.val+frame_base));--block1_out.val包含通道val的地址--現在讀取該通道地址addr<=block1_out.val+frame_base;state<=recv2a;when recv2a=>trace(″Channel absolute value is″& natural′image(block1_out.val));--浮動(float)該通道的地址addr<=block1_out.val;state<=recv2b;when recv2b=>--讀該通道state<=recv2;when recv2=>--周期3trace(″RECEIVE2channel tag is″& natural′image(block1_out.tag));if block1_out.tag=0 then-沒有數據可用因此阻塞trace(″RECEIVE2 blocked.″);task_id<=(task_id+1)mod nr_task_slots;state<=find_task;elsetrace(″$$$Read value 1″& natural′image(block1_out.val));--取數據arg1<=block1_out.val;addr<=addr+1;<!-- SIPO <DP n="25"> --><dp n="d25"/>state<=recv3a;end if;when recv3a=>--讀周期state<=recv3;when recv3=>trace(″$$$Read value 2″& natural′image(block1_out.val));arg2<=block1_out.val;--現在寫數據addr<=pc+1;state<=recv4;when recv4=>we<=′1′;block1_in.tag<=0;block1_in.val<=arg1;addr<=block1_out.val+frame_base;state<=recv5;when recv5=>block1_in.val<=arg2;addr<=addr+1;we<=′0′;pc<=pc+1;-----------------------------------------------------------------------讀出操作碼和arg1以為執(zhí)行模式作好準備---------------------------------------------------------------------when fetch_next_instr=>state<=exec;-----------------------------------------------------------------------執(zhí)行取回的指令+arg1<!-- SIPO <DP n="26"> --><dp n="d26"/>--------------------------------------------------------------------------when exec=>--對主存儲器的輸出上的操作碼進行解碼trace(″exec addr″& natural′image(addr)&″with block1_out.tag=″&nibble′image(block1_out.tag));case block1_out.tag iswhen 1=>--SEND直接指令trace(″===SEND_IMM″& natural′image(block1_out.val)&″var at″& natural′image(block1_out.val+frame_base));trace(″Channel variable address is″& natural′image(block1_out.val+frame_base));addr<=block1_out.val+frame_base;--檢查通道的狀態(tài)state<=send_cycle2;when 4=>--PAR指令trace(″===PAR″& natural′image(block1_out.val));arg1<=block1_out.val;--記錄要加的進程地址--在任務表中為此線程更新PCtask_we<=′1′;task_addr_in<=pc+1;task_frame_in<=frame_base;--開始尋找空的任務槽state<=par_cycle2;when 6=>--NEW指令--將堆位置寫到本地vartrace(″===NEW″& natural′image(block1_out.val)&″var at″&natural′image(block1_out.val+frama_base));addr<=block1_out.val+frame_base;block1_in.val<=heap_ptr;--遞增程序計數器task_we<=′1′;task_addr_in<=pc+1;task_frame_in<=frame_base;<!-- SIPO <DP n="27"> --><dp n="d27"/>--分配通道heap_ptr<=heap_ptr+2;state<=new2;when 11=>--RECEIVE指令--查看通道上數據是否可用trace(″===RECEIVE2″& natural′image(block1_out.val)&″chanvar at″& natural′image(block1_out.val+frame_base));addr<=block1_out.val+frame_base;we<=′0′;state<=recv;when others=>en<=′1′;we<=′0′;state<=readout_program;end case;--------------------------------------------------------------NEW操作碼------------------------------------------------------------when new2=>--換出主存儲器寫模式并執(zhí)行下一個指令we<=′0′;--取回下一個指令task_we<=′0′;pc<=pc+1;addr<=pc+1;state<=fetch_next_instr;----------------------------------------------------------------------轉儲程序并閃動發(fā)光二極管--------------------------------------------------------------------when readout_program=>if en=′1′then<!-- SIPO <DP n="28"> --><dp n="d28"/>if we=′1′thenblock1_in.tag<=0;block1_in.val<=pc;--we<=′0′;elseram_out<=block1_out;--we<=′1′;pc<=(pc+1)mod 512;addr<=(pc+1)mod 512;end if;end if;led1_value=not led1_value;led2_value=not led2_value;led1<=led1_value;led2<=led2_value;end case;end if;end process;end architecture behavioural;library ieee;use ieee.std_logic 1164.all;package hwprocl_package issubtype nibble is integer range 0 to 15;type word36 isrecordtagnibble;<!-- SIPO <DP n="29"> --><dp n="d29"/>valnatural;end record;subtype memory_block_address is natural range 0 to 511;constant num_processorspositive=8;type control is(request,grant,no_grant,word2);type ext_chans is array(1 to num_processors-1)of word36;component hwprocl isport(signal clk,rstin std_logic;signal led1,led2out std_logic;signal ram_outout word36);end component hwprocl;end package hwprocl_package;<!-- SIPO <DP n="30"> --><dp n="d30"/>library ieee;use ieee.std_logic_1164.all;use work.hwprocl_package.all;entity memory_block isport(signal doout word36;signal addrin memory_block_address;signal clkin std_logic;signal diin word36;en,wein std_logic);end entity memory_block;<!-- SIPO <DP n="31"> --><dp n="d31"/>library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;library unisim;use unisim.vcomponents.all;architecture memory_organization of memory_block issignal ssrstd_logic=′0′;signal addr_vecstd_logic_vector(8 downto 0);signal di_vec,do_vecstd_logic_vector(31 downto 0);signal dip_vec,dop_vecstd_logic_vector(3 downto 0);beginblock_ramramb16_s36generic map(init_00=>X″00000001000000FE00000000000000080000000100000000000000040000000B″,init_01=>X″0000000000000000000000000000000000000000000000000000000200000000″,initp_00=>X″0000000000000000000000000000000000000000000000000000090B00146600″,srval=>X″0″)port map(do=>do_vec,dop=>dop_vec,addr=>addr_vec,clk=>clk,di=>di_vec,dip=>dip_vec,en=>en,ssr=>ssr,we=>we);addr_vec<=conv_std_logic_vector(addr,9);di vec<=conv_std_logic_vector(di.val,32);dip_vec<=conv_std_logic_vector(di.tag,4);do.val<=conv_integer(do_vec);do.tag<=conv_integer(dop_vec);<!-- SIPO <DP n="32"> --><dp n="d32"/>end architecture memory_organization;<!-- SIPO <DP n="33"> --><dp n="d33"/>library ieee;use ieee.std_logic_1164.all;use work.hwprocl_package.all;package memory_package iscomponent memory_block isport(signal doout word36;signal addrin memory_block_address;signal clkin std_logic;signal diin word36;en,wein std_logic);end component memory_block;end package memory_package;<!-- SIPO <DP n="34"> --><dp n="d34"/>package debug_package isprocedure trace(messagein string);end package debug_Package;package body debug_Package isprocedure trace(messagein string)isbeginnull;end procedure trace;end package body debug_Package;<!-- SIPO <DP n="35"> --><dp n="d35"/>entity sim_hwprocl isend entity sim_hwprocl;library ieee;use ieee.std_logic_1164.all;use work.hwprocl_package.all;architecture simulation of sim_hwprocl issignal clk,rst,led1,led2std_logic;beginhwprocl_lhwprocl port map(clk,rst,led1,led2);clockingprocessbeginrst<=′1′;wait for 10 ns;rst<=′0′;loopclk<=′0′;wait for 10 ns;clk<=′1′;wait for 10 ns;end loop;end process clocking;end architecture simulation;<!-- SIPO <DP n="36"> --><dp n="d36"/>library ieee;use ieee.std_logic_1164.all;use work.hwprocl_package.all;entity task_memory_block isport(signal task_addr_out,task_frame_outout natural;signal addrin memory_block_address;signal clkin std_logic;signal task_addr_in,task_frame_inin natural;en,wein std_logic);end entity task_memory_block;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;library unisim;use unisim.vcomponents.all;architecture memory_organization of task_memory_block issignal ssrstd_logic=′0′;signal addr_vecstd_logic_vector(8 downto 0);signal task addr_in_vec,task_addr_out_vecstd_logic_vector(31 downto 0);signal task_frame_in_vec,task_frame_out_vecstd_logic_vector(31 downto 0);signal zero4std_logic_vector(3 downto 0);beginzero4<=(others=>′0′);task_addr_memramb16_s36port map(do=>task_addr_out_vec,addr=>addr_vec,clk=>clk,di=>task_addr_in_vec,dip=>zero4,en=>en,ssr=>ssr,we=>we);<!-- SIPO <DP n="37"> --><dp n="d37"/>task_frame_memramb16_s36port map(do=>task_frame_out_vec,addr=>addr_vec,clk=>clk,di=>task_frame_in_vec,dip=>zero4,en=>en,ssr=>ssr,we=>we);addr_vec<=conv_std_logic_vector(addr,9);task_addr_in_vec<=conv_std_logic_vector(task_addr_in,32);task_frame_in_vec<=conv_std_logic_vector(task_frame_in,32);task_addr_out<=conv_integer(task_addr_out_vec);task_frame_out<=conv_integer(task_frame_out_vec);end architecture memory_organization;<!-- SIPO <DP n="38"> --><dp n="d38"/>library ieee;use ieee.std_logic_1164.all;use work.hwprocl_package.all;package task_memory_package iscomponent task_memory_block isport(signal task_addr_out,task_frame_outout natural;signal addrin memory_block_address;signal clkin std_logic;signal task_addr_in,task_frame_inin natural;en,wein std_logic);end component task_memory_block;end package task_memory_package;
權利要求
1.一種計算機處理器系統(tǒng),包括
至少一個處理器,所述處理器包括適用于執(zhí)行基于π演算原語的硬件指令的電子電路。
2.如權利要求1所述的計算機處理器系統(tǒng),其特征在于,所述π演算原語是異步π演算原語。
3.如權利要求1所述的計算機處理器系統(tǒng),其特征在于,所述至少一個處理器還包括多個電子電路,所述多個電子電路中的每一個都適用于執(zhí)行基于對應的一組π演算原語的一組硬件指令中的相應的一個。
4.如權利要求3所述的計算機處理器系統(tǒng),其特征在于,所述一組硬件指令包括用于異步發(fā)送一對字的指令和從通道讀取一對字的指令。
5.如權利要求4所述的計算機處理器系統(tǒng),其特征在于,所述用于異步發(fā)送一對字的指令至少部分地基于本文附錄中所提供的對SEND2指令的硬件定義語言描述。
6.如權利要求4所述的計算機處理器系統(tǒng),其特征在于,所述用于從通道讀取一對字的指令至少部分地基于本文附錄中所提供的對RECEIVE2指令的硬件定義語言描述。
7.如權利要求4所述的計算機處理器系統(tǒng),其特征在于,所述一組硬件指令包括以下的至少一個
用于動態(tài)地創(chuàng)建新通信通道的指令;
用于監(jiān)聽一通道列表,隨后當所述通道列表中的通道之一上出現數據時執(zhí)行動作的指令;
用于向所述處理器上運行的一進程列表添加新進程的指令;
用于產生新進程來處理在通道上接收到的數據值的指令;以及
用于停止進程的執(zhí)行的指令。
8.如權利要求7所述的計算機處理器系統(tǒng),其特征在于,所述用于動態(tài)地創(chuàng)建新通信通道的指令至少部分地基于本文附錄中所提供的對NEW指令的硬件定義語言描述。
9.如權利要求7所述的計算機處理器系統(tǒng),其特征在于,所述用于監(jiān)聽一通道列表的指令至少部分地基于本文附錄中所提供的對SELECT指令的硬件定義語言描述。
10.如權利要求7所述的計算機處理器系統(tǒng),其特征在于,所述用于添加新進程的指令至少部分地基于本文附錄中所提供的對PAR指令的硬件定義語言描述。
11.如權利要求7所述的計算機處理器系統(tǒng),其特征在于,所述用于產生新進程的指令至少部分地基于本文附錄中所提供的對SERVE指令的硬件定義語言描述。
12.如權利要求7所述的計算機處理器系統(tǒng),其特征在于,所述用于停止進程的執(zhí)行的指令至少部分地基于本文附錄中所提供的對HALT指令的硬件定義語言描述。
13.一種在計算機中使用的電路板,所述電路板包括
多個處理器,所述多個處理器中的每一個都適用于執(zhí)行基于對應的一組π演算原語的一組硬件指令中相應的一個;以及
連接到所述多個處理器中的每一個的存儲器。
14.如權利要求13所述的電路板,其特征在于,所述存儲器是雙端口存儲器。
15.如權利要求14所述的電路板,其特征在于,所述雙端口存儲器表示在消息傳遞系統(tǒng)中使用的通道。
16.如權利要求15所述的電路板,其特征在于,所述雙端口存儲器擔當用于程序和數據的高速緩存。
17.如權利要求13所述的電路板,其特征在于,所述存儲器是經由SDRAM控制器來訪問的。
18.如權利要求17所述的電路板,其特征在于,所述SDRAM控制器管理與較大存儲器的通信。
19.如權利要求13所述的電路板,其特征在于,還包括提供與硬件資源的連接的一個或多個通道。
20.如權利要求13所述的電路板,其特征在于,還包括交換網絡,所述多個處理器可經由所述交換網絡訪問另一個處理器所擁有的通道。
21.如權利要求13所述的電路板,其特征在于,所述多個處理器是用現場可編程門陣列實現的。
22.如權利要求13所述的電路板,其特征在于,所述多個處理器是用硅片實現的。
23.一種計算機處理器系統(tǒng),包括
通信通路;以及
獨立地耦合到所述通信通路的多個處理器,其中,所述多個處理器中的每一個都適用于執(zhí)行基于對應的一組π演算原語的一組硬件指令中相應的一個。
24.如權利要求23所述的系統(tǒng),其特征在于,還包括
耦合到所述通信通路的處理服務,其中,所述多個處理器中的每一個都可經由所述通信通路訪問所述處理服務。
25.如權利要求23所述的系統(tǒng),其特征在于,還包括
耦合到所述通信通路的存儲器,其中,所述多個處理器中的每一個都可經由所述通信通路訪問所述存儲器。
26.如權利要求23所述的系統(tǒng),其特征在于,還包括
耦合到所述通信通路的存儲器,其中所,述多個處理器中的每一個都可經由所述通信通路對所述存儲器進行讀或寫。
27.一種用于執(zhí)行硬件指令的處理器,所述處理器包括
多個電子電路,其中,所述多個電子電路中的每一個都至少部分地由本文附錄中所提供的硬件定義語言語句中的一個來定義。
全文摘要
揭示了一種設計成直接執(zhí)行基于異步π演算的機器代碼的處理器。此類處理器可以是多處理器系統(tǒng)的一個元件,該多處理器系統(tǒng)旨在提供一種用于執(zhí)行基于π演算的程序的可縮放的、松耦合的架構。
文檔編號G06F9/45GK1766841SQ20051011921
公開日2006年5月3日 申請日期2005年10月27日 優(yōu)先權日2004年10月28日
發(fā)明者S·辛格 申請人:微軟公司