關于x86、x86_64/x64、amd64和arm64/aarch64

關于x86、x86_64/x64、amd64和arm64/aarch64

轉自:https://www.jianshu.com/p/2753c45af9bf

為什么叫x86和x86_64和AMD64?

為什么大家叫x86為32位系統?

為什么軟件版本會注明 for amd64版本,不是intel64呢?

x86是指intel的開發的一種32位指令集,從386開始時代開始的,一直沿用至今,是一種cisc指令集,所有intel早期的cpu,amd早期的cpu都支持這種指令集,intel官方文檔里面稱為“IA-32”

x84_64是x86 CPU開始邁向64位的時候,有2選擇:

1、向下兼容x86。

2、完全重新設計指令集,不兼容x86。

AMD搶跑了,比Intel率先制造出了商用的兼容x86的CPU,AMD稱之為AMD64,搶了64位PC的第一桶金,得到了用戶的認同。

Intel選擇了設計一種不兼容x86的全新64為指令集,稱之為IA-64(這玩意似乎就是安騰),但是比amd晚了一步,而且IA-64也挺慘淡的,因為是全新設計的CPU,沒有編譯器,也不支持windows(微軟把intel給忽悠了,承諾了會出安騰版windows server版,但是遲遲拿不出東西)。后來不得不在時機落后的情況下也開始支持AMD64的指令集,但是換了個名字,叫x86_64,表示是x86指令集的64擴展,大概是不愿意承認這玩意是AMD設計出來的。

實際上,x86_64,x64,AMD64基本上是同一個東西,我們現在用的intel/amd的桌面級CPU基本上都是x86_64,與之相對的arm,ppc等都不是x86_64。

x86、x86_64主要的區別就是32位和64位的問題,x86中只有8個32位通用寄存器,eax,ebx,ecx,edx, ebp, esp, esi, edi。

x86_64把這8個通用寄存器擴展成了64位的,并且比x86增加了若干個寄存器(好像增加了8個,變成了總共16個通用寄存器)。同樣的MMX的寄存器的位數和數量也進行了擴展。此外cpu擴展到64位后也能支持更多的內存了,等等許多好處。

對于普通程序來說,CPU位數的擴展、寄存器數量的增加不會帶來明顯的性能提升,比如IE瀏覽器、Office辦公這類的軟件。特定的程序很能夠充分利用64位CPU、更多的寄存器帶來的優勢,比如MMX除了能提升多媒體程序的性能,對矩陣、多項式、向量計算都能帶來提升,更多的MMX寄存器、更大的寄存器字長都有利于SIMD指令的執行,能夠提升CPU對數據的吞吐量(RISC指令集的CPU動不動就有數百個寄存器,可以有效的緩存中間計算結果,不需要把中間結果寫入內存,從而減少內存訪問次數,顯著提升性能)

x86

x86架構(The x86 architecture)是微處理器執行的計算機語言指令集,指一個intel通用計算機系列的標準編號縮寫,也標識一套通用的計算機指令集合。

1978年6月8日,Intel發布了新款16位微處理器“8086”,也同時開創了一個新時代:x86架構誕生了。

在40年的發展史中,x86家族不斷壯大,從桌面轉戰筆記本、服務器、超級計算機、編寫設備,期間還挫敗或者限制了很多競爭對手的發展,讓不少處理器廠商及其架構技術成為歷史名字,即使有些封閉發展的也難以為繼,比如蘋果就已經放棄PowerPC了。

AMD64/x86-64

**x86-64有時會簡稱為“x64”,是64位微處理器架構及其相應指令集的一種,**也是Intel x86架構的延伸產品。

“x86-64”1999由AMD設計,AMD 首次公開 64 位集以擴充給 IA-32,稱為 x86-64(后來改名為 AMD64)。 AMD64架構在IA-32上新增了64位寄存器,并兼容早期的16位和32位軟件,可使現有以x86為對象的編譯器容易轉為AMD64版本。

由于AMD64和Intel64基本上一致,很多軟硬件產品都使用一種不傾向任何一方的詞匯來表明它們對兩種架構的同時兼容。出于這個目的,AMD對這種CPU架構的原始稱呼 - “x86-64”被不時地使用,還有變體“x86_64”。其他公司如微軟和Sun在營銷資料中使用“x64”作為對“x86-64”的縮寫。

許多操作系統及產品,尤其那些是在Intel進入這塊市場之前就引入“x86-64”支持的,使用“AMD64”或“amd64”同時指代AMD64和Intel64。

現在的x86 CPU在位數上有32/64bit之分,在ARCH上有又x86/x86_64/x64/i386/IA32/IA64/amd64

