當前位置:首頁 » 文件傳輸 » 並行架構內存訪問
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

並行架構內存訪問

發布時間: 2022-08-29 13:03:40

A. 並行匯流排:單片機的單匯流排如何架構和設計的

首先單片機是一個8bit的mcu所以處理器結構很簡單,他的時鍾周期低,然後幾個時鍾周期才處理一條指令,所以用單匯流排就已經足夠了,不需要將數據和指令分開的並行匯流排,因為快速讀進來以後也是等待,沒有太多的意義。
因為單片機是單匯流排,所以他的外設和memory都是利用這個匯流排進行統一的編址和訪問。相當於所有的東西都掛到了這條匯流排上面來。

B. 多內存控制器能否並行訪問DDR同體同行數據

嚴格的說DDR應該叫DDR SDRAM,人們習慣稱為DDR,部分初學者也常看到DDR SDRAM,就認為是SDRAM。DDR SDRAM是Double Data Rate SDRAM的縮寫,是雙倍速率同步動態隨機存儲器的意思。DDR內存是在SDRAM內存基礎上發展而來的,仍然沿用SDRAM生產體系,因此對於內存廠商而言,只需對製造普通SDRAM的設備稍加改進,即可實現DDR內存的生產,可有效的降低成本。

C. AGP顯卡的特點與功能

AGP(Accelerate Graphical Port),加速圖形介面。隨著顯示晶元的發展,PCI匯流排日益無法滿足其需求。英特爾於1996年7月正式推出了AGP介面,它是一種顯示卡專用的局部匯流排。嚴格的說,AGP不能稱為匯流排,它與PCI匯流排不同,因為它是點對點連接,即連接控制晶元和AGP顯示卡,但在習慣上我們依然稱其為AGP匯流排。AGP介面是基於PCI 2.1 版規范並進行擴充修改而成,工作頻率為66MHz。
◆ AGP匯流排直接與主板的北橋晶元相連,且通過該介面讓顯示晶元與系統主內存直接相連,避免了窄帶寬的PCI匯流排形成的系統瓶頸,增加3D圖形數據傳輸速度,同時在顯存不足的情況下還可以調用系統主內存。所以它擁有很高的傳輸速率,這是PCI等匯流排無法與其相比擬的。
由於採用了數據讀寫的流水線操作減少了內存等待時間,數據傳輸速度有了很大提高;具有133MHz及更高的數據傳輸頻率;地址信號與數據信號分離可提高隨機內存訪問的速度;採用並行操作允許在CPU訪問系統RAM的同時AGP顯示卡訪問AGP內存;顯示帶寬也不與其它設備共享,從而進一步提高了系統性能。
AGP標准在使用32位匯流排時,有66MHz和133MHz兩種工作頻率,最高數據傳輸率為266Mbps和533Mbps,而PCI匯流排理論上的最大傳輸率僅為133Mbps。目前最高規格的AGP 8X模式下,數據傳輸速度達到了2.1GB/s。
AGP介面的發展經歷了AGP1.0(AGP1X、AGP2X)、AGP2.0(AGP Pro、AGP4X)、AGP3.0(AGP8X)等階段,其傳輸速度也從最早的AGP1X的266MB/S的帶寬發展到了AGP8X的2.1GB/S。
AGP 1.0(AGP1X、AGP2X)
1996年7月AGP 1.0 圖形標准問世,分為1X和2X兩種模式,數據傳輸帶寬分別達到了266MB/s和533MB/s。這種圖形介面規范是在66MHz PCI2.1規范基礎上經過擴充和加強而形成的,其工作頻率為66MHz,工作電壓為3.3v,在一段時間內基本滿足了顯示設備與系統交換數據的需要。這種規范中的AGP帶寬很小,現在已經被淘汰了,只有在前幾年的老主板上還見得到。
AGP2.0(AGP4X)
顯示晶元的飛速發展,圖形卡單位時間內所能處理的數據呈幾何級數成倍增長,AGP 1.0 圖形標准越來越難以滿足技術的進步了,由此AGP 2.0便應運而生了。1998年5月份,AGP 2.0 規范正式發布,工作頻率依然是66MHz,但工作電壓降低到了1.5v,並且增加了4x模式,這樣它的數據傳輸帶寬達到了1066MB/sec,數據傳輸能力大大地增強了。
◆ AGP Pro
AGP Pro介面與AGP 2.0同時推出,這是一種為了滿足顯示設備功耗日益加大的現實而研發的圖形介面標准,應用該技術的圖形介面主要的特點是比AGP 4x略長一些,其加長部分可容納更多的電源引腳,使得這種介面可以驅動功耗更大(25-110w)或者處理能力更強大的AGP顯卡。這種標准其實是專為高端圖形工作站而設計的,完全兼容AGP 4x規范,使得AGP 4x的顯卡也可以插在這種插槽中正常使用。AGP Pro在原有AGP插槽的兩側進行延伸,提供額外的電能。它是用來增強,而不是取代現有AGP插槽的功能。根據所能提供能量的不同,可以把AGP Pro細分為AGP Pro110和AGP Pro50。在某些高檔台式機主板上也能見到AGP Pro插槽,例如華碩的許多主板。
AGP 3.0(AGP8X)
2000年8月,Intel推出AGP3.0規范,工作電壓降到0.8V,並增加了8x模式,這樣它的數據傳輸帶寬達到了2133MB/sec,數據傳輸能力相對於AGP 4X成倍增長,能較好的滿足當前顯示設備的帶寬需求。
AGP介面的模式傳輸方式
不同AGP介面的模式傳輸方式不同。1X模式的AGP,工作頻率達到了PCI匯流排的兩倍—66MHz,傳輸帶寬理論上可達到266MB/s。AGP 2X工作頻率同樣為66MHz,但是它使用了正負沿(一個時鍾周期的上升沿和下降沿)觸發的工作方式,在這種觸發方式中在一個時鍾周期的上升沿和下降沿各傳送一次數據,從而使得一個工作周期先後被觸發兩次,使傳輸帶寬達到了加倍的目的,而這種觸發信號的工作頻率為133MHz,這樣AGP 2X的傳輸帶寬就達到了266MB/s×2(觸發次數)=533MB/s的高度。AGP 4X仍使用了這種信號觸發方式,只是利用兩個觸發信號在每個時鍾周期的下降沿分別引起兩次觸發,從而達到了在一個時鍾周期中觸發4次的目的,這樣在理論上它就可以達到266MB/s×2(單信號觸發次數)×2(信號個數)=1066MB/s的帶寬了。在AGP 8X規范中,這種觸發模式仍然使用,只是觸發信號的工作頻率變成266MHz,兩個信號觸發點也變成了每個時鍾周期的上升沿,單信號觸發次數為4次,這樣它在一個時鍾周期所能傳輸的數據就從AGP4X的4倍變成了8倍,理論傳輸帶寬將可達到266MB/s×4(單信號觸發次數)×2(信號個數)=2133MB/s的高度了。
目前常用的AGP介面為AGP4X、AGP PRO、AGP通用及AGP8X介面。需要說明的是由於AGP3.0顯卡的額定電壓為0.8—1.5V,因此不能把AGP8X的顯卡插接到AGP1.0規格的插槽中。這就是說AGP8X規格與舊有的AGP1X/2X模式不兼容。而對於AGP4X系統,AGP8X顯卡仍舊在其上工作,但僅會以AGP4X模式工作,無法發揮AGP8X的優勢。
http://publish.it168.com/cword/1316.shtml
PCI E
PCI-Express是最新的匯流排和介面標准,它原來的名稱為「3GIO」,是由英特爾提出的,很明顯英特爾的意思是它代表著下一代I/O介面標准。交由PCI-SIG(PCI特殊興趣組織)認證發布後才改名為「PCI-Express」。這個新標准將全面取代現行的PCI和AGP,最終實現匯流排標準的統一。它的主要優勢就是數據傳輸速率高,目前最高可達到10GB/s以上,而且還有相當大的發展潛力。PCI Express也有多種規格,從PCI Express 1X到PCI Express 16X,能滿足現在和將來一定時間內出現的低速設備和高速設備的需求。能支持PCI Express的主要是英特爾的i915和i925系列晶元組。當然要實現全面取代PCI和AGP也需要一個相當長的過程,就象當初PCI取代ISA一樣,都會有個過渡的過程。
PCI Express(以下簡稱PCI-E)採用了目前業內流行的點對點串列連接,比起PCI以及更早期的計算機匯流排的共享並行架構,每個設備都有自己的專用連接,不需要向整個匯流排請求帶寬,而且可以把數據傳輸率提高到一個很高的頻率,達到PCI所不能提供的高帶寬。相對於傳統PCI匯流排在單一時間周期內只能實現單向傳輸,PCI-E的雙單工連接能提供更高的傳輸速率和質量,它們之間的差異跟半雙工和全雙工類似。
PCI-E的介面根據匯流排位寬不同而有所差異,包括X1、X4、X8以及X16,而X2模式將用於內部介面而非插槽模式。PCI-E規格從1條通道連接到32條通道連接,有非常強的伸縮性,以滿足不同系統設備對數據傳輸帶寬不同的需求。此外,較短的PCI-E卡可以插入較長的PCI-E插槽中使用,PCI-E介面還能夠支持熱拔插,這也是個不小的飛躍。PCI-E X1的250MB/秒傳輸速度已經可以滿足主流聲效晶元、網卡晶元和存儲設備對數據傳輸帶寬的需求,但是遠遠無法滿足圖形晶元對數據傳輸帶寬的需求。 因此,用於取代AGP介面的PCI-E介面位寬為X16,能夠提供5GB/s的帶寬,即便有編碼上的損耗但仍能夠提供約為4GB/s左右的實際帶寬,遠遠超過AGP 8X的2.1GB/s的帶寬。
盡管PCI-E技術規格允許實現X1(250MB/秒),X2,X4,X8,X12,X16和X32通道規格,但是依目前形式來看,PCI-E X1和PCI-E X16已成為PCI-E主流規格,同時很多晶元組廠商在南橋晶元當中添加對PCI-E X1的支持,在北橋晶元當中添加對PCI-E X16的支持。除去提供極高數據傳輸帶寬之外,PCI-E因為採用串列數據包方式傳遞數據,所以PCI-E介面每個針腳可以獲得比傳統I/O標准更多的帶寬,這樣就可以降低PCI-E設備生產成本和體積。另外,PCI-E也支持高階電源管理,支持熱插拔,支持數據同步傳輸,為優先傳輸數據進行帶寬優化。
http://ke..com/view/238809.htm
***********************************************************
APG顯卡: 比如GF4 MX440/G FX5700/G FX5200 /G FX6200/ATI 9550
PCI-E顯卡:比如ATI X300/X550/X700/X1300/X1500等以上
還有GF 7100LE/7300LE/7300GT/7600GS/7900等以上

