海光編譯器
A. 突破封鎖!國產晶元終於有了自己的指令集
在半導體晶元領域, 指令系統是一切軟硬體生態的起點 。
以大家最熟悉的ARM和X86為例,它們就分別隸屬於RISC精簡指令集和CISC復雜指令集。
隨著物聯網、5G、AI新興領域的興起,RISC-V和MIPS兩大精簡指令集架構也頻繁出現在我們的視野內。
所謂晶元,其實都是由半導體堆出來的硬體電路,晶體管越多往往代表性能和功能越強。但無論是超級計算機還是智能手環, 它們搭載的處理器都只能識別二進制數據 。
想讓這些晶元正常運行,處理復雜的應用場景,首先就要教會它們學會類似九九乘法表的「演算法口訣」和「數學公式」, 而這些演算法口御橋早訣/公式其實就是所謂的「指令集」 。
換句話說, 指令集的功能和效率(演算法口訣/公式的類型),在很大程度上就決定了各類晶元的成就和算力的上限 。
雖然海思麒麟、龍芯、兆芯、海光、紫光、澎湃等國產晶元都在各自領域取得了不俗的成績,但無論是它們,還是其他採用X86、ARM、MIPS、RISC-V、Alpha和Power,選擇封閉、授權還是開源的國產晶元項目,其底層的指令集根基都掌握在別人手裡。
因此, 只有從指令系統的根源上實現自主,才能打破軟體生態發展受制於人的枷鎖 。
好消息是,日前龍芯中科就正式發布了自主指令系統架構「Loongson Architecture」,簡稱為「龍芯架構」或者「LoongArch」。它包括基礎架構部分,以及向量擴展LSX、高級向量擴展LASX、虛擬化LVZ、二進制翻譯LBT等擴展部分,總共接近2000條指令。同時不包含龍芯此前使用的MIPS指令系統, 並具有完全自主、技術先進、兼容生態三個方面的特點 。
目前,採用LoongArch的龍芯3A5000處理器晶元已經流片成功,完整操作系統也已穩定運行,它能對多種國際主流指令系統的高效二進制翻譯鏈,並成功演示了運行基於其它主流指令系統的復雜應用程序。
LoongArch對MIPS指令的翻譯效率是100%性能,對ARM指令翻譯的效率是90%性能,對x86的翻譯效率是80%性能。
此外,龍芯中科還在聯合產業鏈夥伴在適當的時間建立開放指令系統聯盟,在聯盟成員內免費共享LoongArch及有關龍芯IP核。
所謂IP核,我們可以理解為ARM旗下的Cortex-A78和Cortex-A55等,後置都是基於ARMv8指令集打造的核心IP架構,並授權給了高通、三星、聯發科等晶元商開發SoC移動平台。
目前,ARM剛剛發布了ARMv9指令集,如果不出意外將在下半年發布的Cortex-A79和Cortex-X2架構就將採用這套指令集。
近10年來32位手機處理器都是基於ARMv7指令集打造,在A75之前的處理器則是基於ARMv8-A設計,隨後都是ARMv8.2-A一統江湖
ARM指令集可以細分為Cortex-A(ARMv-A)、Cortex-R(ARMv-R)和Cortex-M(ARMv-M),分別適用於不同類型的晶元
比如車載晶元使用的就是Cortex-R(ARMv-R)核心IP
總之, 設計出一個純國產的自主指令集只是萬里長征的第一步 ,關鍵是後續要做出懂這個指令集的CPU(已經有了龍芯3A5000),再往後還需要鎮雀讓和人類交互的「翻譯家」——編譯器懂這個指令集。也就是需要不斷完善軟硬體生態,讓我們熟悉的系統、辦公、 娛樂 和 游戲 程序都能運行在這套指令集打造的晶元之上。如果做不到這一步,國產指令集和相關晶元也只是空中樓閣而已、
作為國人,我們真心希望LoongArch這種國產指令集可以取得成功,今後無論手機、電腦、車載還是其消沖他半導體晶元都能以使用國產指令集為榮,並走向世界。
擴展小知識
那麼,指令集又是如何影響晶元執行效率的?
我們以RISC和CISC,讓它們分別執行「清潔地面」的命令為例,看看其背後的指令邏輯差異。
邏輯上,「清潔地面」的大概思路是先拿起掃帚,掃地;拿起簸箕,用掃帚把垃圾掃進簸箕;放下掃帚和簸箕,潤濕墩布;再用墩布擦地,直至清潔地面完成。
對CISC復雜指令集而言,很容易理解「清潔地面」這套邏輯,下達「清潔地面」命令後,就能按照規則和順序,一步步自動完成。
對於RISC精簡指令集而言,它一下子可理解不了如此復雜的邏輯,必須將復雜的邏輯順序拆分,然後按照一項項簡單的命令去完成復雜的操作。
比如,想讓RISC精簡指令集完成「清潔地面」命令,就必須依次下達「拿起掃帚」、「掃地」、「拿起簸箕」、「把垃圾掃進簸箕」、「放下掃帚和簸箕」、「潤濕墩布」、「墩地」……
看起來CISC復雜指令集方便又強大?沒錯,如果要同時清潔無數房間地面,你只要對著不同的房屋說「清潔地面」、「清潔地面」、「清潔地面」……即可。
而對RISC精簡指令集,你需要對著每個房間都重復一整套復雜的命令,如果下達指令的人嘴巴不夠快(帶寬不夠大),那清潔地面的效率自然受到影響,難以和CISC復雜指令集抗衡。
但是, 現實生活中,並非所有房間的地面都需要一整套的清潔流程,比如你只需要墩地一個步驟。
對RISC精簡指令集而言,你只需對著需要清潔的房間說「墩地」、「墩地」、「墩地」即可。而由於CISC復雜指令集沒有單獨的「墩地」動作,操作起來就要麻煩許多,完成相同的墩地操作會消耗更多資源,翻譯過來就是發熱更高更費電。
這就是RISC和CISC的本質區別。 說不上誰好誰壞,只能說它們所擅長的領域各不相同。
以ARM架構為代表的RISC精簡指令集,最適合針對常用的命令進行優化,賦予它更簡潔和高效的執行環境,對不常用的功能則通過各種精簡指令組合起來完成。
RISC是將復雜度交給了編譯器,犧牲了程序大小和指令帶寬,從而換取了簡單和低功耗的硬體實現。
對以X86架構為代表的CISC復雜指令集,則適合更加復雜的應用環境。
CISC是以增加處理器本身復雜度作為代價,以犧牲功耗為代價去換取更高的性能。不過,X86架構則可通過對新型指令集的支持(如SSE4.1、AVX-512等),在一定程度上提高指定任務的執行效率和降低功耗。
現在晶元領域是RISC攻,CISC守的格局。以蘋果M1為代表的ARM架構RISC指令集晶元正在染指傳統的X86 PC市場,而且大概率會取得成功。雖然以英特爾為代表的X86陣營曾多次試圖反擊Android生態(如早期的Atom晶元),但最終卻都以失敗告終。ARM最新發布的ARMv9指令集,就給了ARM晶元入侵X86 PC大本營更多彈葯,也許用不了多久Windows ARM版PC也將成為一個更加重要的PC品類。
B. hitechccompiler是什麼東西
HI-TECH是high technological高科技的意思:C compiler指的是C編譯器,PIC是單片機,所以就是高科技的C編譯器單片機。
高科技並不神秘,它其實就在我們身邊。它以人為本,是人類智慧的展現。撲面而來的高科技浪潮沖擊著、改變著人類社會生活的各個領域,也沖擊著、震撼著每個人的心。高科技關注每一個人,每一個人關注高科技。
高新科技在強烈地沖擊和改變著我們的生產方式和生活方式。同時也在深刻地影響著我們的國家安全.隨著科學技術的不斷發展,國家安全的內涵也在不斷擴大。
進入21世紀20年代以來,國家安全包括經濟安全、文化安全、國防安全、社會安全和生態安全等諸多方面,科學技術的發展對於這些方面的影響是巨大而深遠的。
介紹
一般認為,高科技是一種人才密集、知識密集、技術密集、資金密集、風險密集、信息密集、產業密集、競爭性和滲透性強,對人類社會的發展和進步具有重大影響的前沿科學技術。
通俗的理解,就是高科技必須進行產業化,才能形成產業規模效益。並且高科技無國界。需要全球高科技產業聯合應對人類共同的命運問題。
C. HI-TECHCCompilerforthePIC是什麼東西
HI-TECH是high technological高科技的意思:C compiler指的是C編譯器,PIC是單片機,所以就是高科技的C編譯器單片機。
高科技並不神秘,它其實就在我們身邊。它以人為本,是人類智慧的展現。撲面而來的高科技浪潮沖擊著、改變著人類社會生活的各個領域,也沖擊著、震撼著每個人的心。高科技關注每一個人,每一個人關注高科技。
從世界各國高科技的發展來看,高科技不是一個單項技術,而是科學、技術、工程最前沿的新技術群。這個群體的各種成分,互相影響,互相補充,互相促進。同時,由於高科技是與高技術產業連結在一起的,因此它又是科學、技術、生產一體化的生產體系,並且受到市場的大力推動。
除此之外,高科技也不同於一般科技意義上的所謂「經驗的積累」。它不是什麼積累起來的經驗,而是基於科學的發現或創造而產生的科技。
D. LLVM - 工具
LLVM工具通過調用LLVM的一部分庫,實現庫的功能,通常使用編譯器或者開發編譯器的人會用到這些工具。
這是一個在LLVM IR級別做程序優化的工具,輸入和輸出都是LLVM IR。編譯器,或者基於LLVM做優化的開發者通常會使用這一標准工具來查看優化的效果。它也提供了很多option, 可以執行某一特定的pass。
這是微觀意義上的LLVM編譯器,不同於gcc的編譯器,它的輸入是LLVM IR,輸出是匯編文件或者是目標文件。通過-filetype=asm或者-filetype=obj來指定輸出是匯編文件還是目標文件,若生成是目標文件,llc會調用LLVM中的匯編輸出的代碼庫來工作(注意這個匯編器和gcc的匯編器也不同,它輸入的是MI,是一種後端的中間表示)。除此之外,還可以用-On來指定優化級別(llc默認優化級別是-O2),或者其他一些參數。
(.bc文件換成.ll文件也可以)
這是LLVM匯編器,它輸入匯編文件,輸出目標文件, 類似於gnu中的as命令。同時,它也可以反匯編,指定特殊參數(–disassemble)就行。可以發現,llc和llvm-mc都會調用到輸出目標文件的庫,也就是MCObjectStreamer。
這個工具是LLVM IR的解釋器,也是一個JIT編譯器。LLVM可以把C語言翻譯成LLVM IR,然後解釋執行,與Java的那一套類似,這也是最初LLVM編寫時的實現(一個虛擬機運行IR)。
最早看到這個工具,以為是鏈接器,其實它是IR級別的鏈接器,鏈接的是IR文件。談到這里,可以說一下LLVM針對多個源文件編譯時的兩種目標碼輸出方式。
第一種是LLVM先通過前端把每個源文件單獨翻譯成IR級別,然後用llvm-link鏈接成一個IR,然後再經過優化、後端等步驟生成目標文件,使用llvm-link的同時,可以使用鏈接時優化。不過需要注意,這種方式同樣需要最終調用鏈接器,將這個目標文件鏈接成可執行文件。
第二種是LLVM通過前端把每個源文件單獨翻譯後,再單獨經過優化、後端等工作,將每個源文件生成目標文件,之後再調用鏈接器,將所有目標文件鏈接成可執行文件。
這是針對LLVM IR的匯編器,其實名字里帶as,實際上不是gcc那個as,它的功能是將.ll文件翻譯為.bc文件,LLVM項目里,.ll稱為LLVM匯編碼,所以llvm-as也就是IR的匯編器了。
與llvm-as剛好相反,IR的反匯編器,用來將.bc文件翻譯為.ll文件。
最後也提一下clang,它也是現在LLVM項目中一個很重要的前端工具。clang能夠調用整個編譯器的流程,也就是上邊其他工具調用的庫,它很多都同樣會調用。clang通過指定-emit-llvm參數,可以配合-S或-c生成.ll或.bc文件,這樣我們就能把Clang的部分和LLVM的後端分離開來獨立運行,對於觀察編譯器流程來說,很實用。
還有一些其他工具,就不舉例了,可以查看LLVM項目路徑下/src/tools/中查看。