最近又新出來一個x32,還好不是ARCH,只是ABI,沒有那么混亂。

先說一下x86的這些arch,不要求很嚴格的話,基本上可以用下面的公式來表達:

x86=i386=IA32

amd64=x86_64=x64!=IA64

其實這兩個等式里很多都是別名,嚴格說的話,x86的世界里只存在x86/x86_64/IA64三種架構。

當年AMD先于Intel推出向下兼容的amd64 CPU,而Intel推出的不兼容32位系統的IA64慘淡收場(被MS放了鴿子),后來Intel在指令上支持了amd64,不過不愿意叫amd64,改了個名字x86_64。

再說64bit/32bit的兼容性問題:

現在的64bit CPU實際上都做了兼容32bit的特殊設計,所以64bit的CPU上運行32bit的軟件(包括kernel/app, driver除外)是沒有問題。反過來,32bit的CPU上運行64bit的軟件是不可以的。

最后說重點,64bit相比32bit的性能優勢:

這里不考慮64bit硬件上運行32bit軟件的這種過度方式。

從架構上來說,64bit擁有64bit 的register和64bit的bus,在數據傳輸效率上比32bit要高不少;另外,64bit地址總線的尋址空間突破了4G的限制。

所以,對于大內存,密集數據運算的應用場景,64bit的優勢是非常明顯的。網上有一些benchmark,這里不貼了。

但是,對于小內存系統,64bit的CPU在某些狀況下可能比32bit CPU的效率更低。

因為64 bit的CPU的地址是64位的,指針是64位的,編譯生成的二進制文件更大,運行時占用的內存更多;另一方面,因為64位地址的問題,cache中能存放的指令就更少,所以更容易導致cache的miss。

所以在某些應用場景,64 bitCPU的更大的尋址空間,更快的數據傳遞,更快的浮點運算的特性, 與其64 bit的地址/指針所導致的cache miss的特性,始終并存。

為了充分利用64的優勢,又避免64bit地址導致的cache miss的問題,Intel提出了x32 ABI的概念。

x32不是一個ARCH,是一個ABI。

x32可以充分的使用64 bit硬件的64 bit寄存器,64bit總線,以及64bit新增的指令,從而獲得更快的數據處理速度。

同時x32又使用32bit的地址/pointer,32bit的C數據類型,因此cache miss并不會增加。

x32是一個ABI,其設計到的部分包括:kernel的support,toolchain的support,system lib的support。現在kernel(from 3.4)和toolchain的support都已經OK。

ARM,AMD,X86,AArch64的概念

AMD,中文名(超威)超微半導體,是除了英特爾以外最大的x86架構微處理供應商,也是除了英偉達以外僅有的獨立圖形處理供應商。

x86泛指一系列由英特爾公司開發的處理器的架構,最早為1978年面世的“Intel 8086”CPU。早期的處理器均是以此格式來命名,如Intel 8086,80186,80286,80386,80486,這些架構被統稱為x86。由于數字不能被注冊成為商標,因此公司每當有新的處理器使用,均會采用可注冊的名稱,如Pentium。

基于x86的32位架構(常被稱為i386,x86),IA-32,而基于x86的64位架構,x86-64常稱為AMD64或Intel64。最早是由AMD公司首先根據x86的架構生產出了64位的處理器,但是由于是競爭關系,Intel公司不愿意承認AMD64,近些年才推出了Intel64

ARM(英文為Advanced RISC Machine,或Acorn RISC Machine)也是一個架構,非常適用于移動通信這種低成本,高性能,低耗電的領域。ARM的公司為安謀控股(ARM Holding plc),又稱為ARM公司,總部位于劍橋的設計與軟件公司,現在已被日本的軟銀公司收購,后者同時也是國內互聯網巨頭阿里巴巴的最大股東。

AArch64是ARMv8的一種執行狀態。

為了更廣泛地向企業領域推進,需要引入 64 位構架,同時也需要在 ARMv8 架構中引入新的 AArch64 執行狀態。

AArch64 不是一個單純的 32 位 ARM 構架擴展,而是 ARMv8 內全新的構架,完全使用全新的 A64 指令集。這些都源自于多年對現代構架設計的深入研究。更重要的是, AArch64 作為一個分離出的執行狀態,意味著一些未來的處理器可能不支持舊的 AArch32 執行狀態。