D. 哪種內存技術允許同時訪問兩個內存模塊 1雙面 2sram 3雙通道 4ecc

雙通道內存技術允許同時訪問兩個內存模塊。

雙通道內存技術其實就是雙通道內存控制技術,能有效地提高內存總帶寬,從而適應新的微處理器的數據傳輸、處理的需要。它的技術核心在於晶元組(北橋)可以在兩個不同的數據通道上分別定址、讀取數據R內存可以達到128位的帶寬。

雙通道內存技術的優點:

1、能夠帶來2倍的內存帶寬,從而可以那些與必須內存數據進行頻繁交換的軟體得到極大的好處,譬如SPEC Viewperf、3DMAX、IBM Data Explorer、Lightscape等。

2、在板載顯卡共享內存的時候,雙通道技術帶來的高內存帶寬可以幫助顯卡在游戲中獲得更為流暢的速度,以3Dmark2001Se為例,其得分成績的差距,可以拉大到15-40%。

(4)並行架構內存訪問擴展閱讀

雙通道內存對於筆記本的缺點:

1、必須構架在支持雙通道的主板上,並且必須要有兩條相同容量、類型內存條。英特爾的雙通道對於內存類型和容量要求很高,兩根內存條必須完全一致。而SIS和VIA的雙通道主板則允許不同容量和類型的內存共存,只要是兩根內存條就行。

2、雙通道內存控制技術在普通的游戲和應用上,與單通道的差距極小。

3、需要購買支持雙通道內存控制技術的主板和兩根內存條,而這需要更多的成本。

4、雙通道的接法,對於初手來說十分重要,一旦接法不正確,將無法使雙通道起作用。

5、雙通道內存架構,其超頻比較困難,這就限制了喜歡DIY超頻用戶。

E. 哪種內存技術允許同時訪問兩個內存模塊

雙通道內存技術允許同時訪問兩個內存模塊。

雙通道內存技術其實就是雙通道內存控制技術,能有效地提高內存總帶寬,從而適應新的微處理器的數據傳輸、處理的需要。

它的技術核心在於晶元組(北橋)可以在兩個不同的數據通道上分別定址、讀取數據R內存可以達到128位的帶寬。

雙通道內存技術的優點:

1、能夠帶來2倍的內存帶寬,從而可以那些與必須內存數據進行頻繁交換的軟體得到極大的好處,譬如SPEC Viewperf、3DMAX、IBM Data Explorer、Lightscape等。

2、在板載顯卡共享內存的時候,雙通道技術帶來的高內存帶寬可以幫助顯卡在游戲中獲得更為流暢的速度,以3Dmark2001Se為例,其得分成績的差距,可以拉大到15-40%。

(5)並行架構內存訪問擴展閱讀:

應用:

雙通道內存主要是依靠主板北橋的控制技術,與內存本身無關。

目前支持雙通道內存技術的主板有Intel的i865和i875系列,SIS的SIS655、658系列,nVIDIAD的nFORCE2系列等。

Intel最先推出的支持雙通道內存技術的晶元組為E7205和E7500系列。

