00:00
Hello,大家好,我是恢复了日常更新的宗敏因为答应了同事要在八月份之前呢结束这一个系列,那现在呢,我们来到了AI芯片思考里面的SIM和SIM具体的内容展开,那今天我们还是在AI芯片思考的simd和simt,包括我们的编程体系的这种一个内容里面,今天主要是给大家汇汇报三个内容哦,第一个呢,就是SIM单子令多数据流single instruction multi data,第二个呢,就是上一节我们引入到的,特别是英伟达自己提出来的SIM单指令多线层single instruction multi,最后呢,我们看一下英伟达的Q达的具体的实现,它的编程跟硬件之间什么关系,诶,我们现在马上进入到第一个内容就是。
01:00
Simi呢就是single instruction,单指令,MD呢就是multi,这个英文中文的概念呢,我就不再展开了,我们简单的看看SIM的一个定义啊,主要是对多个相同的元素数据呢,进行相同的计算的操作,这里面呢,很重要的一点就是利用了数据的并行,而不是并发,里面有多个计算,但是只一个进程在运算,这就意味着我们一个进程是由单一个指令或者单一个命令呢对我们的数据来进行控制的,这种方式呢,属于提升我们现代CPU的计算能力,特别是提升我们数据并行的方式,从而提升我们整个系统的计算的吞吐,那整体的对硬件的要求就是需要更宽的a Lu,这也就是更宽位数的计算单元。接下来呢,我们看看一个计算的本质,下面呢,以简单的两个向量的相乘作为例子,那我们现在呢,有一个向量就是A03,里面有四个元素,第二个呢,就是B的向量B03也有四个。
02:00
数,我们对向量A和向量B进行相乘,那这里面的相乘操作呢,都用op PE相同的计算单元进行相乘,最后得到我们的C03最下面的四个元素,这个呢就是SIM的计算的本质,了解完计算本质之后,我们来看看它的SSIM的硬件到底怎么组成,于是呢,有了simd的硬件的这个图,确实画图画乐多迷挺类的,每个图的风格都要统一切现在呢,我们看一下s simb实现一次乘法可以完成多个元素的计算,那这个时候呢,就要求硬件上面增加我们alu啊,这里面处理单元就是PU process里面的数量了,所以可以看到呢,Process后面是堆叠了好几个,同时间呢也需要增加一个功能,就是数据的通路的数量,所以我们看到这里面很重要的就是绿色的这些子件。
03:00
寸头把我们的数据呢,传给到不同的process unit,这样才能够实现相同的时钟周期内呢,才能够提升我们整体计算的吞吐量,现在我们看一下SIM的一些约束,就是它的优缺点嘛,Points and cons,首先呢,SIM使用的是独立的线程啊,这一点很重要哦,这个线程呢,能够同时进行多个元素的操作,因为是一个线程去计算,而且alu的宽度呢,比较宽,我们以前的计算机呢,可能由16到32到64,到现在的128,整体呢,对我们计算数据的要求呢,就要求我们的数据的类型呢,格式呢,大小呢,必须严格的对齐观,我们的alu啊,没办法给你去计算,那优点呢,比较明显,就是提升我们的计算的性能,利用计算机系统里面的内存的数据的总线的宽度呢?可以使得我们多个数据呢,同时从内存里面read and y就读和写了,例如。
04:00
刚才讲到的对我们的A03 B032个向量来进行计算得到C03这种方式,我们往右边看看,实际上呢,为什么叫simd呢?是因为我们控制的是指令,而不是真正我们平时编写的代码,那右边的这个呢,就是我们计算机具体执行的一些指令,那指令里面我们可以看到了有四个 ST1234,分别对我们的四个元素进行族元素,族元素的去相加相乘的这种方式,而在使用了simd之后呢,我们只有一个ST里面,后面呢就标明我们需要同时对四个元素进行操作,这个呢就是通过我们平时编写代码,然后编译器呢,会帮我们编写成我们硬件能够识别的SIM的指令,这个呢就是具体的执行的方式和逻辑,那这里面呢,我们再简单的展开一个DEMO啊,首先呢,我们大名鼎鼎的挤牙膏厂。
05:00
张特啊,从MS开始呢,就开始支持simd了,而我们现在手机上面用的最多的是M的架构,里面的汇编呢,是new指令集,就引入了SIM,整体的单元呢,去到128BIT,比较宽,而且有16个128BIT寄存器,那相当于我们可以用来做32个64BIT的寄存器啊,它们之间呢,可以进行一个配置,而这些寄存器都是用来存放相同数据类型的vector,这就意味着我们的数据呢是对齐的,我们数据的元素格式都是相同的时候呢,就可以同时使用一个进程对不同的数据,对多个数据呢进行计算,那同样的对我们刚才的四个元素呢进行乘法的计算,同样是把A这里面写法呢,同样是把那个A30 B30相乘,得到我们的C301个继存器呢是120。
06:00
八的位宽码可以存放四乘以32个,也就是刚好可以存放我们四个元素,每个元素呢是32BIT,就是就一个简单的浮点数,现在呢,阿里看到了就是向量B放在S15寄存器里面,向量C呢放在S14的寄存器里面,对两个数呢进行相乘,把计算结果呢保存在15的计存器,把数据呢重新覆盖过来,这整个呢就是simd的原理,那从整个原理可以看出来了,S最重要的就是改变了我们硬件的计算单元的数量,还有我们的数据的读取的通路的数量,从而对上来提供更多的指令集让我们去计算,截止到目前为止呢,我们真正编程的时候呢,其实还真的没有或者很少的程序员会去真正的碰到simd里面的I instruction具体的指令。我们现在来到了第二个内容,Simt SI同样是单子令,M呢主要是指多线程multi,首先我们来看看simt的整体的主要的理念,第一个呢,就是SIM主要是英伟达提出来基于GPU的一个最新的概念,嗯,十几年前呢,199几年的时候他已经提出来了,SIM跟SM呢,主要的相同点是都是通过相同的指令广播给多个执行的单元来实现我们的数据的并行和计算的。不同的点呢,就在于in要求所有的向量的元素呢,都是在同一个线程里面同步的去执行,反观SIM呢,就允许多个线程在一个web里面,那独立执行这个概念呢,就变得特别的特别了,因为它是允许多个线程,每个线程自己独立的进行操作。不过话说回来呢,其实它本质上呢,还是一个SIM的计算的方式,那现在呢,我们看一下整个的计算的本质。假设我们。
07:52
现在同样有两个元素,就两个向量嘛,一个是VEA一个是VEB一个是VEC,现在呢,我们执行刚才给大家去汇报过的具体的计算,就是把A乘以B等于C这么一个简单的运算。simt呢,给我们每一个元素啊,我们可以看到A里面每个元素上面都有一条小小的弯曲的线,那这条弯曲的线呢,就是我们具体的线程,每一个线程呢,都负责一个具体的元素的计算,例如A呢,TD0呢,就负vect a里面的第一个元素跟VEB里面的第一个元素进行相乘,得到我们的VEC里面的这个元素,就所有的线程,从F0到FN减一都是并发的执行所有的计算,这个就是M的计算的本质。现在呢,我们来看一下整个SIM的硬件的结构,那右边的这个图呢,就是SIM的硬件的结构,这里面呢,我们不以GPU为例,而是以的硬件的结构为例,那右边的这个小框框呢,就是我们的后侧的CPU。
08:52
不,最里面的我们可以假设它为一个GP或者m puu或者一个AI的处理器也好,SIMM呢就提供了一个多核的系统,所以我们叫做SIM m Co里面有非常多个,也就非常多个多核的系统,每个核心呢拥有非常多的SIM,具体的Co就有很多个具体的执行单元,每个执行单元里面呢,都有自己独立的寄存器文件,也就just file,还有alu单元,还有cash。但是呢,有一点值得注意的就是每一个SIM里面呢,只有一个指令的寄存器和指定的译码器,指令呢同时广播给所有的SIM啊,就后面的这几个call去执行具体的计算。那现在呢,我们回到GPU的概念,也就就是下面的这一段内容里面,整个GPU呢,是由多个SMT里面去组成,也就是GPU里面的SM的概念,而SM里面每个库呢,就类似于我们这里。
09:52
的SIM Co具体的核心,所以右边这个图呢,就是对我们GPU进行一个硬件的概念的抽象的架构图,接着我们看看SIM的核心的流水线,实际上呢,SIM啊,我们说它是一个特殊的D的一个结构或者一个方式呢,是因为它实际上呢,具体执行的运算是是使用SIM的data的path里面分开两个部分,第一个部分呢,就是左边绿色的这一块,它是作为SIM的前端form,然后后端呢,还有一块就是SIM的data。流水线里面呢,就存在三层的不同的调度,那第一层呢,就是我们的曲子循环,曲子循环主要是指fish I还有de,接着呢又有一个指令发射的循环,指令发是循环,主要是指这里面四个阶段,而最后呢,就是SIM具体的执行寄存器的访问和执行的循环里面呢,就包括三个非常重要的内容,就是。
10:52
我们具体的操作的集合,还有alu的计算,还有我最后的一个memory,三个阶段的循环,三个阶段的循环呢,就组成我们SSIMM整个硬件的核心的流水,而把这个核心流水呢,再往大的去放一放,把它们的细节再往下的展开一下,同样的,左边的这个模块呢,绿色的是我们的SIM的前端,后面橙色的这个模块呢,就是我们SIM的后端,我们的data p,可以看到我们这里面有很多个pcp,就是Ming,不是指我们的这里面呢,值得注意的是因为我们的硬件的或者我们计算机体系里面具体的概念,那取解的时候呢,我们可以有非常多的instruction,取到具体的instruction之后呢,我们就会把真正的SSIM的sta,然后放在这里面有一个简单的堆栈,真正堆栈运行的时候呢,就会把所有的线程去分发到我们具体的每一个L里面,在真正具体执行里面呢,我们采用的是S的一个具体的。
11:52
执行方式可以看到呢,里面有非常多个A的和,也是因为我们说SSIMMT,它主要是做了一个具体线程前端的控制,后面真正执行的是SMT的方式,如果有兴趣的同学呢也可以,那有兴趣的同学也可以把这张图记录下来,深入的去研究一下整个SMMD硬件的核心的流水的形态,现在呢,我们来简单的回顾或者总结一下,SIM跟的本质是相同的,都是单子并多数据,所以说SIM呢,形式上跟SIM是一样的,不过呢它多了一个多线层,本质上呢是硬件执行的还是单线,而比较特别的就是simt呢,会相比SIM更加灵活,允许一条指令对多个数据呢分开去寻子,所以它可以做到每个线程呢独立的去寻子,每个线程呢独立的去运作,而SD呢,必须我们的数据呢是连续的子,所以要求我们的数据呢,必须是对齐的,数据的格式也是对齐的,数据的data也是相同。
12:52
不过呢,反正anyway啊,就是SIM的一种推广,编程模式上呢,更加灵活,我们会在下一个内容里面呢,去跟大家讲讲具体的编程模式,我们现在还是围绕着硬件的架构的定义的形态上面,有了对simd的理解之后呢,我们深入的去看了一下SIM tg simd之后的硬件的改变的形态,现在呢,我们看一下英伟达的库塔的具体的实现,或者塔呢跟D的具体的差别,首先呢,库塔一开始出现的时候呢,或者英伟达一开始出现的主要是做图形,图像处理器嘛,所以呢,它主要是对图形来进行处理,我们这里面呢,以图像为例子,这里面呢有一直我家里养的猫咪,那里面呢,所有的把这个图像呢分开非常多的网格,网格里面呢,就表示所有要执行的任务,但实际上呢,我们不可能说所有的网格同一时间去执行,在网格里面呢,我们就会分开很多个相同线程的,我们机里面呢,叫做每一个线程块呢,假设是会。
13:52
独理里面其中的一个模块,那其中一个模块呢,每个像素点,我们会给线程box里面的每一条弯弯的线段,每一条线程独立的去对我们的像素进行一个计算,那这个时候呢,我们的线程呢,就会分层的去执行,从网格grid到我们的flipb,到最后的线程块去执行,而线程跟线程之间呢,就可以通过本地的数据共享缓存进行一个数据的交换。那现在呢,我们倒推回来看看Q打的具体的编程的形态,或者扩打跟硬件的概念,在我们的一个box里面呢,所有线程都是执行同一段代码,那这段代码我们在英伟的HP里面呢,我们叫做kel,所以我们之前说到了AI框架,我们看到很多算子,算子呢是一个高度抽象的概念,每个算子里面呢,可能针对一个K来实现,也可能针对多个去实现,而每一个线程呢,都有自己的一个index,就是自己的一个位置,用于计算内。
14:52
地址和执行具体的控制逻辑的,我们看看下面的这个内容呢,就是一个里面具体执行的内容,这个呢就支持同时的去执行同一个指令,那这个指令呢比较简单,就是A加B等于C,其中的I呢,就是我们的索引I等于ID的X idx呢就是每个线程会去索引自己的一个独立地址的数据,然后进行一个执行计算,那现在呢,我们把所有的把它组合起来,变成一个GR,那这个时候呢,一个GR呢,将相乘组发分成为多个fat,线程块呢,就变成因为达里面的SM的调度单元,SM呢是它硬件的具体的一个真正的形态,而呢就是我们编程里面抽象出来的概念,现在我们看一下刚才的简单的例子,刚才呢,我们只有ID,但是呢,现在多个或多个组合起来之后呢,我们的ID之上呢,要进行多一层的索引,多一层的索引呢,叫做I。
15:52
跟box定,因为它有两个维度,一个横向的维度,一个竖向的维度,取决于我们具体硬件的计算单元的排布,所以呢,执行这么一个相同的操作,我们再加一层索引,就可以完成大规模的数据的并行的操作了。那最后呢,我们看一看英伟达的回顾一下哦,英伟达的soft ma就是库DA跟hardware之间的一个概念,现在呢,线程就是我们的fact,以线程快为单位被分配到我们的XM上面,SM呢就负责维护线程块和线程ID,对它进行执行和调度,而每个线程块每个呢又以N个线程一个web被执行,那web呢,是里面的调度单位,真正web里面执行的是一个simd,也就是我们刚才讲到的后端SIM的data p具体的执行呢,还是一个的形态。那最后呢,我们回顾一下编程。
16:52
它的本质和硬件执行的本质,这个内容呢,我们会在下一个视频里面跟大家详细的去展开和探讨的。首先什么是编程模型,什么是执行模型,之前呢,我们看到左边的这个图呢,就是大量的程序员,其实我们是不理解硬件具体是怎么执行的,我们更关心的focus点在于我们的程序应该怎么去做,我们的计算应该怎么做,而真正的ex model呢,就是我们的硬件去执行的simd跟simt,他更关心的是一个指令来了之后,我怎么去控制我的硬件去执行真正的计算。所以我们真正的execution model呢,跟我们的光model之间呢,是有一个GAP的execution model呢,是执行SIM,或者而我们的program model呢,是怎么样的形态,为什么扩大,大家会觉得这两个事情呢,都变成SIM呢,这是值得我们去思考的,我们也会在下一个内容里面呢,去跟大家去打开,到底编程模型是什么,到底执行模型是什么。
17:52
我们简单的去看了一下simd单指令多数据的具体的概念,然后看了一下simd单指令多线程的一个概念,最后呢,我们以英伟达的库达的实现去看一下SSIM里面的硬件跟SD面的编程方式是怎么去实现的,这里面呢有一个GA,就是硬件的执行方式跟软件的编程方式呢,其实我们现在还没有打开去讲,为什么酷塔为什么SSIM这么香,我们将会在下个内容跟大家去汇报来,今天的内容呢,就到这里,谢谢各位,拜了个拜,卷的不行了,卷的不行了,AI系统的全站知识都会分享在这里,欢迎打开和吐槽,给我一键三连,给我一键三连啊,谢谢各位,拜了个拜。
我来说两句