演算法的硬體實現
⑴ 硬體與演算法融合成行業趨勢,淺談聯發科與虹軟的合作
隨著手機市場進入存量時代,作為差異化賣點,AI成為晶元/終端廠家們繼5G之後又一個發力點。日前,虹軟對外表示,其與聯發科保持戰略協作,通過「晶元+演算法」的深度適配,將給行業帶來更大的活力和想像力。對此業內人士也指出,虹軟已經為聯發科的多款處理器提供演算法支持,例如配合天璣晶元的APU實現諸如景深增強、AI色彩處理、暗光環境自動降噪等強化拍攝功能,二者接下來或將醞釀更大動作。
聯發科和虹軟的近期的動態十分頻密,例如聯發科日前新發布的天璣920/天璣810均搭載虹軟演算法,主打攝影賣點的天璣810即使用來自虹軟的AI-Color技術,可通過演算法實現銳利邊緣的自然過度虛化。讓拍攝的人像更突出,實現「主角光環」效果。實際上這並不是聯發科與虹軟的第一次合作,稍早發布的天璣1200就採用了虹軟的超級全景AI夜景演算法,實現了低光場景下也能獲得高質量和准確的拼接效果,同時對噪音和細節進行大幅度的提升,另外在此之前的 Helio P90、P70 等產品也均有虹軟的身影。
聯發科與虹軟的合作,其實只是聯發科「演算法+硬體」戰略的其中一環。要實現AI的可用化,強有力的硬體首先必不可少。聯發科在AI硬體上的發力其實已經耕耘數年,例如早在2018年,聯發科推出的 Helio P60就搭載了專門負責AI運算的APU單元,以及對應的NeuroPilot AI平台,率先在行業開啟了AI專核專用。歷經多代產品的迭代,聯發科在APU的運算性能、多核協作、功耗優化都有明顯提升搭載APU的聯發科多款晶元更多次登頂蘇黎世AI-benchmark平台,其研發實力可見一斑。
除了強勁的AI硬體性能以外,聯發科進一步協同產業夥伴完善其 AI 生態,例如在軟體、演算法和應用方面就攜手虹軟、曠視、商湯等國內外知名AI演算法企業。通過引入包括加密人臉識別、3D人體姿態識別追蹤等諸多演算法層面技術。通過這些演算法,APU能支持包括支付級人臉解鎖識別、全自動視頻瘦體美顏等諸多功能,大大拓展了AI的使用領域,強力普及了近些年AI 在智能設備上的應用。
根據信息顯示,目前聯發科的APU平台目前已經迭代到3.0版本,主流的天璣 5G 移動晶元均有搭載相關功能,可以說為終端設備提供了可靠的AI算力支持。落地在應用方面,常見的AI場景識別、智能翻譯、AI攝影輔助等功能均是來自 AI專核的支持,當然更值得一提的是,APU 3.0針對5G網路的特別優化才是最大的特色。以當前流行的短視頻為例,通常系統都會對原片進行壓縮,而搭載APU 3.0的天璣5G 移動晶元則可以通過APU演算法實現「畫質提升」效果,讓低畫質視頻高清化,大大提高了短視頻用戶的觀看體驗。
除了畫質提升外,聯發科的 APU 還進一步擴展到系統應用上,例如最新的天璣820搭載的 APU 就能支持獨家多任務排程技術,將任務排程進行切割,讓兩個任務可以兼顧完成,例如用戶錄制視頻的時候,視頻錄制和拍照可以同時進行互不幹擾,還能保證視頻和拍照的品質。此外,AI視頻模糊消除功能也十分強大,通過AI演算法對視頻的畫面影像進行切割、去模糊,可實時還原模糊的影像,即便拍視頻時手抖也不怕出現模糊的畫面,讓用戶在拍攝短視頻時不懼抖動。
在應用和系統的基礎上,聯發科進一步完善 AI 生態,例如其就實現了API層面的開放,通過NeuroPilot SDK,終端廠家的開發人員可以用更貼近硬體的方式編碼開發,為充分發揮APU的潛力提供了有力支持。譬如小米通過將天璣820的APU 3.0與其自研的MACE深度學習框架集合,成功讓Redmi 10X系列5G手機擁有了AI場景識別、AI人像留色、AI實時背景虛化等豐富的攝影應用,讓用戶們的拍攝體驗有了不錯的提升。
除了手機晶元外,聯發科還將AI平台延伸到了智能家居、電視、AIoT、平板電腦等諸多應用場景,打算形成一套完整的AI生態應用場景鏈條。當下,聯發科的AI產業夥伴涵蓋了終端廠家、演算法企業、軟體巨頭,包括騰訊、阿里、亞馬遜等知名企業均在其中,可見聯發科在AI方面確實投入了不少資源。
總的來說,聯發科的「演算法+硬體」戰略目前來看是取得了不錯的成效。根據CINNO Research的數據,聯發科在六月的SoC出貨量持續上升,同比增長56.5%。但誠如上文所言,手機為首的消費電子產品已經進入存量時代。三星、蘋果、英特爾等大廠都在盡力拓展AI技術的使用場景,從AIoT到智能 汽車 ,一場AI競賽正在緊鑼密鼓地進行。目前聯發科已經強力布局其 5C 市場,我們預估其也會在AI領域展開新一輪的動作,我們不妨靜觀其表現。
⑵ 計算機組成原理是什麼
計算機組成原理是什麼
計算機組成指的是系統結構的邏輯實現,包括機器機內的數據流和控制流的組成及邏輯設計等。計算機由什麼組成的,有什麼原理呢?下面我為大家分析一下!
【計算機性能指標】
計算機的性能指標主要是CPU性能指標、存儲器性能指標和I/O吞吐率。
處理機字長:是指處理機運算器中一次能夠完成二進制運算的位數。
匯流排寬度:一般指CPU中運算器與存儲器之間進行互連的內部匯流排二進制位數。
存儲器帶寬:單位時間內從存儲器讀出事物二進制數信息量,一般用位元組數/秒錶示。
主頻/時鍾周期:CPU的工作節拍受主時鍾控制,主時鍾不斷產生固定頻率的時鍾,主時鍾的頻率(f)叫CPU的主頻。主頻的倒數稱為CPU的周期(T)。
CPI:表示每條指令周期數,即執行一般程序所佔用的CPU時間,
CPU執行時間=CPU時鍾周期數*CPU時鍾周期
MIPS:表示平均每秒執行多少百萬條定點指令數,
FLOPS:表示每秒執行浮點操作的次數,用來衡量機器浮點操作的性能。
FLOPS=程序中的浮點操作次數/程序執行時間(s)
【定點數的表示和運算】
一個定點數由符號位和數值域兩部分組成。按小數點位置不同,定點數有純小數和純整數兩種表示方法。在定點計算機中,兩個原碼表示的數相乘的運算規則是:乘積的嫌族符號位由兩數的符號位按異或運算得到,而乘積的數值部分則者者仔是兩個正數相乘之積。兩個原碼表示的數相除時,商的符號位由兩數的符號按位相加求得,商的數值部分由兩數的數值部分相除求得。
【算數邏輯單元ALU】
為運算器構造的簡單性,運算方法中算數運算通常採用補碼加、減法,原碼乘除法或補碼乘除法。為了運算器的高速性和控制的簡單性,採用了先行進位、陣列乘除法、流水線等並行技術措施。ALU不僅具有多種算術運算和邏輯運算的功能,而且具有先行進位邏輯,從而能實現高速運算。
【存儲器的分類】
按存儲介質,用半導體器件組成的存儲器稱為半導體存儲器,用磁性材料做成的存儲器稱為磁表面存儲首汪器;作為存儲介質的基本要求,必須有兩個明顯區別的物理狀態,分別用來表示二進制的代碼0和1。另一方面,存儲器的存取速度又取決於這種物理狀態的改變速度。
按存取方式,存儲器中任何存儲單元的內容都能被隨機存取,且存取時間和存儲單元的位置無關的存儲器稱為隨機存儲器,存儲器只能按某種順序來存取,即存取時間和存儲單元的物理位置有關的存儲器稱為順序存儲器;半導體存儲器是隨機存儲器,RAM和ROM都是採用隨機存取的方式進行信息訪問,磁帶存儲器是順序存儲器。
按信息易失性,斷電後信息消失的存儲器稱為易失性存儲器,斷電後仍能保存信息的存儲器稱為非易失性存儲器;半導體讀寫存儲器RAM是易失性存儲器,ROM是非易失性存儲器,磁性材料做成的存儲器是非易失性存儲器。
按存儲內容可變性,有些半導體存儲器存儲的內容是固定不變的,即只能讀出而不能寫入,這種半導體存儲器稱為只讀存儲器(ROM),既能讀出又能寫入的半導體存儲器稱為隨機讀寫存儲器(RAM);
按系統中的作用,可分為內部存儲器、外部存儲器;又可分為主存儲器、高速緩沖存儲器、輔助存儲器、控制存儲器;半導體存儲器是內部存儲器,磁碟是外部存儲器,又是輔助存儲器。
【存儲器的層次化結構】
目前在計算機系統中,通常採用多級存儲器體系結構,即使用高級緩沖存儲器(cache)、主存儲器和外存儲器。CPU能直接訪問的存儲器稱為內存儲器,它包括cache和主存儲器。CPU不能直接訪問外存儲器,外存儲器的信息必須調入內存儲器後才能為CPU進行處理。cache是計算機系統中的一個高速小容量半導體存儲器,在計算機中利用cache來高速存取指令和數據。cache的工作原理基於程序運行中具有的空間局部性和時間局部性特徵。cache能高速地向CPU提供指令和數據,從而加快了程序的執行速度。從功能上看,它是主存的緩沖存儲器,由高速的SRAM組成。為追求高速,包括管理在內的全部功能由硬體實現,因而對程序員是透明的。與主存容量相比。cache的容量很小,它保存的內容只是主存內容的一個子集,且cache與主存的數據交換是以塊為單位。主存儲器是計算機系統的主要存儲器,由MOS半導體存儲器組成,用來存放計算機運行期間的大量程序和數據,能和cache交換數據和指令。外存儲器是大容量輔助存儲器,通常用來存放系統程序和大型數據文件及資料庫。
存儲器的技術指標有存儲容量、存取時間、存儲周期、存儲器帶寬。存取時間、存儲周期、存儲器帶寬三個概念反映了主存的速度指標。
存取時間:指一次讀操作命令發出到該操作完成,將數據讀出到數據匯流排上所經歷的時間。通常取寫操作時間等於讀操作時間,故稱為存儲器存取時間,存取時間又稱存儲器訪問時間。
存儲周期:指連續兩次讀操作所需間隔的最小時間。通常,存儲周期略大於存取時間。
“位(bit)”是電子計算機中最小的數據單位,每一位的狀態只能是0或1。8個二進制位構成一個“位元組(Byte)”,位元組是儲存空間的基本計量單位,一個位元組可以儲存一個英文字母,2個位元組可以儲存一個漢子。“字”由若干位元組構成,字的位數叫作字長,不同檔次的機器有不同的字長。存儲器的基本單位位元組的長度是8 bit。表示主存容量的常用單位位元組B,是基本單位。此外還有KB、MB、GB、TB。一個雙穩態半導體電路或一個CMOS晶體管或磁性材料的存儲元,均可以存儲一位二進制代碼。這個二進制代碼位是存儲器中最小的存儲單位,稱為存儲位元。
所有的SRAM的特徵是用一個鎖存器(觸發器)作為存儲元,觸發器具有兩個穩定的狀態,只要直流供電電源一直加在這個記憶電路上,它就無限期地保持記憶的1或0狀態;如果電源斷電,那麼存儲的數據(1或0)就會丟失。SRAM是易失性存儲器。半導體靜態存儲器 SRAM 的存儲原理是依靠雙穩態電路。SRAM存儲器的存儲元是一個觸發器,它具有兩個穩定的狀態。SRAM的優點是存取速度快,但存儲容量不如DRAM大。動態MOS隨機讀寫存儲器DRAM的存儲容量極大,通常用作計算機的主存儲器。主存也可以用SRAM實現,只是成本高。與SRAM相比,DRAM成本低、功耗低,但需要刷新。動態RAM存儲信息依靠的是電容。DRAM存儲器的存儲元是由一個MOS晶體管和電容器組成的記憶電路,其中MOS晶體管作為開關使用,而所存儲的信息1或0則是由電容器上的電荷量來體現--當電容器充滿電荷時,代表儲存了1,當電容器放電沒有電荷時,代表存儲了0。讀出過程也是刷新過程。輸入緩沖期與輸出緩沖器總是互鎖的。這是因為讀操作和寫操作是互斥的,不會同時發生。與SRAM不同的是:DRAM增加了行地址鎖存器和列地址鎖存器,增加了刷新計數器和相應的控制電路。DRAM比SRAM集成度更高。DRAM讀出後必須刷新,而未讀寫的存儲元也要定期刷新,而且要按行刷新,所以刷新計數器的長度等於行地址鎖存器。DRAM存儲位元是基於電容器上的電荷量存儲,這個電荷量隨著時間和溫度而減少,因此必須定期地刷新,以保持它們原來記憶的信息。DRAM是易失性存儲器。一次讀操作會自動地刷新選中行中的所有存儲位元。然而通常情況下,人們不能准確地預知讀操作出現的頻率,因此無法阻止數據丟失。在這種情況下,必須對DRAM進行定期刷新。DRAM使用電容存儲,所以必須隔一段時間刷新(refresh)一次,如果存儲單元沒有被刷新,存儲的信息就會丟失。DRAM存儲器有讀周期、寫周期和刷新周期,刷新周期比讀/寫周期有更高的優先權。DRAM存儲器需要逐行進行定時刷新,以使不因存儲信息的電容漏電而造成信息丟失。另外,DRAM晶元的讀出是一種破壞性讀出,因此在讀取之後要立即按讀出信息予以充電再生。動態MOS隨機讀寫存儲器DRAM的存儲容量極大,通常用作計算機的主存儲器。SRAM和DRAM都是隨機讀寫存儲器,它們的特點是數據可讀可寫。ROM叫作只讀存儲器,在它工作時只能讀出,不能寫入,其中存儲的原始數據必須在它工作以前寫入。FLASH叫作快閃記憶體存儲器,是高密度非易失性的讀/寫存儲器,高密度意味著它具有巨大比特數目的存儲容量,非易失性意味著存放的數據在沒有電源的情況下可以長期保存。FLASH存儲元是在EPROM存儲元基礎上發展起來的。快閃記憶體存儲器有三個主要的基本操作,它們是編程操作、讀取操作和擦除操作。可編程ROM有PROM、EPROM、EEPROM。其中,PROM是一次性編程。EPROM叫作光擦除可編程只讀存儲器,它的存儲內容可以根據需要寫入,當需要更新時將原存儲內容抹去,再寫入新的內容。EEPROM叫作電擦除可編程只讀存儲器,其儲存元是一個具有兩個柵極的NMOS管,這種存儲器在出廠時,存儲器內容為全“1”狀態。使用時,可根據要求把某些存儲元寫“0”。EPROM是可改寫的,但它不能用作為隨機存儲器用。
【主存儲器與CPU的連接】
主儲存器和CPU之間增加cache的目的是解決CPU和主存之間的`速度匹配問題。程序和數據存儲在主存中,主存通常採用多體交叉存儲器,以提高訪問速度。cache是一個高速緩沖存儲器,用以彌補主存和CPU速度上的差異。指令部件本身又構成一個流水線,它由取指令、指令解碼、計算操作數地址、取操作數等幾個過程段組成。指令隊伍是一個先進先出(FIFO)的寄存器棧,用於存放經過解碼的指令和取來的操作數。它也是由若干個過程段組成的流水線。執行部件可以具有多個算數邏輯運算部件,這些部件本身又用流水線方式構成。為了使存儲器的存取時間能與流水線的其他各過程段的速度匹配,一般採用多體交叉存儲器。執行段的速度匹配問題,通常採用並行的運算部件以及部件流水線的工作方式來解決。一般採用的方法包括:將執行部件分為定點執行部件和浮點執行部件兩個可並行執行的部分,分別處理定點運算指令和浮點運算指令;在浮點執行部件中,又有浮點加法部件和浮點乘/除部件,它們也可以同時執行不同的指令;浮點運算部件都以流水線方式工作。所謂資源相關,是指多條指令進入流水線後在同一機器時鍾周期內爭用同一個功能部件所發生的沖突。在一個程序中,如果必須等前一條指令 執行完畢後,才能執行後一條指令,那麼這兩條指令就是數據相關的。為了解決數據相關沖突,流水CPU的運算器中特意設置若干運算結果緩沖寄存器,暫時保留運算結果,以便於後繼指令直接使用,這稱為“向前”或定向傳送技術。控制相關沖突是由轉移指令引起的。當執行轉移指令時,依據轉移條件的產生結果,可能為順序取下條指令;也可能轉移到新的目標地址取指令,從而使流水線發生斷流。為了減小轉移指令對流水線性能的影響,常採用以下兩種轉移處理技術:由編譯程序重排指令序列來實現的延遲轉移法、硬體方法來實現的轉移預測法。
【雙口RAM和多模塊存儲器】
雙埠存儲器採用空間並行技術,能進行高速讀/寫操作。雙埠存儲器提供了兩個相互獨立的讀寫電路,可以對存儲器中任意位置上的數據進行獨立的存取操作。事實上雙埠存儲器也可以由DRAM構成。當兩個埠的地址不相同時,在兩個埠上進行讀寫操作,一定不會發生沖突。當兩個埠同時存取存儲器同一存儲單元時,便發生沖突。總之,當兩個埠均為開放狀態且存取地址相同時,發生讀寫沖突。
一個由若干模塊組成的主存儲器是線性編址的,這些地址在各模塊中的安排方式有兩種:一種是順序方式,一種是交叉方式。從定性分析,對連續字的成塊傳送,交叉方式的存儲器可以實現多模塊流水式並行存取,大大提高存儲器的帶寬,由於CPU的速度比主存快,假如能同時從主存取出n條指令,這必然會提高機器的運行速度。多模塊交叉存儲器是一種並行存儲器結構。
【高速緩沖存儲器(cache)】
cache是一種高速緩沖存儲器,是為了解決CPU和主存之間速度不匹配而採用的一項重要技術。其原理基於程序運行中具有的空間局部性和時間局部性特徵。cache能高速地向CPU提供指令和數據,從而加快了程序的執行速度。從功能上看,它是主存的緩沖存儲器,由高速的SRAM組成。為追求高速,包括管理在內的全部功能由硬體實現,因而對程序員是透明的。當前隨著半導體器件集成度的進一步提高,cache已放入到CPU中,其工作速度接近於CPU的速度,從而能組成兩級以上的cache系統。cache除包含SRAM外,還要有控制邏輯。若cache在CPU晶元外,它的控制邏輯一般與主存控制邏輯合成在一起,成為主存/cache控制器;若cache在CPU內,則由CPU提供它的控制邏輯。CPU與cache之間的數據交換是以字為單位,而cache與主存之間的數據交換是以塊為單位。一個塊由若干字組成,是定長的。當CPU讀取內存中一個字時,便發出此字的內存地址到cache和主存。此時cache控制邏輯依據地址判斷此字是否在cache中:若是,此字立即傳送給CPU;若非,則用主存讀周期把此字從主存讀出送到CPU,與此同時,把含有這個字的整個數據塊從主存讀出送到cache中。從CPU看,增加一個cache的目的,就是在性能上使主存的平均讀出時間盡可能接近cache的讀出時間。為了達到這個目的,在所有的存儲器訪問中由cache滿足CPU需要的部分應占很高的比例,即cache的命中率應接近於1.由於程序訪問的局部性,實現這個目標是可能的。運算器由算數邏輯單元(ALU)、通用寄存器、數據緩沖寄存器DR和狀態條件寄存器PSW組成,它是數據加工處理部件。運算器接受控制器的命令而進行動作,即運算器所進行的全部操作都是由控制器發出的控制信號來指揮的,所以它是執行部件。運算器有兩個主要功能:(1)執行所有的算數運算;(2)執行所有的邏輯運算,並進行邏輯測試,如零值測試或兩個值的比較。通常,一個算數操作產生一個運算結果,而一個邏輯操作則產生一個判決。
與主存容量相比,cache的容量很小,它保存的內容只是主存內容的一個子集,且cache與主存的數據交換是以塊為單位。為了把主存塊放到cache中,必須應用某種方法把主存地址定為到cache中,稱做地址映射。“映射”的物理含義是確定位置的對應關系,並用硬體來實現。這樣當CPU訪問存儲器時,它所給出的一個字的內存地址會自動變換成cache的地址。由於採用硬體,這個地址變換過程很快,軟體人員絲毫感覺不到cache的存在,這種特性成為cache的透明性。地址映射方式有全相聯方式、直接方式和組相聯方式三種。在全相聯映射中,將主存中一個塊的地址(塊號)與塊的內容(字)一起存於cache的行中,其中塊地址存於cache行的標記部分中。這種帶全部塊地址一起保存的方法,可使主存的一個塊直接拷貝到cache中的任意一行上。全相聯映射方式的檢索過程:CPU訪存指令指定了一個內存地址(包括主存和cache),為了快速檢,指令中的塊號與cache中所有行的標記同時在比較器中進行比較。如果塊號命中,則按字地址從cache中讀取一個字;如果塊號未命中,則按內存地址從主存中讀取這個字。在全相聯cache中,全部標記用一個相聯存儲器來實現,全部數據用一個普通RAM來實現。全相聯方式的主要缺點是比較器電路難於設計和實現,因此只適合於小容量cache採用。直接映射方式也是一種多對一的映射關系,但一個主存塊只能拷貝到cache的一個特定行位置上去。直接映射方式的優點是硬體簡單,成本低。缺點是每個主存塊只有一個固定的行位置可存放,如果塊號相距m整數倍的兩個塊存於同一cache行時,就要發生沖突。發生沖突時就要將原先存入的行換出去,但很可能過一段時間又要換入。頻繁的置換會使cache的效率下降。因此直接映射方式適合於需要大容量cache的場合,更多的行數可以減小沖突的機會。採用直接映射時,cache無需考慮替換問題。從存放位置的靈活性和命中率來看,全相聯映射方式為優;從比較器電路簡單及硬體投資來說,直接映射方式為佳。組相聯映射方式將cache分成u組,每組v行,主存塊存放到哪個組是固定的,至於存到該組哪一行是靈活的。組相聯映射方式的比較器電路容易設計和實現,而塊在組中的排放又有一定的靈活性,使沖突減少。全相聯映射方式和組相聯映射方式速度較低,通常適合於小容量cache。
cache工作原理要求它盡量保存最新數據。當一個新的主存塊需要拷貝到cache,而允許存放此塊的行位置都被其他主存塊占滿時,就要產生替換。對直接映射方式來說,因一個主存塊只有一個特定的行位置可存放,所以只要把此特定位置上的原主存塊換出cache即可。對全相聯和組相聯cache來說,就要允許存放新主存塊的若干特定行中選取一行換出。cache的替換全部靠硬體實現。
如何選取就涉及替換策略,又稱替換演算法,硬體實現的常用演算法主要有以下三種:1)近期最少使用(LRU)演算法:將近期內長久未被訪問的行換出;2)最不經常使用(LFU)演算法:將一段時間內被訪問次數最少的那行數據換出;3)隨機替換:實際上是不要什麼演算法,從特定的行位置中隨機地選出一行換出即可。在Cache替換演算法中,近期最少使用法比較正確地利用了程序訪存局部性原理,替換出近期用得最少的存儲塊,命中率較高,是一種比較好的替換演算法;隨機法是隨機地確定替換的存儲單元,先進先出法是替換最早調入的存儲單元,它們都沒有根據程序訪存局部性原理,命中率較低;而後進先出法不是cache所使用的替換演算法,此法在堆棧存儲結構中使用。
【虛擬存儲器】
常用的虛擬存儲系統由主存-輔存兩級存儲器組成,其中輔存是大容量的磁表面存儲器。在虛擬存儲器中,主存的內容只是輔存的一部分內容。虛擬存儲系統是為了提高存儲系統的性能價格比而構造的分層存儲體系,力圖使存儲系統的性能接近高速存儲器,而價格和容量接近低速存儲器。虛擬存儲利用了程序運行時的局部性原理把最近常用的信息塊從相對慢速而大容量的存儲器調入相對高速而小容量的存儲器。虛擬存儲主要是解決存儲容量問題,另外還包括存儲管理、主存分配和存儲保護等方面。虛存所依賴的輔存與CPU之間不存在直接的數據通路,當主存不命中時只能通過調頁解決,CPU最終還是要訪問主存。虛存管理由軟體(操作系統)和硬體共同完成,由於軟體的介入,虛存對實現存儲管理的系統程序員不透明,而只對應用程序員透明(段式和段頁式管理對應用程序員“半透明”)。主存未命中時系統的性能損失要遠大於cache未命中時的損失。
【虛擬內存管理】
虛存機制也要解決一些關鍵問題:(1)調度問題:決定哪些程序和數據應被調入主存;(2)地址映射問題:在訪問主存時把虛地址變為主存物理地址,在訪問輔存時把虛地址變為輔存的物理地址,以便換頁;(3)替換問題:解決哪些程序和數據應被調出主存;虛擬存儲器的替換演算法與cache的替換演算法類似,有FIFO演算法、LRU演算法、LFU演算法,虛擬存儲器的替換有操作系統的支持(4)更新問題:確保主存和輔存的一致性。虛擬存儲器分為頁式、段式、段頁式三種。
頁式虛擬存儲系統中,虛地址空間被分成等長大小的頁,稱為邏輯頁;主存空間也被分成同樣大小的頁,稱為物理頁。相應地,虛地址分為兩個欄位:高欄位為邏輯頁號,低欄位為頁內地址(偏移量);實存地址也分為兩個欄位:高欄位為物理頁號,低欄位為頁內地址。通過頁表可以把虛地址(邏輯地址)轉換成物理地址。在大多數系統中,每個進程對應一個頁表。現代的中央處理機通常有專門的硬體支持地址變換。每個進程所需的頁數並不固定,所以頁表的長度是可變的,因此通常的實現方法是把頁表的基地址保存在寄存器中,而頁表本身則放在主存中。由於虛地址空間可以很大,因而每個進程的頁表有可能非常長。由於頁表通常在主存中,因而即使邏輯頁已經在主存中,也要至少訪問兩次物理存儲器才能實現一次訪存,這將使虛擬存儲器的存取時間加倍。為了避免對主存訪問次數的增多,可以對頁表本身實行二級緩存,把頁表中的最活躍部分存放在高速存儲器中。這個專用於頁表緩存的高速存儲部件通常稱為轉換後援緩沖器(TLB),又稱快表。而保存在主存中的完整頁表則稱為慢表。快表的作用是加快地址轉換。TLB的作用和與主存與CPU之間的cache作用相似,通常由相聯存儲器實現,容量比慢表小得多,存儲慢表中部分信息的副本,可以完成硬體高速檢索操作。地址轉換時,根據邏輯頁號同時查快表和慢表,當在快表中有此邏輯號時,就能很快地找到對應的物理頁號。根據程序的局部性原理,多數虛擬存儲器訪問都將通過TLB進行,從而有效降低訪存的時間延遲。由於TLB的緩沖過程與cache的緩沖過程是獨立的,所以在每次存儲器訪問過程中有可能要經歷多次變換。
;⑶ 如何用fpga實現演算法的硬體加速
首先,利用傳統的軟體技巧來優化演算法,然後將其轉向定製指令以加速演算法。我們將討論不同實現方法的性能比較和折衷。
CRC演算法可用來校驗數據在傳輸過程中是否被破壞。這些演算法很流行,因為它們具有很高的檢錯率,而且不會對數據吞吐量造成太大影響,因為CRC校驗位被添加進數據信息中。但是,CRC演算法比一些簡單的校驗和演算法有更大的計算量要求。盡管如此,檢錯率的提高使得這種演算法值得去實施。
一般說來,發送端對要被發送的消息執行CRC演算法,並將CRC結果添加進該消息中。消息的接收端對包括CRC結果在內的消息執行同樣的CRC操作。如果接收端的結果與發送端的不同,這說明數據被破壞了。
CRC演算法是一種密集的數學運算,涉及到二元模數除法(molo-2 division),即數據消息被16或32位多項式(取決於所用CRC標准)除所得的余數。這種操作一般通過異或和移位的迭代過程來實現,當採用16位多項式時,這相當於每數據位元組要執行數百條指令。如果發送數百個位元組,計算量就會高達數萬條指令。因此,任何優化都會大幅提高吞吐量。
代碼列表1中的CRC函數有兩個自變數(消息指針和消息中的位元組數),它可返回所計算的CRC值(余數)。盡管該函數的自變數是一些位元組,但計算要逐位來執行。該演算法並不高效,因為所有操作(與、移位、異或和循環控制)都必須逐位地執行。
列表1:逐位執行的CRC演算法C代碼。
/*
* The width of the CRC calculation and result.
* Modify the typedef for a 16 or 32-bit CRC standard.
*/
typedef unsigned char crc;
#define WIDTH (8 * sizeof(crc))
#define TOPBIT (1 << (WIDTH - 1))
crc crcSlow(unsigned char const message[], int nBytes)
{
crc remainder = 0;
/*
* Perform molo-2 division, a byte at a time.
*/
for (int byte = 0; byte < nBytes; ++byte)
{
/*
* Bring the next byte into the remainder.
*/
remainder ^= (message[byte] << (WIDTH - 8));
/*
* Perform molo-2 division, a bit at a time.
*/
for (unsigned char bit = 8; bit > 0; "bit)
{
/*
* Try to divide the current data bit.
*/
if (remainder & TOPBIT)
{
remainder = (remainder << 1) ^ POLYNOMIAL;
}
else
{
remainder = (remainder << 1);
}
}
}
/*
* The final remainder is the CRC result.
*/
return (remainder);
}
1.傳統的軟體優化
圖3:帶CRC外圍電路和DMA的系統模塊示意圖。
讓我們看一下如何利用傳統的軟體技巧來優化CRC演算法。因為CRC操作中的一個操作數,即多項式(除數)是常數,位元組寬CRC操作的所有可能結果都可以預先計算並存儲在一個查找表中。這樣,通過一個讀查找表動作就可讓操作按逐個位元組執行下去。
採用這一演算法時,需要將這些預先計算好的值存儲在存儲器中。選擇ROM或RAM都可以,只要在啟動CRC計算之前將存儲器初始化就行。查找表有256個位元組,表中每個位元組位置包含一個CRC結果,共有256種可能的8位消息(與多項式大小無關)。
列表2示出了採用查找表方法的C代碼,包括生成查找表crcInit()中數值的代碼。
列表2:採用查找表方法的CRC演算法C代碼。
crc crcTable[256];
void crcInit(void)
{
crc remainder;
/*
* Compute the remainder of each possible dividend.
*/
for (int dividend = 0; dividend < 256; ++dividend)
{
/*
* Start with the dividend followed by zeros.
*/
remainder = dividend << (WIDTH - 8);
/*
* Perform molo-2 division, a bit at a time.
*/
for (unsigned char bit = 8; bit > 0; "bit)
{
/*
* Try to divide the current data bit.
*/
if (remainder & TOPBIT)
{
remainder = (remainder << 1) ^ POLYNOMIAL;
}
else
{
remainder = (remainder << 1);
}
}
/*
* Store the result into the table.
*/
crcTable[dividend] = remainder;
}
} /* crcInit() */
crc crcFast(unsigned char const message[], int nBytes)
{
unsigned char data;
crc remainder = 0;
/*
* Divide the message by the polynomial, a byte at a time.
*/
for (int byte = 0; byte < nBytes; ++byte)
{
data = message[byte] ^ (remainder >> (WIDTH - 8));
remainder = crcTable[data] ^ (remainder << 8);
}
/*
* The final remainder is the CRC.
*/
return (remainder);
} /* crcFast() */
整個計算減少為一個循環,每位元組(不是每位)有兩個異或、兩個移位操作和兩個裝載指令。基本上,這里是用查找表的存儲空間來換取速度。該方法比逐位計算的方法要快9.9倍,這一提高對某些應用已經足夠。如果需要更高的性能,可以嘗試編寫匯編代碼或增加查找表容量以擠出更多性能來。但是,如果需要20、50甚至500倍的性能提高,就要考慮採用硬體加速來實現該演算法了。
表1:各種規模的數據模塊下CRC演算法測試比較結果。
2.採用定製指令方法
CRC演算法由連續的異或和移位操作構成,用很少的邏輯即可在硬體中簡單實現。由於這一硬體模塊僅需幾個周期來計算CRC,採用定製指令來實現CRC計算要比採用外圍電路更好。此外,無須涉及系統中任何其它外圍電路或存儲器。僅需要一個微處理器來支持定製指令即可,一般是指可配置微處理器。
當在硬體中實現時,演算法應該每次執行16或32位計算,這取決於所採用的CRC標准。如果採用CRC-CCITT標准(16位多項式),最好每次執行16位計算。如果使用8位微處理器,效率可能不太高,因為裝載操作數值及返回CRC值需要額外的周期。圖2示出了用硬體實現16位CRC演算法的內核。
信號msg(15..0)每次被移入異或/移位硬體一位。列表3示出了在64KB數據模塊上計算CRC的一些C代碼例子。該實例是針對Nios嵌入式處理器。
列表3:採用定製指令的CRC計算C代碼。
unsigned short crcCompute(unsigned short *data_block, unsigned int nWords)
{
unsigned short* pointer;
unsigned short word;
/*
* initialize crc reg to 0xFFFF
*/
word = nm_crc (0xFFFF, 1); /* nm_crc() is the CRC custom instruction */
/*
* calculate CRC on block of data
* nm_crc() is the CRC custom instruction
*
*/
for (pointer = data_block; pointer < (data_block + nWords); pointer ++)
word = nm_crc(*pointer, 0) return (word);
}
int main(void)
{
#define data_block_begin (na_onchip_memory)
#define data_block_end (na_onchip_memory + 0xffff)
unsigned short crc_result;
unsigned int data_block_length = (unsigned short *)data_block_end - (unsigned short
*)data_block_begin + 1;
crc_result = crcCompute((unsigned short *)data_block_begin, data_block_length);
}
採用定製指令時,用於計算CRC值的代碼是一個函數調用,或宏。當針對Nios處理器實現定製指令時,系統構建工具會生成一個宏。在本例中為nm_crc(),可用它來調用定製指令。
在啟動CRC計算之前,定製指令內的CRC寄存器需要先初始化。裝載初始值是CRC標準的一部分,而且每種CRC標准都不一樣。接著,循環將為數據模塊中的每16位數據調用一次CRC定製指令。這種定製指令實現方式要比逐位實現的方法快27倍。
3.CRC外圍電路方法
如果將CRC演算法作為硬體外圍電路來實現,並利用DMA將數據從存儲器轉移到外圍電路,這樣還可以進一步提高速度。這種方法將省去處理器為每次計算而裝載數據所需要的額外周期。DMA可在此外圍電路完成前一次CRC計算的時鍾周期內提供新的數據。圖3示出了利用DMA、CRC外圍電路來實現加速的系統模塊示意圖。
在64KB數據模塊上,利用帶DMA的定製外圍電路可獲得比逐位計算的純軟體演算法快500倍的性能。要知道,隨著數據模塊規模的增加,使用DMA所獲得的性能也隨之提高。這是因為設置DMA僅需很少的開銷,設置之後DMA運行得特別快,因為每個周期它都可以傳遞數據。因此,若只有少數位元組的數據,用DMA並不劃算。
這里所討論的所有採用CRC-CCITT標准(16位多項式)的演算法都是在Altera Stratix FPGA的Nios處理器上實現的。表1示出了各種數據長度的測試比較結果,以及大致的硬體使用情況(FPGA中的存儲器或邏輯單元)。
可以看出,演算法所用的硬體越多,演算法速度越快。這是用硬體資源來換取速度。