雙通道內存的安裝有一定的要求。

主板的內存插槽的顏色和布局一般都有區分。

如果是Intel的i865和i875系列,主板一般有4個DIMM插槽,每兩根一組,每組顏色一般不一樣,每一個組代表一個內存通道,只有當兩組通道上都同時安裝了內存條時,才能使內存工作在雙通道模式下。

另外要注意對稱安裝,即第一個通道第1個插槽搭配第二個通道第1個插槽,依此類推。用戶只要按不同的顏色搭配,對號入座地安裝即可。

如果在相同顏色的插槽上安裝內存條,則只能工作在單通道模式。而nFORCE2系列主板同樣有兩個64bit的內存控制器,其中A控制器只支持一根內存插槽,B通道則支持兩根。

A、B插槽之間有一段距離,以方便用戶識別。

A通道的內存插槽在顏色上也可能與B通道兩個內存插槽不同,用戶只要將一根內存插入獨立的內存插槽而將另外一根插到另外兩個彼此靠近的內存插槽就能組建成雙通道模式。

此外,如果全部插滿內存,也能建立雙通道模式,而且nForce2主板在組建雙通道模式時對內存容量乃至型號都沒有嚴格的要求,使用方便。

如果安裝方法正確,在主板開機自檢時,屏幕顯示內存的工作模式(如DDR333 Dual Channel Mode Enabled、激活雙通道模式等),則內存已經工作在雙通道模式。

F. 並行處理的並行演算法的基本策略

