海光编译器
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/中查看。