在座各位好,就是向大家介绍一下,我们就是开发将近一年的一个开源AI出来的器。OK,首先在介绍之前呢,我想问一下大家,大家有谁是在平常科研或者工作过程中使用Skala语言的?对,好的,那接下来的话就是,我想说一下,就是因为我们这个VIRULE项目的话是基于Skala和Chisel的,所以说,总体我们这个VIRULE和Skala和Chisel的关系,就是这个三角,这个金色还行一样,而Skala呢,作为一个母语言,然后Chisel呢,是基于Skala开发了一个DSL语言,然后SDXL的话,ZelixSDXL是我们的一个测试部的平台,然后,基于这三个,这三个部件,然后我们去开发这个VIRULE,开源AI处理器。接下来的话,我将先为大家介绍一下Skala和Chisel,比较简单的课程吧一下,因为大家给一些比较好的变成技术,只需要做一些语法就可以了。嗯,好的。呃,那首先呢,我给大家,呃,演示一段这个Chisel的代码,其实是Skala和Chisel混合了,混合了一个功能模块,就这个功能模块呢,我们叫做Top Model,然后呢,嗯,会发现比如说很多像这List,还有这Map,其实都是Skala里面的一些原特性,但是呢,在这个Module里面和这个Adder,其实就是Skala,呃,就是Chisel一些,它自定义的一些类,Module,然后,就这个Module里呢,我们就开发了一个加发器,还有一个,呃,呃,就是一个Module Player,OK,这默认应该是有一个微宽的。行,这是为大家就是简单的试力一下它们一个混合开发的一个代码。那接下来的话,就是首先我为大家介绍一下这个Skala的特性。呃,Skala的话,它其实是跟Java是可以混合使用的,都是基于GVM,嗯,它有比较好的面相对相的一个特性,还有这个方式边长,所以说,这两个特性呢,而且基于此呢,Skala还有非常,嗯,基于此,使得Skala就非常好的一个灵活性,就是它可以被广泛的用于速度遗言来去开发一些DSL也。OK,然后,呃,这是第四点,就是比较好的扩展性,呃,现在有很多,就我们所了解的GVM,基于Skala就开发了一些硬件开发语言,还有一些其他的语言都有,而且Skala也广泛用在,比如Spark里面,用Skala去编程和开发,嗯,OK,这是比较简单的一些定义,好吧,我们前面的话就比较快速过一下,因为呃,编程语言其实可能就是大同小异,但是把一些具体不同的地方给大家说一下,比如说在Skala里面的话,我用VAR去,VAR其实就是Varable,它这个定义的变量名的话,就是可归性值,就是可变的,而VAL其实就是Value,它的变量名呢,就是不可被存互置,呃,这是简单的两个,就是在命令上输了一个代码,然后这块的话就是基本类型,by the salt in the long,就跟加碼是比较像,呃,再然后的话就是它的一个函数,它的函数定,函数的方法定义方法的话,就是跟加碼也不太一样了,OK,它就是,呃,deep,然后max,然后它的一个类型的话是放在这个变量名的后边,然后反归值的类型是放在这个,呃,函数名的后面,然后拥抱号,然后是这是函数体,OK,呃,然后的话就是函数颗体化,这是我为什么要把这个特性拿出来呢,因为这个特性的话在,呃,这个特性的话在,呃,这个特性的话在,呃,这个特性的话在,呃,这个特性的话在,呃,这个特性的话在,呃,这个特性的话在,呃,这个特性的话在,呃,这个特性的话在切捉也用的比较多,这个函数可以有任意的参数列表,然后当参数列表就一个参数的时候,我可以用原划后发号来包裹,对,比如像这个artcury,还有多个参数列表,但这些具体的话,大家有兴趣的话可以再查一下,这就是简单的泡砖引誉,嗯,传名,传名函数,这里是一个五三函数入参,然后它用这个等号,然后大一号来去表示,嗯,传名,传名函数,这里是一个五三函数入参,然后它用这个等号,然后大一号来去表示,嗯,传名,传名函数,这里是一个五三函数入参,然后它用这个等号,然后大一号来OK,嗯,这是类,对,刚才我们提到第一点的话,它就是Skyla一个面向对象的一个特性,所以说,它这个,它有类合对象,类的话,在类里面的话,就是Var和Var修设的变量比较自断,然后自断的方法从中为成员,然后还有一些public,private的一些,这些选项设计,嗯,这个粒子的话,就是一个sillen的一个粒子,就是对于Skyla里面的类,然后类的话,就是对于Skyla里面的类,对于Skyla里面的类,对于Skyla里面的类,对于Skyla里面的类,对于Skyla里面的类,对于Skyla里面的类,然后类的话,可以继承超类,但是它不能多度计成,所以呢它就对Skyla里面也有一个cheat,对它的话,就是一个叫做特制,这是对象,对象的话,就是我们比如说,在Skyla里面开发的话,我可以用Dinoc class来去循找一个对象,这样没有数乱限制,但是我也可以用推用帧一个Object,去订一个对象,那这样是一个单粒对象,他只有一个,然后就是cheat,刚才我提到了,reach,就是它可以去多重继承多个trade也不能说继承吧 叫混入就是混入多个trade而不同的一些抽象的特征啊 或者什么的可以放在trade里面它的功能其实类似于加碼层面一块费然后这里的话就是介绍一下我们在其中能进化用到的比如说数组啊类似原组然后其中一些set里面有一些要常用的一些APIMap, forage, or zip而且都Skala的语法 但是在起手里面去做硬件开发的时候 其实非常的方便比如说我想生成一堆这种计算器或者生成一堆这种加码器 我不用像vialog里面 我一个一个就写我就可以直接就Map生成就可以了然后前面就是Skala简介 接下来的话为大家简单介绍一下起手的一些用法起手它原来是什么呢 原来它起手是源于Ucb的一个Ucb的一个两个科理组开发的当最开始是起手开发起手也是为了去开发RiskFile处理器这样的话就是对于起手可以实现敏捷开发然后快速迭代然后去测试他们这个File这个计论级到底是不是比其他的计论级更优他做一个硬件开发语言 然后相对于其他的计论硬件开发语言 比如vialog HDL 它的开发效率的话肯定相比他们的软件开发是效率肯定很低的而且它的发展的话也不是很不是很快 现在好像标准还是大多尊同Hoe的01几个标准然后是System Vialog 就是System Vialog是在Vialog的基础上和一些面向对象的特性 但是它很多并不用于实际而更为用于验证然后System C的话其实就是基于C语言开发了一个定义的一些内库 当然这有些一些公大公司大用公司每一般用System C去模拟一些事务级的一些功能模库它不是具体的硬件开发所以说那这个CHISO它作为一个硬件 其实它的基本上就是反正标准的一个定义 硬件构造语 它不是硬件开发语Otherworld construction language然后它的话就是基于 因为它是基于Skeleton去开发了所以说也有面向对象的一个特性然后而且它在生成可综合的Vialog因为我们知道我在用Vialog去写的时候 比如有很多一些task好等等 它是不可综合的 它可能只是在模拟的事情上用到这些语法但是用CHISO生成的全部都是可综合的对于这样的话 就是大大的减少新手去上手练学习的一个壁垒就是说我写了什么 它我就知道它一定是可以上把子跑的然后CHISO还有一些模式匹配模式匹配就是刚才Skeleton Skeleton没有介绍到 它也是我们可以简单的理解为就是对于类的一个这种位置的一个语法就是说可以寻找一个匹配不同的类这样的话就是在CHISO开发里面非常方便然后就特征混入 还有类技生等等都是Skeleton一些特写然后CHISO它虽然是基于Skeleton开发但是它也定有自己的一些数据类型比如说像Uint Sint 这会儿写的不是很对EI应该是大型 还不类型就是我们因为Skeleton已经已经就是刚才PT里面已经介绍了一些自身的Skeleton的数据类型那CHISO为了要定义硬件中的一些数据类型它就是扩展了一些这些类Uint Sint的不分别是无符号数据 无符号整数然后是有符号整数 还有不二类型还有对 还有那个整数嗯 好 这是一些简单的实例然后这是像Vac这个T的话就是它的数据类型对 因为这个的话我们可以分别非常快地去定义一些比如说计论器或者说线网一些类型对 然后这话就是 包括Bando这个类Bando这个类的话就是它在CHISO里面用的非常多它其实功能类似于C元的Strike就是把很多影响要的一些功能或者说自断然后都用Bando包裹定一个自己的Bando然后这是CHISO的复制复制的话我多说一点就是我想给大家提个醒就是当大家如果有兴趣的话自己我们下来之后自己再了解的时候一定要注意CHISO里面复制是不太一样的当比如说声明一个F和Y就是Aware类型的那声明的时候一定要创建声明的时候一定要用等号而之后如果在接下来代码中我用到的时候那一定要用这个帽号等号来去给这个变量去进行复制其实它这个复制在硬件上最好用硬件上理解就是连线的意思就是把不同的外面进来的线或者计论器的一些纸给连到这边 连到这个纸上面或者连到这根线上面这样来理解然后这是这就是计论器的一些然后它有三种具体的一些复制化方式比如REDNESSREDININITRED等等然后端口列表对 硬件开发嘛就在Value里面我们一定要去定一些端口的比如一个硬件模块你肯定是有输入输出的有输入的话我就刚才介绍给大家介绍这个Vac我就可以输入很多个这种input然后up的话就是一个端口32位宽对w的话就是位宽嗯 好的那接下来的话就是给大家总体的就是把刚才骑走的这块再简单串一下就是它数据类型它基于Gala开发也定义了一些自己的类型那比如说数据类型的话具体型的话就是Unt, Ascent, Boo, Bundle和Vac连线型的话IoWirewrap然后比如说表示端口方向的Input, OutputFlipFlip的就是翻转就是输入输出翻转这种然后具体的话就是计算里面的一个模块比如说我非常定义简单一个非常简单一个加法器然后这个加法器呢你要是想生成硬件的话你要去cancel这个module然后在之后呢马上紧跟着加入一个Io的一些端口声明但的话就是一些原谅它的功能的描述因为像这个Io.S和Io.C out都是已经声明过所以说在这互职的话一定要有帽号等号然后开发是一定要引入这个703的一个安装包这个软件库这是对我这个加法器的一个测试因为我开发一个对吧我不知道它的功能是否其实我以前也提供一个单元测试这个功能我就生成一个类然后去扩展这个pictop tester当然现在有更新有更新别的一些test的一些类库然后用这个去pog然后pog的话就是给值stat的话就是过一个周期expect的话就是我期望什么值我看你能不能拿到这个就是我要看哪个信号然后我期望的话就是给这个值看看能不能拿到跟我这个预期的值一样以此来判断这个功能是否正确然后上面这个语句的话就是因为这个adder经过测试完事之后这个功能是没问题的那我们用这个语句来去生成viral的硬件viral的语句然后用这个呢是OK 这个的话就是测试的一个语句了测试就例子写完之后然后在这就运行运行测试就生成viral的嗯然后这里的话就是简单跟大家说一下其次的话它其实上面已经scala就是上外拓展一个内面像硬件开发的一个DSL语言它有很多继承沿用自scala的一些语法非常灵活而自己呢也定义了一些描述硬件的一些类还有一些方法嗯所以说从前而言的话就是scala它是就是非常适合于DSL速度语言就是第一点放在这里就是大家如果以后有兴趣开发自己的DSL语言或者LT或者等等之类的可以选择可以考虑一下用scala语言然后面向特性面向对象还有函物性编程好七四的话就是举Scala写的一个流行端语言呃硬件呃硬件模型误言思维去写这个七四因为它是硬件 构件语言还要去写嗯开发这个硬件的一个具体的功能而这块的话就是跟软件开发不一样的地方然后能够是非常实验非常快速的敏捷开发现在我们非常提倡这个敏捷开发处处绝待希望大家对于硬件开发有兴趣的话就可以多学习一下这方面的一些东西就是很多其实很多人对于七四一听到七四的话对于软件人员来说硬件开发因为开底层了嘛就是大家就是没有硬件开发非常灵活非常抽象希望对于硬件那种可能一个周期一个周期级别的一个信号的传递可能就是短时间内不太好不太好怎么说呢就想清楚但是现场学习肯定是能可以学会的而对硬件人员来说的话他们习功能Virtual的就已经非常固定的一个思维然后听说七四已经用SigaraSigara那么灵活好害怕就怕就是太灵活了怎么样学习成本很高确实他有一个学习曲线但是他的学习曲线是刚开始有点抖当然其实学会之后发现其实很好用对于Sigara是这样对七四是这样好的我刚开始的话就是泡妆颖域介绍一下Sigara语言还有七四语言那接下来的话就是先让我们特地开发的另一个同学来为大家介绍一下我们这项目的前端的一些功能谢谢那我也用中文大家真正说的有点小的错误我这东西其实叫编译后端就是前端是有一个开源的项目就是如果早上你们有听伯伯老师给的这个就是我们这个项目是从某种中间表示开始然后做一个编译后端生成指令然后再把指令空发给我们用曲奏写的一个为加购然后在下面跑起来那我们这个工作呢就是这个虚线的空幻里面的部分就是编译后端生成指令然后基本流程是这样子的我们的就是中间表示的是TUMTUM是什么呢TUM就是一个端到端的一个编译帐然后它的作用就是从天色flow或者是拍套卷这样子的就是前端描述然后可以转换成它的这种IAR就是叫中间表示然后在由中间表示再编译成各个后端比如说FPGA比如说GPU或者是CPU的后端的那些指令或者说它的那个情绪的APA然后它的TUM IAR的表示是这样一些的然后我们做的什么东西呢就是有了IAR之后我们做一步IAR变换变换之后会变成这个我们可以调用的API然后调用API之后就生成指令这部分等会会详细的把这个展开来说有基本流程是这样子我们这个东西的目的呢就是把某种中间表示转换成我们最后硬件可以用的指令就像我们现在写那个C程序我们写的是C程序但是我们ARM盒又不认识我们写的C程序所以我们也得要有个GCC这样的东西把我们写的这种Opplication转换成就是你的Hardware可以读的那种指令流的形式说到TUM中间表示我们就不得不提Hardware的就是整个TUM都是在Hardware的这样做的Hardware的是MIT计算科学和冷工质的实验室开发的一种就针对图像图里的DSL它的最大的特点是把计算和调度做了分离就我们一般写程序就是比如说一个数多带怎么算我们就都在程序里面写好了它这个方法就不一样它就是先把整个计算图给描述出来然后再在后面做调度调度就是把计算怎么算怎么在硬件上算给说出来然后计算图的特点呢它就是一种特别简变的可以描述图像的一个计算图它是有很多像Fourch and Huang组成的一个计算节点然后会有个例子给大家看然后它可以描述这个计算核心之间的依赖关系以及每个计算核心就是这个Node的数据形状然后它的调度呢就是可以在不修改这个计算图的情况下就修改调度方式就可以映射到不同的硬件下了所以它开发效率高也适合我们来做这个就是我们新显了一个处理器然后为它做这个编译的一个中间表写然后这个调度呢做的事情呢其实就是指定每个计算核心在每个步骤它所要处理的数据的大小和形状其实也不是特别多事情然后这是早餐我们提到的我们这个指令的架构就是主要分为红指令和微操作红指令大概可以理解成我告诉这个处理器这次要做什么东西比如说我告诉他这次要做一个LOU操作然后就把这个红指令告诉这个处理器了但处理器还没开始动因为他不知道这个LOU操作他要处理哪方面的数据所以就要有微指令就是告诉他处理天赢量是多少数据然后怎么处理然后处理的这个数据最后就是处理方式到底以什么样的精度处理这个就是微指令的作用然后呢我们这个东西呢是跟WTA有关系比较深就是WTA呢是TOM针对FBGA专门做的一个编译的后装然后我们这里是因为是共享这个TOM的前端的所以我们实现上会跟WTA有一定的相似然后我们同时也是支持生成那个WTA指令然后进行比对的但是我们的定位跟它是不一样的就是WTA的定位是纯处理纯的协处理器就比如他有一个很大的网络然后把其中的一个卷计他标记了这是WTA做的所以他就把这个卷计拿出来拿出来之后放到FBGA上做然后把算出来的结果返回到CPU而其他东西都在CPU上做我们这个是做一个就是定制处理器的指令生成器比如说我有一整个网络然后把这一个整个网络全都编一层我们的代码然后把我们的代码给就是放到我们的专用的回家构上然后在上面进行运行就是我们这个生成指令的流程大概就是这样子就是CPU上就是运行我们的这个这个编译器然后会生成两个东西一个是指令一个是数据然后把指令的数据通过这个PCIE这种这种方式给传到我们这一整块FBGA上然后FBGA就分几个部分就是这里是Memory我们一般叫它OffTripMemory或者叫它DLM就是就用来存外面来的数据的然后这上面有参数缓存我们一般叫它SLM或者是OwnTripMemory然后我们这个东西呢就是就其实是有三块Memory一块是在这个CPU上的就是我们House的端的Memory一块是这个Divice端的这个叫OffTripMemory就是这一块还有一块就是Divice端的这个OwnTripMemory就是就是这块有三块Memory等会再做那个计算组声明调做的时候就他们要用到所以先提一下然后这里就给大家一个我们做的这个编译的前端的一个例子就大家如果对生成指令有一点点了解的话这个是一个特别简单又特别就是特别流行的一个一个卷机生件网络就是Learned5结构它的结构很简单就是由这个一个32x32的一个图像然后做一次卷机再做一次齿化再做一次卷机再做一次齿化再做一次卷机然后后面做那个叫全连接然后最后会得到一个就是风类的结果然后我们这个东西呢就是针对它前面的就是从第一个卷机到这个C5然后做一个编译的一个势力然后势力的话就是我们分三个大的阶段三个大的部分步骤第一个步骤是计算图声明计算图声明的话就是把原先我们的这个计算图给分成几个部分这个stage是什么意思呢如果大家对我刚刚提到的那个三个Memory就是三个Memory有概念的话就是我们在做一整个这个就是我们的processor执行这个计算的时候我们一开始是把hose的端也就CPU上的Memory放到我们这个off-trip memory也就DLM然后在最后所有就是所有阶段结束之后会把那个off-trip memory的东西再黄昏CPU上然后也就是说跟CPU数据交互只有开头的最后那我们这个off-trip memory和on-trip memory就片上的两块Memory我们是在什么时候交互的呢就是在这个stage一个stage做什么事情一个stage是把这个片上的off-trip memory的数据给举过来然后我们就计算然后把它放到on-trip memory上然后放了之后它可能就是比如说这个这个卷机做了一些计算然后放到一块on-trip memory上然后后面又用这块的结果做了一下持划然后还在这个上面然后我把卷机持划都做完之后把这个数据怎么样子放回我们叫off-trip就放回这个我们叫DLM或者叫off-trip memory的地方所以这个统称为一个stage就是这两块Memory之间的交互被归到一个stage同时stage也是就是调度的单位就是同一个stage的这个所有的计算节点是放在一起调度等会给个lead然后这个调度继续做什么事情呢就是有三个步骤第一个是根据我们这个计算的这个work load就是它的这个计算的规模或者是复杂然后得到一种好的调度方案第二个是根据这个调度方案把原先计算图进行切封第三个是把切封之后的这个计算图转换成我们现在可以用的就是API转换成API之后我们才能进行指令的生成就是我们调度了API然后就会生成我们的那个hardware可以论时的这个指令而接下来就是就具体说的这流程就是这里就是典型的那个ln5的这个什么channel啊什么wiz之类的参数然后把它就声明成一些形状然后声明成一些形状就是就它就变成计算图了然后它还没变成计算图它就是一个个praseholder如果大家有用过那个tensorflow的话就知道就是就是tensorflow里面的praseholder也大概像这样然后我们这里有两个略位的不同啊第一个是我们这个东西因为我们的后就是我们的微架构是一个定点数的一个处理器所以我们这里使用的是就8比特的一个定点数然后不是复点数然后另外一个是就是我们就支持多个这个数打包传输就一个一个8比特的就就我们那个啊就是那个bzi或者我们axi那个传输剧的就比较大那我们就是把它有好几个8比特合在一起打包传输我们就叫它这个谈数叫broc.in或者broc.out就是一般取16就现在16个channel一起一起放进来然后打包然后一起进过去然后在在我们的有麦克就是我们的微架构上去进行计算然后所以就是这两个就是跟我们原先的那个Learning 5有六个不同那总的计算流程是一样的然后这里就是把这些呢就插速进行设置然后并打包就是比如说这上面的插速就是那个kernel的有矿和高然后这个是我们数据的范围然后这个是齿化就做就是二二的mac齿化然后把这些程序打包之后我们就可以把它传到我们的这个有VelikLab里面就我们把它弄成一些库然后就是把这个程序传进去就一共做这几个步骤第一个是convolution第二个是shof的可以shof的clipple做什么的就一般的就是定点整数processor里面都要做的就是定点整数Normalization就是先把它就是shof的移一下一个把位然后再把它截断一下就截断成我们那个数据范围内的另外有一个区别就是原先的那个lunay5它是用sticker mode那个sticker mode它的就计算是e的那个x次发就不太好算我们就改成了这个铝录铝录的话就是比一下它大于0就行然后最后是做齿化齿化之后会得到这个result panther就这里这一步呢就我们这一个stage它做的计算图的就是步法然后这里可以看一下这个例子就是我们调了那个我们的lab里面的一个conrusion就是二地的conrusion之后然后它会变成一个什么样的东西就是这里这几个参数呢就是bo就是那个batch就是p然后co就是out channel就是外部的那个channel然后挨罪就是wise and height就是它的框和高然后这个bi就是int的channel就反正它也是channel然后ci是int的channelbi是interbatch反正就是征度学习的那个tensor介绍里面采用的一些参数然后这几个是那个它里面的channel的这个框度和高度之类的还有那个channel的数量就是对比一下就是下面的这几个数就变成了这几个然后e的我就不显示出来了比如说就我们知道lnl5它的这个这个output channel就是就是6然后它的那个做完第一层就是32x32变成28x28所以它这个挨罪就是0到28然后在里面的就是做卷机的部分就是就它那个第一层做的卷机是它的颗头是5×5的所以这里就是5×5然后做做了16次所以就是5×5然后这是乘以16然后它做的这个东西呢是就是卷机然后它有一些数字的平移量反正最后最后用这个计算图生出来的生成出来的就是就像这样的这个就叫做tumi啊我们最终目的是把这个变成我们的那个为加购论时的一系列指令所以我们这里原始的东西生成了然后我们现在要看我们怎么样子把这个东西变成指令我们先看看我们为什么要做一个调度就是我们这个这个东西直接变成指令不就好了吗但是它肯定还是有问题的问题在哪呢有两个问题第一个是就是这个slim也就是这上面的我们叫它on-chip memory的东西就是原先那个图上在整个大的机上和新上的一些小块的memory它的这个size是非常有限的就片上是有限所以它有一个就是limit所以就是要根据它的限制做调度就比如说我们刚刚前面给的那个啊它那个循环不是有很多层嘛然后每层就数有很大那它就就它算出来的中间结构就不够放在这里放就不够放了那我就必须把原先机上组做切封比如说原先一个机上图分成三个机上图然后把分了之后的小机上图才能放到这上面上这是第一个原因第二个原因是我们这个硬件就是提供的这个接口是有限的而且是它的种类是确定的就如果你们有就用过绘编之类的那个经历的话就发现就是就是我们一开始就那个图转换的再好它也不是被那个CPU或者GPU这样子的硬件论识的所以我必须要把原先那个i啊做一次变换变换成我们的硬件论识的i啊所以就是这两个就是我们做调度的动机然后根据这两个动机的我们就有这个调度的这个方式了调度的过程大概就是我们把它整理成库大概就这样就第一步是我们通过一些函数然后得到这个调度方案就这五个数就是就被称作调度方案然后第二步就是把这些调度方案给打个包就还有那个原先的机上节点都打个包就是这这些呢就是第一个stage0它的所有设计到机上节点然后这些就是后面要做那个它有所有设计到的参数然后把这个参数传到我们这个tile这个函数里面之后它就会把原先的计算图按照刚刚的那个可以放到硬件上的那种切割方法把它进行tile然后进行tile之后我们就会变成一个新的计算图但它仍然是t为我们i啊就是那种表示那我们就要做一个叫做low 0的东西就把原先的i啊就降级使得它支持更底层的这些API然后我们接下来就显现减减这几个步骤第二步骤呢就比较直观就怎么样子获得这个stage0首先我们之前画了一个图就图上有三片s6我们就是on-trip memory然后它在同一个stage分配那它就就是不能超过它它这三块s6我们的带小线着那这个方法也比较简单自爆就是我们根据workloadworkload就是之前那个shrp然后可能shrp的这个参数的一个综合然后根据这些参数他们所有都是一个整数但是整数有什么特点就是它有因子那我就把它所有的因子排列组合都列特了然后都列出来之后排除其中不合法的组合不合法的组合主要就是超过这个就片上内存限制的组合然后排除之后我们剩下一堆的结果那我们就可以始终找到最优的结果所谓最优的结果就是它的那个内存的这个移动就是在output memory和output memory之间移到最少的这就是最优的结果然后得到最优结果就是这五个参数然后这五个参数之后就是做tiling比如说这是一个例子就是我们得到的是这几个数可以看看这个这个红圈圈里面的就是这个coco它原先是6然后我们得到的sqa9它是2所以它在这里就变成2然后在这个整个的外面会有一个4零到3然后就像这个计算图它被缩小了然后重复了3次然后这个h也差不多反正它就变成了一半然后它这个这里它具体是怎么实现的就是这个函数就是spread然后就是把原先的一个比如说原先这个叫oCoC这个这一个Eason 4循环然后它按照这个oC block就是这个o按照这个o给切封了之后它就变成两三循环了一层叫oC out一层叫oC in然后变成两层循环之后它的这顺序就就不太好让它整个都放到外面然后所以我们要做一个旅澳的就是把这个切过的结果就是这些叫out的全部都放到外面然后那个所有叫in的都放在里面就是这里就是这里有4个out就是切了4刀然后就4个out然后后面有一大堆in之类的然后再加一个computer add这个是computer add x0就意味着就从x0之后就是在我们这个循环里面然后所以这里就是从这个应该是从这个b in的开始然后但因为它是1所以不行所以这里就是在下面就它是从那个oC in的开始然后这个就是这个tiling怎么做的就是我们之前得到了tiling的这种最有的调度方法然后根据这个调度的结果然后去真的把这个图色切成这个样子然后重复很绝错但是切完之后我们还是没有得到我们的可以转换成硬件指令的这么一个东西那我们还要做什么事情就是rowingrowing分为两个部分第一个部分是set stop就之前所有的scoff就是所有的buff都被论为在global上global是什么就是optip memory或者叫它dlim然后但是我们实际做的过程中是要把这些东西放到我们的optip memory上的所以就要把它这些buff给set stop就设置它的作用域就比如说我们这个data buffer就是读我们就是一层网络的数据的然后这kono buffer就读一层网络那个kono的参数的然后所以他们来就放到各自的slim然后后面的那个就计算结果比如说比如说齿化齿化之后它不是有一个计算结果吗然后它就放到这个就是这个acc buffer上就一共三块就就按照那个计算的那种那种事实的实现就把它叫做放到自个对应的这个buff上所以它原先的从叫global然后就变成了这里叫什么local点input buffer之类的东西然后这里把这个buff放完之后我们终于可以开始转指令了那我们做的是什么呢就是有两种方法他们是一致的一个是叫prake买一个叫tensorize它的做法它的就是把原先的那个计算图变成这种APR就这种APR是对我们更加底层的那个边缘器会论得的就是会论得这些APR就跟原先计算图已经长得不一样了原先计算图只描出计算到这里就是变成APR了它大概就是在这里比如说这个接个计算结定我告诉他他应该用这个gm这个喊出来算那他用gm这个喊出来算他就会根据这个ir变化的一个luor然后把原先计算图变成这个样子就变成带这个APR的样子然后有了这个东西我们就可以生成指令了有终于到我们指令出现了就是这个东西就是经过一个叫做just in time的一个指令生成过程就是走自三个喊说就从上到这里再到这里这里面有很多细节就不提了就反正他走这三个喊说之后就从这边的这个叫做APR变成了真正的指令就是比如说这是一条我们干干的卷积的一个转换之后的描述那一个卷积我们是finally算了放在一个叫做gm的单元就是成了加计算算然后他这个就比如说这里的这四个喊说队就是他外部的这个loop他的这四个喊说然后他生成的这个微指令就是有五成五成二十八共七百个共七百个就是就是他展成这个样子然后他是放在这个就是所有的这个红就微指令都放在同一个数字里面他就放在这数字的第28到第728位就共七百个然后到这里为止我们所有指令都生成了那我们生成之后自然是要给我们的这个为家购了那我们怎么给为家购呢我们就直接把它存出来就是指令就被存到了这个指令的这个battery的文件然后那个呃那个他的那个数据数据我又存到了这个就data这个文件里面然后就可以把它存出来之后放给为家购用当然在在这之前然后我们可以验证一下这指令对不对那我们就是用右边这些杭数这是tom你们自带的这个叫sation的东西就是可以把这个就我们原先写好的计算图啊叫做啊都都都整合成一个RF然后跑一跑他最后得到结果就是这个2nd然后得到这个之后然后这边是一个纯拍声实现的一个就是我刚刚做的事情就是5层的一个结构然后这里会出现最后会得到一个就是2c5然后把这个值和我们这个杭数模拟的值进行对比如果它一样的至少在这一步就可以说明我们这个这个生成指令和数据都是没错的然后接下来就是回到我们这个为为架构部分这这部分有问题吗any question行好的那我们接下来的话就是为大家介绍一下我们这个Virgo项目的一个架构啊这还是刚才我们那个除刚才一疆的pt里面我们通过啊刚才他介绍了编译后段的工作呢我会生了一些Virgo业指令流还有一些数据那些数据呢我们通过一些数据总线然后再传统到我们的为架构里面去做因算嗯具体我们这个呃整体的部署的平台的一个抽象呢大概是这个样子就是嗯这个的话就是啊这个话就是我们这个核心的为架构然后首先呢我们在这个啊pc端后四端呢我们先在这个后四端比如用c或是架架或是cl然后是在sdxl的后四端上面去把比如说一些呃data啊还有一些呃指令啊等那些数据形式打包方号然后呢这儿通过我们这个让熟悉硬件的话同学都可能会知道我们通过d3e的话就是啊首先发送到device就是carnal端的啊这个呃d.r上面然后d.r上面之后呢在carnal端数据已经达到carnal端d.r上面之后由v架构就开始工作他首先呢去通过xi总线去从d.r里面去夺取数据夺取的数据放在片上的RAM上面经过计算计算之后结果在回传到d.r上的种然后d.r再经过这个相同的d3ed3e这个插槽然后是传到后子端那此时我们就可以在pc端拿到最终运算的一个结果OK这是大概一个抽象的模型那么具体的话我们这个v架构在板上大概如这个图索是这是一个呃IPG的开发板可以看到这是pce插槽啊我们这个v架构呢就部署在这个开发板的这个芯片上面然后呢这一些都是d.rAM那假设数据现在已经存到了d.rAM上面那么首先呢我这个v架构就是通过batch和dstatch模块去从d.rAM里面去取指定取完指定之后并对指定进行解码然后分发分发到三个不同的模块里面就漏了模块漏了模块就根据指定里面一些特定的Bit Show然后再去d.rAM里面去可能我需要计数去取我需要计算的数据需要计算的数据呢会放在片上的三个sRAM上面就是刚才一江里面提到的还要根据sRAM的限制去做排理然后数据xEU呢就是计算模块就会夺取片上的数据去做一些计算计算结果我们这个xEU里面现在支持比较呃tensor级tensor级的一个ALU计算还有矩阵层的一个GMI计算然后具体之后现在正在扩展现在的功能以后我会具体的介绍到然后计算结果在超级sRAM上面然后当然模块夺取这个片上的结果然后再回上到dRAMdRAM呢再通过这个插槽然后再回上到呃hose端的一个CPU上面就是整个一个完整的过程那首先我给大家介绍一下就是你这个v架构上每个模块它需要做的事情第三个模块的话刚才听我介绍的是它要去读取指令所有的指令它就先经过这个模块经过这个模块呢然后对指令进行解码然后边进分发它到底这个指令做的是什么事情分发到不同的模块里面然后这个模块我们这包括所有的模块我们利用起锁开发就是保持完好的扩展就是说我们现在支持现有的指令一些解码对吧我还可以根据比如说哎你这个vac已经好了已经放您开源了我想天下新的飞翔我想天下新的指令机没问题你拿着扩展就可以包括现在已经有老师有科理组来找我们合作对大家有兴趣的话可以看这个之后会提到会把原码那个地址放下这是DISCATCH模块做的事情然后LOAD的话就是刚才我提到的就是LOAD指令的话就是DISCATCH首先对指令进行解码然后比如发现是LOAD模块是LOAD指令那把LOAD指令传送到LOAD模块LOAD模块再根据这个指令去做其他位域的一些解码然后去得到我要取取的数据在D-ROM上的一些具体位置用偏一辆等等取数据一辆大小然后通过计算然后它去通过XI总线去D-ROM里面去取数据然后并缓存在偏上的S-ROM上面这是LOAD模块大概做的事情说得非常的简单但是其实代码的话大家看一下还是比较多的然后这是核心计算模块S-ROM的模块S-ROM的模块现在就是支撑下量计算部分就是我们的ALU部分然后主任计算而GNN部分然后现在我们正在做的也是跟其他老师合作的就是要在S-ROM里面去扩展TESTVU里面也实现了一个比较经验的架构而这个提升在S-ROM里面去扩展它的功能并且相应地扩展一些指令级这是XU的然后S-ROM模块的话就是把S-ROM的计算得到了一些结果然后从S-ROM模块读取计算的结果再回传到D-ROM里面因为此时呢就是回传完回传结束之后Pc端的HOST会从D-ROMD-ROM上去把结果再读取回到Pc端那这时候我们就可以在屏幕上去看到一些结果好的这是刚才抽象的介绍一下架构然后再简单的抽象来说一下没有模块具做什么那么这块的话就是刚才也在PD里面出现过这块就是具体我们这个代码部署的一个形式首先呢我们在用Zilinx SDRXL去开发环境然后在HOST端用Ciara代码去把一些编衣后装得到一些指令和数据我通过PCIe放到片上的D-ROM上面然后呢我的这个V架构呢从片上从这个D-ROM里面去读取数据和读取指令到片上的一些成熟经过计算再放回到D-ROMD-ROM再返回到HOST端整体是这样的好的那接下来我们整个一个架构呢我们再介绍一下我们在这个项目里面除了提供一个整体的缩理系的基本架构之外我们还做了一些额外的一些贡献就比如说一些非常实用的起色的工具库就比如说这个D-ROM Simulator我们在正常在原来最开始的开发过程中呢我们使用的第一种方法就是说在SDXL环境里面去做几Buds比如说呢我这个模块对吧我肯定是要放在板子上板子呢是插在这个我的主板上插在主板上的PCIe口然后去跟HOST的连接然后但是我的V架构呢在这个Chrono上面是要通过Chrono上面这个V架构是在Chrono上面要通过XI去从D-ROM连接去诅许数据那最开始我们做的方式呢就是我把这个起色模块我开发完了然后呢我把它就是转换成Virtual語言转换成Virtual語言呢我就带给它跑在这个SDXL环境上面跑在这个加速卡上面然后去看有没有什么Buds然后去看它的波形然后一年连接找问题那其实这种问题这种方法的话就是比较原始然后比较慢的一个方法就是因为SDXL它这种软件它启动的时候是比较慢的这还是在服务器上在个人PC上那就会更慢那现在我们提出第二种方法就是说我们基于起色我去写一个D-ROM simulator我把你所有的功能你其实就是一些数据存储然后一些这个信号的一些交互对吧你给地址然后给地址给数据程度然后如果已经有的话你就返回一些数据等等那我们通过就是通过这个D-ROM simulator为例就是我们基于起色去开发了一个simulator去完成这个D-ROM simulator的一个工作这样可以更方便更快捷地去提拔个问题然后除此之外呢这块就是我们这个大概一个代码这是D-ROM simulator这是顶层模块然后这个DeepVis这是一个类似于各个韩数的一个功能就是Sky的一个功能然后这块定义IO等等这块ROM的话比如说我生成这其实就是起色的功能比如说我生成一个Memory对吧Memory里面我放比如说Memory多宽多深然后我放一些数据然后这个起色也有一定的语言也有一定的API去支持直接从文件里面去读取数据放到Memory里面等等我去模拟这个整个D1.2的功能我们就是利用这个就在起色的基础上我直接去做一个simulator而不是说我每次我设计完然后我翻译成WireLog我在实际一环境中我去跑一下然后再找问题现在这样的话就是加快了开发的进程D-Bug的进程除了D-ROM simulator我们还开发有其他模块的一些simulator和其他的一些非常好的那些工具开源出来然后是以来吸引更多的开发者来加入起手加入每届开发这个加入开源硬件这个这个这个社区里面吧好的这里的话就是现场练习本来我们打算的话就是现场给大家就是我们的服务器虚拟机已经打好了给现场大家就是简单练习少但是可能当我们会把这个PT以后我们想的意思就是说要不我们可能在以后建个群然后把PT放在团里面大家有什么问题可以去问然后就会交流OK那我们先来大家看一下这个简单的练习是什么样子的就是在说之前呢我在把第二页还第三页的一个Zigara Q-Soul会合调用一个代码给大家试吕一下就是说这是点词模块然后在里面的像这些List和Map其实都是一些刚才给大家介绍过Zigara一些基础的一些注意结构或者功能然后比如NewAdder这个Module这个其实就是起诉了一些硬件模块的一个生成的一些一些言语吧还这么说这块的话我们就生成了一个整个起诉了Zigara会合调用一个实力然后简单介绍一下起诉开发的一个搭建然后在Linux上面的话就是这其实在GateHubs上这个FreeTips它已经做得比较清楚然后在Windows上面它也有相应的一些搭建的流程比如说Intelligence IDE这个可能用过用Java和Zigara一些朋友应该会比较了解也是基于Intelligence IDE然后下载配置的时候再安装Zigara然后下载项目模板这个项目模板的话就是7-4的Temperate这里面的话就是有一些必要的一些文件它这个在Temperate里面都有我们只需要根据这个Temperate的去添加我想要实现的一个功能的文件就可以然后打入项目模板就打入这个文件然后走到第三方根据这个里面的配置文件去下载自动下载结束就可以进行开发这是本来想就是现场运行现场就是DemoDemo写代码的话可能给大家安装或者这类的一些势力嗯OK然后我这个AWS上面的训练也打好了然后当然这个可能时间可能也来不及那之后的话就是下完之后我们再来根据一个例子来具体大家下来之后可以再把环境搭起来去开发一下然后这里的话就是给一些比较常用的一些命令就是PILOTIGE用SBTE来进行编译嘛然后这是一些比如说这个命令就是Test的命令就是说我一个模块就要进行Test这么一个Test的命令然后这是Remain然后这块就生成VALUE的一些命令OK这个的话就简单跟大家说一下吧就是也不要我们现场Demo现场现场codes了这是之后我们是像一个FSI协议FSI协议的话就是它里面有5个channel嘛reader,datareader,data还有reader,response通过这5个channel呢我们去比如说在channel端和hose端去给地址给地址然后确定然后是确定地址的确定取数据的长度或写数据的长度然后再回传数据等等等等就是我们在这个包括这个原码也在放在这个横城启制的开源这个iHab上面大家有兴趣的话可以看一下这是AXI实现然后呢我们又把这个AXI可以看到这个这是基于7组开发好处AXI我实现了之后它是一个类对吧我想用呢我直接在这个这个object里面它这个生存函数里面我直接把这个类作为参数传进去然后我就能在这个参数就在这个类对象里面去调用然后这里我们又实现了一个对AXI去进行访问的一些函数和一些代码比如说这个startstart的话就是开始就是我要去访问开始做一个启动的信号然后这read的话就是就是我要去读了比如说这块的话就是这块就是有的一些状态判断然后这块就是读的地址读的长度等等等等之类的大家有兴趣的话可以看一下我们这个代码当下来就是可以再串照一下这样的话就是不用现场写代码那我要介绍的内容基本就这些有一些小板子其实我们后面在群里可以给大家一些建议我们现在也在找有些小板子可能就两三百人民币这样的话大家其实是可以接受得了如果是上FBJ云的话其实有点贵大概是10块钱一个小时有AWS的话它可以按分钟计费会便宜一点给大家把机器关掉有几毛钱大概是这个好像是的就那个是因为芯片比较小而且它的那个布线架构它好像是比较公开就所以那个是可以拿到然后Sales它其实是它开源了一个叫RapidRide就大家可以从里就把那个综合布局布线来修改它的结果然后综合和布局应该都问题不大布线其实没仔细看过而且的话就现在没有工具它只是开放了这个有可能它发工具的就是再一种应用对对对就我们把FBJ就是当成那个可重购嘛我们就把电路弄到FBJ上面对对我们是有兴趣的一天就可能一开始是IoT吧对对AoT这样的话就是有我不一定需要所有权的功能就是针对一个厂子就是针对比如说我可能就只跑两三内网络就对那两三个网络做优化就不是一个general的AI小的话就可以做小就好像有些可能也大但是我场景可能就是一两种网络它不是所有的对那个有点挑战对怎么说呢就理论上能做但它性能会非常然后现在的话就是因为华为它布的那个生存级料理它就把很多很贵的技术弄到芯片上面去所以要弄新就真的要做训练的话可能就是也要花很多钱把一些比如说3D的Memory就往里面堆这样才有可能就是比得过这个市面上的买到的所以目前我们没有想那么多就除非特殊场景就我们可能就一两个例子那种争量式训练有可能的话其实我们会看一看这回事都加群了吗那其实很希望后面能收到大家的消息就是Mario说就是大家都来都来了其实可以试一试就我们可以试一试就就是万一这个问题太大那其实其实我们也可以有更多必够后面怎么把这个开始上手的弄得更紧那我们现在还是按原计划就虽然有点晚但大家就有兴趣的话可以试一试I would like everyoneto give a big applause to this teamand to everyone who presented here