在並行處理技術中所使用的演算法主要遵循三種策略:
1.分而治之法:也就是把多個任務分解到多個處理器或多個計算機中,然後再按照一定的拓撲結構來進行求解。
2.重新排序法:分別採用靜態或動態的指令詞度方式。
3.顯式/隱式並行性結合:顯式指的是並行語言通過編譯形成並行程序,隱式指的是串列語言通過編譯形成並行程序,顯式/隱式並行性結合的關鍵就在於並行編譯,而並行編譯涉及到語句、程序段、進程以及各級程序的並行性。
二、並行性描述定義
利用計算機語言進行並行性描述的時候主要有三種方案:
1.語言擴展方案:也就是利用各種語言的庫函數來進行並行性功能的擴展。
2.編譯制導法:也稱為智能編譯,它是隱式並行策略的體現,主要是由並行編譯系統進行程序表示、控制流的分析、相關分析、優化分析和並行化劃分,由相關分析得到方法庫管理方案,由優化分析得到知識庫管理方案,由並行化劃分得到程序重構,從而形成並行程序。
3.新的語言結構法:這是顯式並行策略的體現。也就是建立一種全新的並行語言的體系,而這種並行語言通過編譯就能直接形成並行程序。
三、並行軟體
並行軟體可分成並行系統軟體和並行應用軟體兩大類,並行系統軟體主要指並行編譯系統和並行操作系統,並行應用軟體主要指各種軟體工具和應用軟體包。在軟體中所牽涉到的程序的並行性主要是指程序的相關性和網路互連兩方面。
1.程序的相關性:程序的相關性主要分為數據相關、控制相關和資源相關三類。
數據相關說明的是語句之間的有序關系,主要有流相關、反相關、輸出相關、I/O相關和求知相關等,這種關系在程序運行前就可以通過分析程序確定下來。數據相關是一種偏序關系,程序中並不是每一對語句的成員都是相關聯的。可以通過分析程序的數據相關,把程序中一些不存在相關性的指令並行地執行,以提高程序運行的速度。
控制相關指的是語句執行次序在運行前不能確定的情況。它一般是由轉移指令引起的,只有在程序執行到一定的語句時才能判斷出語句的相關性。控制相關常使正在開發的並行性中止,為了開發更多的並行性,必須用編譯技術克服控制相關。
而資源相關則與系統進行的工作無關,而與並行事件利用整數部件、浮點部件、寄存器和存儲區等共享資源時發生的沖突有關。軟體的並行性主要是由程序的控制相關和數據相關性決定的。在並行性開發時往往把程序劃分成許多的程序段——顆粒。顆粒的規模也稱為粒度,它是衡量軟體進程所含計算量的尺度,一般用細、中、粗來描述。劃分的粒度越細,各子系統間的通信時延也越低,並行性就越高,但系統開銷也越大。因此,我們在進行程序組合優化的時候應該選擇適當的粒度,並且把通訊時延盡可能放在程序段中進行,還可以通過軟硬體適配和編譯優化的手段來提高程序的並行度。
2.網路互連:將計算機子系統互連在一起或構造多處理機或多計算機時可使用靜態或動態拓撲結構的網路。靜態網路由點一點直接相連而成,這種連接方式在程序執行過程中不會改變,常用來實現集中式系統的子系統之間或分布式系統的多個計算結點之間的固定連接。動態網路是用開關通道實現的,它可動態地改變結構,使之與用戶程序中的通信要求匹配。動態網路包括匯流排、交叉開關和多級網路,常用於共享存儲型多處理機中。在網路上的消息傳遞主要通過尋徑來實現。常見的尋徑方式有存儲轉發尋徑和蟲蝕尋徑等。在存儲轉發網路中以長度固定的包作為信息流的基本單位,每個結點有一個包緩沖區,包從源結點經過一系列中間結點到達目的結點。存儲轉發網路的時延與源和目的之間的距離(段數)成正比。而在新型的計算機系統中採用蟲蝕尋徑,把包進一步分成一些固定長度的片,與結點相連的硬體尋徑器中有片緩沖區。消息從源傳送到目的結點要經過一系列尋徑器。同一個包中所有的片以流水方式順序傳送,不同的包可交替地傳送,但不同包的片不能交叉,以免被送到錯誤的目的地。蟲蝕尋徑的時延幾乎與源和目的之間的距離無關。在尋徑中產生的死鎖問題可以由虛擬通道來解決。虛擬通道是兩個結點間的邏輯鏈,它由源結點的片緩沖區、結點間的物理通道以及接收結點的片緩沖區組成。物理通道由所有的虛擬通道分時地共享。虛擬通道雖然可以避免死鎖,但可能會使每個請求可用的有效通道頻寬降低。因此,在確定虛擬通道數目時,需要對網路吞吐量和通信時延折衷考慮。
四、硬體技術在硬體技術方面主要從處理機、存儲器和流水線三個方面來實現並行。
1.處理機:主要的處理機系列包括CISC、RISC、超標量、VL1W、超流水線、向量以及符號處理機。
傳統的處理機屬於復雜指令系統計算(CISC)結構。指令系統大,指令格式可變,通用寄存器個數較少,基本上使用合一的指令與數據高速緩存,時鍾頻率較低,CPI較高,大多數利用ROM 實現微碼控制CPU,而當今的精簡指令系統計算(RISC)處理機指令格式簡單規范,面向寄存器堆,採用重疊寄存器窗口技術,具有多級Cache,多種流水線結構,強調編譯優化技術,時鍾頻率快,CPI低,大多數用硬連線控制CPU。
CISC或RISC標量處理機都可以採用超標量或向量結構來改善性能。標量處理機在每個周期內只發射一條指令並要求周期只完成從流水線來的一條指令。而在超標量處理機中,使用了多指令流水線,每個周期要發射多條指令並產生多個結果。由於希望程序中有許多的指令級並行性,因此超標量處理機更要依靠優化編譯器去開發並行性。
VL1W 結構是將水平微碼和超標量處理這兩種普遍採用的概念結合起來產生的。典型的超長指令字VL1W 機器指令字長度有數百位。在VLlW 處理機中,多個功能部件是並發工作的,所有的功能部件共享使用公用大型寄存器堆,由功能部件同時執行的各種操作是用VL1W 指令來同步的,每條指令可指定多個操作。VL1W 指令解碼比超標量指令容易,但在開發不同數量的並行性時總是需要不同的指令系統。VL1W 主要是開發標量操作之間的並行性,它的成功與否很大程度取決於代碼壓縮的效率,其結構和任何傳統的通用處理機完全不兼容。即使同一結構的不同實現也不大可能做到彼此二進制兼容。VL1W 的主要優點在於它的硬體結構和指令系統簡單,在科學應用領域可以發揮良好作用,但在一般應用場合可能並不很好用。
向量處理機對數組執行向量指令,每條指令都包含一串重復的操作。它是專門設計用來完成向量運算的協處理機,通常用於多流水線超級計算機中。向量處理機可以利用循環級展開所得的並行性,它可以附屬於任何標量處理機。專用的向量流水線可以在循環控制中消除某些軟體開銷,它的效果與優化編譯器將順序代碼向量化的性能很有關系。從理論上說,向量機可以具有和超標量處理機同樣的性能,因此可以說向量機的並行性與超標量機相同。
符號處理機是為AI應用而研製的,已用於定理證明、模式識別、專家系統、知識工程、文本檢索、科學以及機器智能等許多應用領域。在這些應用中,數據和知識表達式、原語操作、演算法特性、存儲器、I/0和通信以及專用的結構特性與數值計算是不一樣的,符號處理機也稱為邏輯程序設計語言處理機、表處理語言處理機或符號變換器。符號處理並不和數值數據打交道,它處理的是邏輯程序、符號表、對象、劇本、黑板、產生式系統、語義網路、框架以及人工神經網路等問題。這些操作需要專門的指令系統,通常不使用浮點操作。
2.存儲器:存儲設備按容量和存取時間從低到高可分為寄存器、高速緩存、主存儲器、磁碟設備和磁帶機五個層次。較低層存儲設備與較高層的相比,存取速度較快、容量較小,每位元組成本較高、帶寬較寬、傳輸單位較小。
存放在存儲器層次結構中的信息滿足三個重要特性:包含性、一致性和局部性。所謂包含性,指的是一個信息字的復製品可以在比它高的所有層中找到,而如果在高層中丟失了一個信息,則在比它低的所有層中此信息也將丟失。CPU 和高速緩存之間的信息傳送是按字進行的,高速緩存和主存儲器間用塊作為數據傳送的基本單位,主存和磁碟之間又是以頁面為基本單位來傳送信息的,而在磁碟和磁帶機之間的數據傳送則是按文件級處理的。所謂一致性要求的是同一個信息項與後繼存儲器層次上的副本是一致的。也就是說,如果在高速緩存中的一個字被修改過,那麼在所有更高層上該字的副本也必須立即或最後加以修改。為了盡量減少存儲器層次結構的有效存取時間,通常把頻繁使用的信息放在較低層次。維護存儲器層次結構一致性一般有兩種策略,一種是寫直達策略,也就是如果,則立即在所有高層存儲器中進行同樣的修改;另一種是寫回策略,也就是在較低層中對信息進行修改後並不立即在高層存儲器中進行相應的修改,而是等到該信息將被替換或將從低層中消失時才在所有高層存儲器中進行同樣的修改。甚至可以將寫直達和寫回策略的優點結合起來,形成寫一次協議來維護存儲器的一致性。
存儲器的層次結構是在一種程序行為——訪問的局部性基礎上開發出來的。主要有時間局部性、空間局部性和順序局部性。時間局部性指的是最近的訪問項很可能在不久的將來再次被訪問。它往往會引起對最近使用區域的集中訪問。空間局部性表示一種趨勢,指的是一個進程訪問的各項其地址彼此很近。順序局部性指的是在典型程序中,除非是轉移指令,一般指令都是順序執行的。
在多處理機系統中一般使用共享存儲器。對共享存儲器的組織一般採用低位交叉、高位交叉、高低位交叉三種方法。低位交叉又稱並發存取,它是把相鄰的地址放在相鄰的存儲器模塊中,在訪問時不容易產生沖突,並行性較好,但可靠性容錯能力和擴展性均較差。高位交叉又稱允許同時存取,它是把相鄰地址分配到同一個存儲器模塊中,可靠性、容錯能力和擴展性均較強,但訪問時易產生沖突,帶寬較窄,並行性較差。高低位交叉存取又稱C—s存取,它是結合了高位交叉和低位交叉兩種方法的優點,既解決了沖突問題,又能有效地提高容錯能力和並行性,最適合於向量處理機結構。
3.流水線:流水線技術主要有指令流水線技術和運算流水線技術兩種。
指令流水線技術主要目的是要提高計算機的運行效率和吞吐率。它主要通過設置預取指令緩沖區、設置多功能部件、進行內部數據定向、採取適當的指令調度策略來實現。指令調度的策略主要有靜態和動態兩種,靜態詞度是基於軟體的,主要由編譯器完成,動態詞度是基於硬體的,主要是通過硬體技術進行。
運算流水線主要有單功能流水線和多功能流水線兩種。其中多功能流水線又可分為靜態流水線和動態流水線。靜態流水線技術只用來實現確定的功能,而動態流水線可以在不同時間重新組合,實現不同的功能,它除流線連接外,還允許前饋和反饋連接,因此也稱為非線性流水線。這些前饋和反饋連接使得進入流水線的相繼事件的詞度變得很不簡單。由於這些連接,流水線不一定從最後一段輸出。根據不同的數據流動模式,人們可以用同一條流水線求得不同功能的值。
並行計算機發展簡述
40 年代開始的現代計算機發展歷程可以分為兩個明顯的發展時代:串列計算時代、並行計算時代。每一個計算時代都從體系結構發展開始,接著是系統軟體(特別是編譯器與操作系統)、應用軟體,最後隨著問題求解環境的發展而達到頂峰。創建和使用並行計算機的主要原因是因為並行計算機是解決單處理器速度瓶頸的最好方法之一。
並行計算機是由一組處理單元組成的,這組處理單元通過相互之間的通信與協作,以更快的速度共同完成一項大規模的計算任務。因此,並行計算機的兩個最主要的組成部分是計算節點和節點間的通信與協作機制。並行計算機體系結構的發展也主要體現在計算節點性能的提高以及節點間通信技術的改進兩方面。
60 年代初期,由於晶體管以及磁芯存儲器的出現,處理單元變得越來越小,存儲器也更加小巧和廉價。這些技術發展的結果導致了並行計算機的出現,這一時期的並行計算機多是規模不大的共享存儲多處理器系統,即所謂大型主機(Mainframe)。IBM360 是這一時期的典型代表。
到了60 年代末期,同一個處理器開始設置多個功能相同的功能單元,流水線技術也出現了。與單純提高時鍾頻率相比,這些並行特性在處理器內部的應用大大提高了並行計算機系統的性能。伊利諾依大學和Burroughs 公司此時開始實施IlliacIV 計劃,研製一台64 個CPU 的SIMD 主機系統,它涉及到硬體技術、體系結構、I/O 設備、操作系統、程序設計語言直至應用程序在內的眾多研究課題。不過,當一台規模大大縮小了的16CPU 系統終於在1975 年面世時,整個計算機界已經發生了巨大變化。
首先是存儲系統概念的革新,提出虛擬存儲和緩存的思想。IBM360/85 系統與360/91是屬於同一系列的兩個機型,360/91 的主頻高於360/85,所選用的內存速度也較快,並且採用了動態調度的指令流水線;但是,360/85 的整體性能卻高於360/91,唯一的原因就是前者採用了緩存技術,而後者則沒有。
其次是半導體存儲器開始代替磁芯存儲器。最初,半導體存儲器只是在某些機器被用作緩存,而CDC7600 則率先全面採用這種體積更小、速度更快、可以直接定址的半導體存儲器,磁芯存儲器從此退出了歷史舞台。與此同時,集成電路也出現了,並迅速應用到了計算機中。元器件技術的這兩大革命性突破,使得IlliacIV 的設計者們在底層硬體以及並行體系結構方面提出的種種改進都大為遜色。
1976 年CRAY-1 問世以後,向量計算機從此牢牢地控制著整個高性能計算機市場15 年。CRAY-1 對所使用的邏輯電路進行了精心的設計,採用了我們如今稱為RISC 的精簡指令集,還引入了向量寄存器,以完成向量運算。這一系列全新技術手段的使用,使CRAY-1 的主頻達到了80MHz。
微處理器隨著機器的字長從4 位、8 位、16 位一直增加到32 位,其性能也隨之顯著提高。正是因為看到了微處理器的這種潛力,卡內基- 梅隆大學開始在當時流行的DECPDP11 小型計算機的基礎上研製成功一台由16 個PDP11/40 處理機通過交叉開關與16 個共享存儲器模塊相連接而成的共享存儲多處理器系統C.mmp。
從80 年代開始,微處理器技術一直在高速前進。稍後又出現了非常適合於SMP 方式的匯流排協議,而伯克利加州大學則對匯流排協議進行了擴展,提出了Cache 一致性問題的處理方案。從此,C.mmp 開創出的共享存儲多處理器之路越走越寬;現在,這種體系結構已經基本上統治了伺服器和桌面工作站市場。
同一時期,基於消息傳遞機制的並行計算機也開始不斷涌現。80 年代中期,加州理工成功地將64 個i8086/i8087 處理器通過超立方體互連結構連結起來。此後,便先後出現了Intel iPSC 系列、INMOS Transputer 系列,Intel Paragon 以及IBM SP 的前身Vulcan 等基於消息傳遞機制的並行計算機。
80 年代末到90 年代初,共享存儲器方式的大規模並行計算機又獲得了新的發展。IBM將大量早期RISC 微處理器通過蝶形互連網路連結起來。人們開始考慮如何才能在實現共享存儲器緩存一致的同時,使系統具有一定的可擴展性(Scalability)。90 年代初期,斯坦福大學提出了DASH 計劃,它通過維護一個保存有每一緩存塊位置信息的目錄結構來實現分布式共享存儲器的緩存一致性。後來,IEEE 在此基礎上提出了緩存一致性協議的標准。
90 年代以來,主要的幾種體系結構開始走向融合。屬於數據並行類型的CM-5 除大量採用商品化的微處理器以外,也允許用戶層的程序傳遞一些簡單的消息;CRAY T3D是一台NUMA 結構的共享存儲型並行計算機,但是它也提供了全局同步機制、消息隊列機制,並採取了一些減少消息傳遞延遲的技術。
隨著商品化微處理器、網路設備的發展,以及MPI/PVM 等並行編程標準的發布,機群架構的並行計算機出現。IBM SP2 系列機群系統就是其中的典型代表。在這些系統中,各個節點採用的都是標準的商品化計算機,它們之間通過高速網路連接起來。
今天,越來越多的並行計算機系統採用商品化的微處理器加上商品化的互連網路構造,這種分布存儲的並行計算機系統稱為機群。國內幾乎所有的高性能計算機廠商都生產這種具有極高性能價格比的高性能計算機,並行計算機就進入了一個新的時代,並行計算的應用達到了前所未有的廣度和深度。
並行計算機隨著微處理晶元的發展,已經進入了一個新時代。目前並行計算機的性能已經突破20PFLOPS,正在向百億億次發展。我國並行計算機的研製已經走在世界前列。2003年由聯想公司生產的深騰6800 在2003 年11 月世界TOP500 排名中位列第14 名,2004 年曙光公司生產的曙光4000A 在2004 年6 月的世界TOP500 排名中位列第10 名,這是我國公開發布的高性能計算機在世界TOP500 中首次進入前十名,這標志著我國在並行計算機系統的研製和生產中已經趕上了國際先進水平,為提高我國的科學研究水平奠定了物質基礎。2013年國際超級計算機大會最新發布的世界超級計算機500強排名中,國防科技大學研製的天河二號超級計算機系統,以峰值計算速度每秒5.49億億次、持續計算速度每秒3.39億億次雙精度浮點運算的優異性能位居榜首。
從TOP500 的前10 名來看,美國仍然是超級計算機的最大擁有者。按照世界TOP500 的統計數據來分析,美國在計算能力上佔有近全世界的一半,在TOP500 中的所有計算機中擁有的數量超過50%。