雖然最初的 64 位 ARM 處理器將會完全向后兼容,但我們大膽且前瞻性地將 AArch64 作為在 ARMv8 處理器中唯一的執行狀態。我們在這些系統中將不支持 32 位執行狀態, 這將使許多有益的實現得到權衡,如默認情況下,使用一個較大的 64K 大小的頁面,并會使得純凈的 64 位 ARM 服務器系統不受遺留代碼的影響。立即進行這種劃分是很重要的,因為有可能在未來幾年內將出現僅支持 64 位的服務器系統。沒有必要在新的 64 位架構中去實現一個完整的 32 位流水線,這將會提高未來 ARM 服務器系統的能效。

這樣回想起來, AArch64 作為在 Fedora ARM 項目中被支持的 ARM 構架是一個很自然的過程: armv5tel、armv7hl、aarch64。新的架構被命名為:aarch64,這同 ARM 自己選擇的主線命名方式保持一致,同時也考慮到了 ARM 架構名與 ARM 商標分開的期望。

ARMv8-A 將 64 位架構支持引入 ARM 架構中,其中包括:

64 位通用寄存器、SP(堆棧指針)和 PC(程序計數器)

64 位數據處理和擴展的虛擬尋址

兩種主要執行狀態:

AArch64 - 64 位執行狀態,包括該狀態的異常模型、內存模型、程序員模型和指令集支持

AArch32 — 32 位執行狀態,包括該狀態的異常模型、內存模型、程序員模型和指令集支持

這些執行狀態支持三個主要指令集:

A32(或 ARM):32 位固定長度指令集,通過不同架構變體增強部分 32 位架構執行環境現在稱為 AArch32。

T32 (Thumb) 是以 16 位固定長度指令集的形式引入的,隨后在引入 Thumb-2 技術時增強為 16 位和 32 位混合長度指令集。部分 32 位架構執行環境現在稱為 AArch32。

A64:提供與 ARM 和 Thumb 指令集類似功能的 32 位固定長度指令集。隨 ARMv8-A 一起引入,它是一種 AArch64 指令集。

ARM ISA 不斷改進,以滿足前沿應用程序開發人員日益增長的要求,同時保留了必要的向后兼容性,以保護軟件開發投資。在 ARMv8-A 中,對 A32 和 T32 進行了一些增補,以保持與 A64 指令集一致。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532683.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532683.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532683.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

實驗報告: 線性表的基本操作及應用

實驗報告: 線性表的基本操作及應用 實驗內容 基本要求: (1)實現單鏈表的創建;(2)實現單鏈表的插入;(3)實現單鏈表的刪除 (4)實現單鏈…

TVM:源碼編譯安裝

TVM:Linux源碼編譯安裝 筆者環境: OS:Ubuntu 18.04 CMake:3.10.2 gcc:7.5.0 cuda:11.1 編譯安裝過程總覽 本文將簡介 tvm 的編譯安裝過程,包含兩個步驟: 通過C代碼構建共享庫設置相…

第2章線性表的基本使用及其cpp示例(第二章匯總,線性表都在這里)

2.1線性表的定義和特點 【類型定義: *是n個元素的有限序列 *除了第一個元素沒有直接前驅和最后一個沒有直接后驅之外,其余的每個元素只有一個直接前驅和直接后驅; (a1,a2…an) 【特征: *有窮性&#xff1…

TVM:通過Python接口(AutoTVM)來編譯和優化模型

TVM:通過Python接口(AutoTVM)來編譯和優化模型 上次我們已經介紹了如何從源碼編譯安裝 tvm,本文我們將介紹在本機中使用 tvm Python 接口來編譯優化模型的一個demo。 TVM 是一個深度學習編譯器框架,有許多不同的模塊…

TVM:在樹莓派上部署預訓練的模型

TVM:在樹莓派上部署預訓練的模型 之前我們已經介紹如何通過Python接口(AutoTVM)來編譯和優化模型。本文將介紹如何在遠程(如本例中的樹莓派)上部署預訓練的模型。 在設備上構建 TVM Runtime 首先我們需要再遠程設備…

2.2線性表的順序表

2.2.1線性表的順序表示和實現------順序映像 【順序存儲】在【查找時】的時間復雜度為【O(1)】,因為它的地址是連續的,只要知道首元素的地址,根據下標可以很快找到指定位置的元素 【插入和刪除】操作由于可能要在插入前或刪除后對元素進行移…

TVM:交叉編譯和RPC

TVM:交叉編譯和RPC 之前我們介紹了 TVM 的安裝、本機demo和樹莓派遠程demo。本文將介紹了在 TVM 中使用 RPC 進行交叉編譯和遠程設備執行。 通過交叉編譯和 RPC,我們可以在本地機器上編譯程序,然后在遠程設備上運行它。 當遠程設備資源有限…

2.3單鏈表的基本使用及其cpp示例

2.3線性表的鏈式表現與實現 2.3.1.1單鏈表 【特點: *用一組任意的存儲單元存儲線性表的數據元素 *利用指針實現用不同相鄰的存儲單元存放邏輯上相鄰的元素 *每個元素ai,除存儲本身信息外,還存儲其直接后繼的元素(后一個元素的地址…

TVM:簡介

TVM:簡介概述 Apache TVM 是一個用于 CPU、GPU 和機器學習加速器的開源機器學習編譯器框架。它旨在使機器學習工程師能夠在任何硬件后端上高效地優化和運行計算。本教程的目的是通過定義和演示關鍵概念,引導您了解 TVM 的所有主要功能。新用戶應該能夠從…

2.3.3單鏈表的雙向鏈表

2.3.3雙向鏈表 插入、刪除 指在前驅和后驅方向都能游歷(遍歷)的線性鏈表 雙向鏈表的每個結點有兩個指針域 【結構】:prior data next 雙鏈表通常采用帶頭結點的循環鏈表形式 可理解為首位相接的數據“圈”,每個結點都可以向前…

nvidia-smi 命令詳解

nvidia-smi 命令詳解 簡介 nvidia-smi - NVIDIA System Management Interface program nvidia smi(也稱為NVSMI)為來自 Fermi 和更高體系結構系列的 nvidia Tesla、Quadro、GRID 和 GeForce 設備提供監控和管理功能。GeForce Titan系列設備支持大多數…

2.4一元多項式的表示及相加,含cpp算法

2.4一元多項式的表示及相加 n階多項式的表示: n階多項式有n1項 指數按升冪排序 【 優點: 多項式的項數可以動態增長,不存在存儲溢出的問題插入,刪除方便,不移動元素 【表示: 有兩個數據域,一…

TVM:使用Tensor Expression (TE)來處理算子

TVM:使用Tensor Expression (TE)來處理算子 在本教程中,我們將聚焦于在 TVM 中使用張量表達式(TE)來定義張量計算和實現循環優化。TE用純函數語言描述張量計算(即每個表達式都沒有副作用)。當在 TVM 的整體…

4-數據結構-串的學習

4.1串類型的定義 1.串:(或字符串) 串是由多個字符組成的有限序列,記作:S‘c1c2c3…cn’ (n>0) 其中S是串的名字,‘c1c2c3…cn’ 是串值 ci是串中字符 n是串的長度,表示字符的數目 空串&a…

Linux下rm誤刪恢復 extundelete

Linux下rm誤刪恢復 extundelete 誤刪之后要第一時間卸載(umount)該分區,或者以只讀的方式來掛載(mount)該分區,否則覆寫了誰也沒辦法恢復。如果誤刪除的是根分區,最好直接斷電,進入…

5-數據結構-數組的學習

5.1數組的定義 定義: 由一組類型相同的數據元素構成的有序集合,每個數據元素稱為一個數據元素(簡稱元素),每個元素受n(n>1)個線性關系的約束,每個元素在n個線性關系中的序號i1、…

timm 視覺庫中的 create_model 函數詳解

timm 視覺庫中的 create_model 函數詳解 最近一年 Vision Transformer 及其相關改進的工作層出不窮,在他們開源的代碼中,大部分都用到了這樣一個庫:timm。各位煉丹師應該已經想必已經對其無比熟悉了,本文將介紹其中最關鍵的函數之…

C--數據結構--樹的學習

6.2.1二叉樹的性質 1.二叉樹 性質: 1.若二叉樹的層次從1開始,則在二叉樹的第i層最多有2^(i-1)個結點 2.深度為k的二叉樹最多有2^k -1個結點 (k>1) 3.對任何一顆二叉樹,如果其葉結點個數為n0,度為2的非葉結點個數…

TVM:使用 Schedule 模板和 AutoTVM 來優化算子

TVM:使用 Schedule 模板和 AutoTVM 來優化算子 在本文中,我們將介紹如何使用 TVM 張量表達式(Tensor Expression,TE)語言編寫 Schedule 模板,AutoTVM 可以搜索通過這些模板找到最佳 Schedule。這個過程稱為…

TVM:使用 Auto-scheduling 來優化算子

TVM:使用 Auto-scheduling 來優化算子 在本教程中,我們將展示 TVM 的 Auto-scheduling 功能如何在無需編寫自定義模板的情況下找到最佳 schedule。 與基于模板的 AutoTVM 依賴手動模板定義搜索空間不同,auto-scheduler 不需要任何模板。 用…