G. 單核cpu的並行過程,求解答

CPU並行編程概述
並行編程的演化
一個自然而然的問題是:為什麼要用並行編程?在20世紀70年代、80年代甚至90年代的一部分時間里,我們對單線程編程(或者稱為串列編程)非常滿意。你可以編寫一個程序來完成一項任務。執行結束後,它會給你一個結果。任務完成,每個人都會很開心!雖然任務已經完成,但是如果你正在做一個每秒需要數百萬甚至數十億次計算的粒子模擬,或者正在對具有成千上萬像素的圖像進行處理,你會希望程序運行得更快一些,這意味著你需要更快的CPU。

在2004年以前,CPU製造商IBM、英特爾和AMD都可以為你提供越來越快的處理器,處理器時鍾頻率從16 MHz、20 MHz、66 MHz、100 MHz,逐漸提高到200 MHz、333 MHz、466 MHz⋯⋯看起來它們可以不斷地提高CPU的速度,也就是可以不斷地提高CPU的性能。但到2004年時,由於技術限制,CPU速度的提高不能持續下去的趨勢已經很明顯了。這就需要其他技術來繼續提供更高的性能。CPU製造商的解決方案是將兩個CPU放在一個CPU內,即使這兩個CPU的工作速度都低於單個CPU。例如,與工作在300 MHz速度上的單核CPU相比,以200 MHz速度工作的兩個CPU(製造商稱它們為核心)加在一起每秒可以執行更多的計算(也就是說,直觀上看2×200 > 300)。

聽上去像夢一樣的「單CPU多核心」的故事變成了現實,這意味著程序員現在必須學習並行編程方法來利用這兩個核心。如果一個CPU可以同時執行兩個程序,那麼程序員必須編寫這兩個程序。但是,這可以轉化為兩倍的程序運行速度嗎?如果不能,那我們的2×200 > 300的想法是有問題的。如果一個核心沒有足夠的工作會怎麼樣?也就是說,只有一個核心是真正忙碌的,而另一個核心卻什麼都不做?這樣的話,還不如用一個300 MHz的單核。引入多核後,許多類似的問題就非常突出了,只有通過編程才能高效地利用這些核心。

核心越多,並行性越高
程序員不能簡單地忽略CPU製造商每年推出的更多數量的核心。2015年,英特爾在市場上推出8核台式機處理器i7-5960X[11]和10核工作站處理器,如Xeon E7-8870 [14]。很明顯,這種多核狂熱在可預見的未來會持續下去。並行編程從2000年年初的一種奇異的編程模型轉變為2015年唯一被接受的編程模型。這種現象並不局限於台式電腦。在移動處理器方面,iPhone和Android手機都有2個或4個核。預計未來幾年,移動領域的核心數量將不斷增加。

那麼,什麼是線程?要回答這個問題,讓我們來看看8核INTEL CPU i7-5960X [11]。 INTEL的文檔說這是一個8C/16T CPU。換句話說,它有8個核心,但可以執行16個線程。你也許聽到過並行編程被錯誤地稱為多核編程。正確的術語應該是多線程編程。這是因為當CPU製造商開始設計多核架構時,他們很快意識到通過共享一些核心資源(如高速緩存)來實現在一個核心中同時執行兩項任務並不困難。

類比1.1:核心與線程

圖1-1顯示了兩個兄弟Fred和Jim,他們是擁有兩台拖拉機的農民。每天,他們開車從農舍到椰子樹所在的地方,收獲椰子並把它們帶回農舍。他們用拖拉機內的錘子來收獲(處理)椰子。整個收獲過程由兩個獨立但有序的任務組成,每個任務需要30秒:任務1是從拖拉機走向椰子樹,每次帶回1顆椰子。任務2是用錘子敲碎(處理)它們,並將它們存放在拖拉機內。Fred每分鍾可以處理1顆椰子,而Jim每分鍾也可以處理1顆椰子。綜合起來,他們倆每分鍾可以處理2顆椰子。

一天,Fred的拖拉機發生了故障。他把拖拉機留在修理廠,並把椰子錘忘在了拖拉機內。回到農舍的時候已經太遲了,但他們仍然有工作要做。只使用Jim的拖拉機和裡面的1把椰子錘,他們還能每分鍾處理2顆椰子嗎?

核心與線程
讓我們來看看圖1-1中描述的類比1.1。如果收獲1顆椰子需要完成兩個連續的任務(我們將它們稱為線程):線程1從樹上摘取1顆椰子並花費30秒將它帶回拖拉機,線程2花費30秒用拖拉機內的錘子敲碎(處理)該椰子,這樣可以在60秒內收獲1顆椰子(每分鍾1顆椰子)。如果Jim和Fred各自都有自己的拖拉機,他們可以簡單地收獲兩倍多的椰子(每分鍾2顆椰子),因為在收獲每顆椰子時,他們可以共享從拖拉機到椰子樹的道路,並且他們各自擁有自己的錘子。

在這個類比中,一台拖拉機就是一個核心,收獲一顆椰子就是針對一個數據單元的程序執行。椰子是數據單元,每個人(Jim、Fred)是一個執行線程,需要使用椰子錘。椰子錘是執行單元,就像核心中的ALU一樣。該程序由兩個互相依賴的線程組成:在線程1執行結束之前,你無法執行線程2。收獲的椰子數量意味著程序性能。性能越高,Jim和Fred銷售椰子掙的錢就越多。可以將椰子樹看作內存,你可以從中獲得一個數據單元(椰子),這樣在線程1中摘取一顆椰子的過程就類似於從內存中讀取數據單元。

並行化更多的是線程還是核心
現在,讓我們看看如果Fred的拖拉機發生故障後會發生什麼。過去他們每分鍾都能收獲兩顆椰子,但現在他們只有一台拖拉機和一把椰子錘。他們把拖拉機開到椰子樹附近,並停在那兒。他們必須依次地執行線程1(Th1)和線程2(Th2)來收獲1顆椰子。他們都離開拖拉機,並在30秒內走到椰子樹那兒,從而完成了Th1。他們帶回挑好的椰子,現在,他們必須敲碎椰子。但因為只有1把椰子錘,他們不能同時執行Th2。Fred不得不等Jim先敲碎他的椰子,並且在Jim敲碎後,他才開始敲。這需要另外的30+30秒,最終他們在90秒內收獲2顆椰子。雖然效率不如每分鍾2顆椰子,但他們的性能仍然從每分鍾1顆提升至每分鍾1.5顆椰子。

收獲一些椰子後,Jim問了自己一個問題:「為什麼我要等Fred敲碎椰子?當他敲椰子時,我可以立即走向椰子樹,並摘獲下1顆椰子,因為Th1和Th2需要的時間完全相同,我們肯定不會遇到需要等待椰子錘空閑的狀態。在Fred摘取1顆椰子回來的時候,我會敲碎我的椰子,這樣我們倆都可以是100%的忙碌。」這個天才的想法讓他們重新回到每分鍾2顆椰子的速度,甚至不需要額外的拖拉機。重要的是,Jim重新設計了程序,也就是線程執行的順序,讓所有的線程永遠都不會陷入等待核心內部共享資源(比如拖拉機內的椰子錘)的狀態。正如我們將很快看到的,核心內部的共享資源包括ALU、FPU、高速緩存等,現在,不要擔心這些。

我在這個類比中描述了兩個配置場景,一個是2個核心(2C),每個核心可以執行一個單線程(1T);另一個是能夠執行2個線程(2T)的單個核心(1C)。在CPU領域將兩種配置稱為2C/2T與lC/2T。換句話說,有兩種方法可以讓一個程序同時執行2個線程:2C/2T(2個核心,每個核心都可以執行1個線程—就像Jim和Fred的兩台單獨的拖拉機一樣)或者lC/2T(單個核心,能夠執行2個線程—就像Jim和Fred共享的單台拖拉機一樣)。盡管從程序員的角度來看,它們都意味著具有執行2個線程的能力,但從硬體的角度來看,它們是非常不同的,這要求程序員充分意識到需要共享資源的線程的含義。否則,線程數量的性能優勢可能會消失。再次提醒一下:全能的INTEL i7-5960X [11] CPU是8C/l6T,它有8個核心,每個核心能夠執行2個線程。

圖1-2顯示了三種情況:a)是具有2個獨立核心的2C/2T情況;b)是具有糟糕編程的1C/2T情況,每分鍾只能收獲1.5顆椰子;c)是對椰子錘的需求永遠不會同時發生的順序正確版本,每分鍾可以收獲2顆椰子。

核心資源共享的影響
Jim為自己的發現感到自豪,他們的速度提高到每分鍾2顆椰子,Jim希望繼續創造一些方法來用一台拖拉機完成更多的工作。一天,他對Fred說:「我買了一把新的自動椰子錘,它在10秒內就能敲碎1顆椰子。」他們對這一發現非常滿意,立即出發並將拖拉機停在椰子樹旁。這次他們知道在開始收獲前必須先做好計劃⋯⋯

Fred問道:「如果我們的Th1需要30秒,而Th2需要10秒,並且我們唯一需要共享資源的任務是Th2(椰子錘),我們應該如何收獲椰子?」答案對他們來說很清楚:唯一重要的是線程的執行順序(即程序的設計),應確保他們永遠不會遇到兩人同時執行Th2並需要唯一的椰子錘(即共享核心資源)的情況。換句話說,它們的程序由兩個互相依賴的線程組成:Th1需要30秒,並且不需要共享(內存)資源,因為兩個人可以同時步行到椰子樹。Th2需要10秒並且不能同時執行,因為他們需要共享(核心)資源:椰子錘。由於每顆椰子需要30+10=40秒的總執行時間,他們能夠期望的最好結果是40秒收獲2顆椰子,如

圖1-2 d所示。如果每個人都按順序執行Th1和Th2,且不等待任何共享資源,則會發生這種情況。所以,他們的平均速度將是每分鍾3顆椰子(即每顆椰子平均20秒)。

內存資源共享的影響
用新的椰子錘實現了每分鍾收獲3顆椰子後,Jim和Fred第二天開始工作時看到了可怕的一幕。因為昨晚的一場大雨阻塞了半邊道路,從拖拉機到椰子樹的道路今天只能由一個人通行。所以,他們再次制訂計劃⋯⋯現在,他們有2個線程,每個線程都需要一個不能共享的資源。Th1(30秒—表示為30s)只能由一人執行,而Th2(10s)也只能由一人執行。怎麼辦?

考慮多種選擇後,他們意識到其速度的限制因素是Th1,他們能達到的最好目標是30秒收獲1顆椰子。當可以同時執行Th1(共享內存訪問)時,每個人可以順序地執行10+30s,並且兩個人都可以持續運行而無須訪問共享資源。但是現在沒有辦法對這些線程進行排序。他們能夠期望的最好結果是執行10+30s並等待20s,因為在此期間兩人都需要訪問內存。他們的速度回到平均每分鍾2顆椰子,如圖1-2 e所示。

這場大雨使他們的速度降低到每分鍾2顆椰子。Th2不再重要,因為一個人可以不慌不忙地敲椰子,而另一個人正在去摘取椰子的路上。Fred提出了這樣一個想法:他們應該從農舍再拿一把(較慢)椰子錘來幫忙。然而,這對於此時的情況絕對沒有幫助,因為收獲速度的限制因素是Th1。這種來自於某個資源的限制因素被稱為資源競爭。這個例子展示了當訪問內存是我們程序執行速度的限制因素時會發生什麼。處理數據的速度有多快(即核心運行速度)已無關緊要。我們將受到數據獲取速度的限制。即使Fred有一把可以在1秒鍾內敲碎椰子的椰子錘,但如果存在內存訪問競爭,他們仍然會被限制為每分鍾2顆椰子。在本書中,我們將區分兩種不同類型的程序:核心密集型,該類型不大依賴於內存訪問速度;存儲密集型,該類型對內存訪問速度高度敏感,正如我剛才提到的那樣。

第一個串列程序
我們已經理解了椰子世界中的並行編程,現在是時候將這些知識應用於真實計算機編程了。我會先介紹一個串列(即單線程)程序,然後將其並行化。我們的第一個串列程序imf?lip.c讀入圖1-3(左)中的小狗圖片並將其水平(中)或垂直(右)翻轉。為了簡化程序的解釋,我們將使用Bitmap(BMP)圖像格式,並將結果也輸出為BMP格式。這是一種非常容易理解的圖像格式,可以讓我們專注於程序本身。不要擔心本章中的細節,它們很快就會被解釋清楚,目前可以只關注高層的功能。

imflip.c源文件可以在Unix提示符下編譯和執行,如下所示:

gcc imflip.c -o imflip
./imflip dogL.bmp dogh.bmp V
在命令行中用「H」指定水平翻轉圖像(圖1-3中),用「V」指定垂直翻轉(圖1-3右側)。你將看到如下所示的輸出(數字可能不同,取決於你電腦的速度):

Input BMP File name : dogL.bmp (3200×2400)
Output BMP File name : dogh.bmp (3200×2400)
Total execution time : 81.0233 ms (10.550 ns per pixel)
運行該程序的CPU速度非常快,以致我必須將原始的640×480的圖像dog.bmp擴展為3200×2400的dogL.bmp,這樣它的運行時間才能被測量出來;dogL.bmp的每個維度擴大到原來的5倍,因此比dog.bmp大25倍。統計時間時,我們必須在圖像翻轉開始和結束時記錄CPU的時鍾。

理解數據傳輸速度
從磁碟讀取圖像的過程(無論是SSD還是硬碟驅動器)應該從執行時間中扣除,這很重要。換句話說,我們從磁碟讀取圖像,並確保它位於內存中(在我們的數組中),然後只統計翻轉操作所需的時間。由於不同硬體部件的數據傳輸速度存在巨大差異,我們需要分別分析在磁碟、內存和CPU上花費的時間。

在本書將要編寫的眾多並行程序中,我們重點關注CPU執行時間和內存訪問時間,因為我們可以控制它們。磁碟訪問時間(稱為I/O時間)通常在單線程中就達到極限,因而幾乎看不到多線程編程的好處。另外,請記住,當我們開始GPU編程時,較慢的I/O速度會嚴重困擾我們,因為I/O是計算機中速度最慢的部分,並且從CPU到GPU的數據傳輸要通過I/O子系統的PCI express匯流排進行,因此我們將面臨如何將數據更快地提供給GPU的挑戰。沒有人說GPU編程很容易!為了讓你了解不同硬體部件的傳輸速度,我在下面列舉了一些:

典型的網卡(NIC)具有1 Gbps的傳輸速度(千兆比特每秒或一億比特每秒)。這些卡俗稱「千兆網卡」或「Gig網卡」。請注意,1 Gbps只是「原始數據」的數量,其中包括大量的校驗碼和其他同步信號。傳輸的實際數據量少於此數量的一半。我的目的是給讀者一個大致的概念,這個細節對我們來說並不重要。

即使連接到具有6 Gbps峰值傳輸速度的SATA3介面,典型的硬碟驅動器(HDD)也幾乎無法達到1 Gbps〜2 Gbps的傳輸速度。HDD的機械讀寫性質根本不能實現快速的數據訪問。傳輸速度甚至不是硬碟的最大問題,最大問題是定位時間。HDD的機械磁頭需要一段時間在旋轉的金屬柱面上定位需要的數據,這迫使它在磁頭到達數據所在位置前必須等待。如果數據以不規則的方式分布(即碎片式的存放),則可能需要毫秒(ms)級的時間。因此,HDD的傳輸速度可能遠遠低於它所連接的SATA3匯流排的峰值速度。

連接到USB 2.0埠的快閃記憶體磁碟的峰值傳輸速度為480 Mbps(兆比特每秒或百萬比特每秒)。但是,USB 3.0標准具有更快的5 Gbps傳輸速度。更新的USB 3.1可以達到10 Gbps左右的傳輸速率。由於快閃記憶體磁碟使用快閃記憶體構建,它不需要查找時間,只需提供地址即可直接訪問數據。

典型的固態硬碟(SSD)可以連接在SATA3介面上,達到接近4 Gbps〜5 Gbps的讀取速度。因此,實際上SSD是唯一可以達到SATA3介面峰值速度的設備,即以預期的6 Gbps峰值速率傳輸數據。

一旦數據從I/O(SDD、HDD或快閃記憶體磁碟)傳輸到CPU的內存中,傳輸速度就會大大提高。已發展到第6代的Core i7系列(i7-6xxx),更高端的Xeon CPU使用DDR2、DDR3和DDR4內存技術,內存到CPU的傳輸速度為20 GBps〜60 GBps(千兆位元組每秒)。注意這個速度是千兆位元組。一個位元組有8個比特,為與其他較慢的設備進行比較,轉換為存儲訪問速度時為160 Gbps〜480 Gbps(千兆比特每秒)。

正如我們將在第二部分及以後所看到的,GPU內部存儲器子系統的傳輸速度可以達到100 GBps〜1000 GBps。例如,新的Pascal系列GPU就具有接近後者的內部存儲傳輸速率。轉換後為8000 Gbps,比CPU內部存儲器快一個數量級,比快閃記憶體磁碟快3個數量級,比HDD快近4個數量級。

imflip.c中的main( )函數
代碼1.1中所示的程序會讀取一些命令行參數,並按照命令行參數垂直或水平地翻轉輸入圖像。命令行參數由C放入argv數組中。

clock( )函數以毫秒為單位統計時間。重復執行奇數次(例如129次)操作可以提高時間統計的准確性,操作重復次數在"#define REPS 129"行中指定。該數字可以根據你的系統更改。

ReadBMP( )函數從磁碟讀取源圖像,WriteBMP( )將處理後的(即翻轉的)圖像寫回磁碟。從磁碟讀取圖像和將圖像寫入磁碟的時間定義為I/O時間,我們從處理時間中去除它們。這就是為什麼我在實際的圖像翻轉代碼之間添加"start = clock( )"和"stop = c1ock( )"行,這些代碼對已在內存中的圖像進行翻轉操作,因此有意地排除了I/O時間。

在輸出所用時間之前,imf?lip.c程序會使用一些free( )函數釋放所有由ReadBMP( )分配的內存以避免內存泄漏。

代碼1.1:imflip.c的main( ){⋯}

imflip.c中的main( )函數讀取3個命令行參數,用以確定輸入和輸出的BMP圖像文件名以及翻轉方向(水平或垂直)。該操作會重復執行多次(REPS)以提高計時的准確性。

垂直翻轉行:FlipImageV( )
代碼1.2中的FlipImageV( )遍歷每一列,並交換該列中互為垂直鏡像的兩個像素的值。有關Bitmap(BMP)圖像的函數存放在另一個名為ImageStuff.c的文件中,ImageStuff.h是對應的頭文件,我們將在下一章詳細解釋它們。圖像的每個像素都以「struct Pixel」類型存儲,包含unsigned char類型的該像素的R、G和B顏色分量。由於unsigned char佔用1個位元組,所以每個像素需要3個位元組來存儲。

ReadBMP( )函數將圖像的寬度和高度分別放在兩個變數ip.Hpixels和ip.Vpixels中。存儲一行圖像需要的位元組數在ip.Hbytes中。FlipImageV( )函數包含兩層循環:外層循環遍歷圖像的ip.Hbytes,也就是每一列,內層循環一次交換一組對應的垂直翻轉像素。

代碼1.2:imflip.c⋯FlipImageV( ){⋯}

對圖像的行做垂直翻轉,每個像素都會被讀取並替換為鏡像行中的相應像素。

水平翻轉列:FlipImageH( )
imf?lip.c的FlipImageH( )實現圖像的水平翻轉,如代碼1.3所示。除了內層循環相反,該函數與垂直翻轉的操作完全相同。每次交換使用「struct Pixel」類型的臨時像素變數pix。

由於每行像素以3個位元組存儲,即RGB、RGB、RGB⋯⋯因此訪問連續的像素需要一次讀取3個位元組。這些細節將在下一節介紹。現在我們需要知道的是,以下幾行代碼:

只是讀取位於垂直的第row行和水平的第col列處的一個像素。像素的藍色分量在地址img[row][col]處,綠色分量在地址img[row][col+1]處,紅色分量在img[row][col+2]處。在下一章中我們將看到,指向圖像起始地址的指針img由ReadBMP( )為其分配空間,然後由main( )傳遞給FlipImageH( )函數。

代碼1.3:imflip.cFlipImageH( ){⋯}

進行水平翻轉時,每個像素都將被讀取並替換為鏡像列中相應的像素。

H. 在並行計算中,不同計算機之間需要數據通信,我想實現的是:多台計算機共享伺服器內存中的數據

從原理上來說,你現有的環境為多計算機(multi-computer),而你想要的是共享內存式的共享模式,這是很難做到的。共享內存模式一般對應於多處理器(multi-processor)的結構,其與多計算機是MIMD的兩個實例。多計算機一般使用消息傳遞共享模式,經典的是MPI。你的需求其實很早就有人提出來了,類似於DSM模型,即distributed shared memory,不過那個絕不是靠普通PC機搭出來的,也絕不是走網線的,一定是大廠商定製開發的,所以這個你就別想了。另一種解決方案是靠高層抽象,將消息傳遞抽象成共享存儲,但效率比較低,不過貌似大規模分布式系統已採用這種方案,對小型系統沒啥優勢的。
綜上所述,用於並行計算的多計算機使用共享內存模式很難辦到。