龙芯中科吧 关注:573贴子:15,826

关于LA664和LA364的畅想

只看楼主收藏回复

首先庆祝@鹘鹰 当选吧主,之前也答应吧友过要发一篇LA364的预想。
然后因为我觉得LA364应该是LA664的规模减半版本,所以连同LA664也一同畅想一下。
没有任何料,纯脑内意淫,猜对了是意外,猜错了是常态。
另外,因为工作的原因,随时可能断更弃坑。


IP属地:浙江1楼2022-12-07 11:02回复
    首先来个黑历史,8个月前对LA664的预估:

    然后是目前爆料出来的规模:6发射乱序执行,4个定点单元,4个浮点单元,4个访存单元,ROB256项。
    我只能说我还是太保守了,或者我还是太小看了龙芯,你看这脸打得,啪啪的响……


    IP属地:浙江2楼2022-12-07 11:07
    收起回复
      整挺好 不要停


      IP属地:吉林来自Android客户端3楼2022-12-07 11:27
      回复
        继续


        IP属地:广东来自Android客户端4楼2022-12-07 11:44
        回复
          出一个低配版进军轻薄本或入门机市场 价格低廉造造声势


          IP属地:河南来自Android客户端5楼2022-12-07 13:12
          收起回复
            继续,先预测一下LA664。
            取指应该还是从GS464E沿用下来的32B,对应8条指令,对于6发射来说足够了,问题是LA664支持SMT,那要如何为2个线程分配取指带宽,牙膏厂的方案是每周期交替,农企的方案是拆成2个16B每个线程各占1个,两家采用不同方案的原因主要是X86指令长度不定,需要在解码前增加一个预解码的阶段,以确定指令的边界,农企在指令载入缓存的同时对该缓存行进行预解码,并将预解码信息存储在缓存TAG中,取指说是2组16B,其实是2组2个指令且2个指令长度不能超过16B。而牙膏厂预解码是在指令队列中进行的,取指的时候还不知道指令边界,只能一股脑的将16B缓存都先取进指令队列。对于指令等长的LA来说,情况更类似农企,只不过不需要通过读取缓存TAG就能分辨指令边界,并且也不需要考虑指令超长的问题,所以LA664采用2组16B设计的可能性更大一些。


            IP属地:浙江6楼2022-12-07 15:58
            收起回复
              指令队列,这个逻辑部件在GS464E中,同时还承担了循环缓冲的功能。如果需要保留此功能,指令队列估计还是需要每个线程独占一个,以免线程A的指令流对线程B的循环体造成干扰。规模上沿用GS464E的64项,差不多也能涵盖程序中的大多数热点循环,实在要增加应该不会大于96项吧。农企的推土机是32项,后面增加到40项,ZEN是借用了op cache,牙膏厂在2个线程公用和独占之间反复横跳,直到Skylake之后就都是2个线程独占,Ice Lake是2组70项。


              IP属地:浙江7楼2022-12-07 16:17
              回复
                分支预测,GS464E采用的是分支目标缓冲+动态分支预测器+返回地址堆栈+间接目标缓冲的组合,涵盖了非条件分支,条件分支,调用返回,间接分支几乎所有分支指令类型。LA464应该沿用了这款组合,但规模可能比GS464E要更大一些。
                具体分开来分析,GS464E的分支目标缓冲规模非常小,LA664应该会增大,但不知道会不会引入目前高端核心常见的多级BTB。
                GS464E的动态分支预测器采用的是本地/全局复合预测器,本地应该是双模预测器,全局应该是按地址分set的两级自适应预测器,这套设计和推土机非常的类似,但推土机也证明了本地/全局复合预测器并不适用与多线程的环境,在多线程模式下,推土机的全局两级自适应预测器被2个线程互相干扰,几乎无法发挥正常的作用。牙膏厂在SNB重新引入SMT后,为避免线程间干扰,配备了2套动态分支预测器,分别为2个线程所使用,当然这个方案非常蠢,浪费了面积和功耗,所以在Haswell就换成了变种的TAGE。农企在ZEN上使用的是所谓的神经网络预测器,其在分类上属于本地预测器,所以并不受多线程影响,但预热非常的慢,到了ZEN2,为了解决神经网络预测器的问题,在其后又加一套TAGE,后来农企也发现这么做非常的蠢,到了ZEN3去掉了神经网络预测器,直接使用TAGE。这两家在面对SMT对分支预测造成的影响时,兜兜转转最后殊途同归,都采用了TAGE或者类TAGE的分支预测器。龙芯在上SMT时应该会参考这两家的教训,估计LA664会直接一步到位采用TAGE作为动态分支预测器。
                返回地址堆栈没什么好讲的,加规模就是了。间接目标缓冲,记得龙芯之前讲到过,二进制翻译缺少对间接跳转的支持,估计龙芯会类似具有二级地址翻译的TLB一样,搞出个具备二级地址预测的间接目标缓冲,具体怎么搞我也不知道,只不过理论上TLB能X86虚地址-LA虚地址-实地址这么映射,间接目标缓冲应该也能这么映射,大不了翻译模式下损失一半的容量,总比没有要强,兆芯你说是不是。


                IP属地:浙江8楼2022-12-07 19:44
                收起回复
                  微架构剖析好评
                  楼主觉得龙芯什么时间节点上512、768甚至1024的ROB


                  IP属地:加拿大来自iPhone客户端9楼2022-12-07 22:59
                  收起回复
                    不是3a4000已经tage了?后面的应该都用上了吧


                    IP属地:广东来自Android客户端10楼2022-12-08 16:04
                    收起回复

                      这图看LA364要到A75水平,以后开源的就是LA264及以下


                      IP属地:贵州11楼2022-12-09 07:58
                      收起回复
                        解码器是最没什么好说的,RISC指令等长,最多3输入和1输出,LA还没有eflag指令,除了可能存在极少数需要解码成多条微操作的指令外,应该都能做到指令与微操作一对一解码,这比X86要简单太多了,所以6个解码器应该都是对称设计。但因为LA操作码变长的原因,还是要比RV要复杂一些,可能和ARM差不多,一个操作码变长,一个有eflag指令。


                        IP属地:浙江12楼2022-12-09 09:55
                        回复
                          终于转阴了,继续来水贴。
                          解码后的指令会成为微操作,即便LA操作码变长,但指令等长,更重要的是LA几乎严格遵循一条指令只产生1个结果以及load-store结构,是非常典型的RISC,并且LA464的向量单元宽度也是256bit,几乎不存在需要分成2次执行的指令,所以微操作应该能与指令做到一一对应。那为什么还需要解码,这主要是为了方便实现微架构和指令集架构的解耦。由于非对齐访问的低效,以及程序大小的限制,目前RICS的指令长度普遍限制为32bit,但这也导致了其在设计上缺乏灵活性,LA的解决方法是在固定的32bit指令长度内,通过多种不同长度的操作码,以对应实现不同的需求。例如需要较长的立即数时,操作码设计成最短,将指令空间尽量都给立即数使用;而当仅需较短的立即数或少量寄存器的指令,就可以采用较长的操作码,以尽量拓展指令数量。而这样的设计并不便于在微架构内实现流水线,内部微架构需要微操作尽可能的规整,N位至M位是什么,就所有的微操作都一样。但反过来,用于微架构内部的微操作却并不需要与其前后代的微架构保持一致,我可以这个微架构的微操作操作码是10位,下一代不够用扩展到11位时,这并不会对已有的程序产生兼容性的问题。所以即便是RISC,也同样无法缺少解码环节。
                          根据第三版计算机体系结构基础中的内容推测,LA464内部的微操作结构为op+src1+src2+src3+dest+imm,各部分长度未知。根据目前已知LA合计共有2000多条指令,推测微操作的op长度至少为12bit;虽然LA的通用寄存器为32个,但考虑到存在其他控制寄存器,以及便于寄存器重命名的实现,按2组128项物理寄存器的数量,src和dest至少需要8bit;LA目前能支持最长的立即数为26bit,所以imm应该也至少是26bit。由此还原出来LA464的微操作应该是12bit+8bit+8bit+8bit+8bit+26bit的结构,合计长度70bit。在解码时,无论是2R 22bit的操作码,还是I26 6bit的操作码,都将按预设的规则映射为微操作的12bit op,然后无论需要1个寄存器还是4个寄存器,都先按编译器给的5bit编号,映射进src和dest 8bit的低5bit,如果不需要就设为0,反正0号寄存器内的数值永远为0,然后在后续的寄存器重命名阶段可以再映射为内部物理寄存器的8bit编号,最后无论是否存在立即数以及立即数的长度,都映射到26bit的imm中,至此完成解码阶段。这个环节在LA664上应该大同小异,但考虑到LA664的物理寄存器数量肯定会大于2组128项,所以src和dest的长度估计还要再各增加1位达到9bit,也就是说LA664的微操作长度可能为74bit。


                          IP属地:浙江13楼2022-12-28 16:10
                          收起回复
                            之后就是寄存器重命名阶段了,在这里会通过一个映射表,实现指令集架构与微架构的寄存器之间的解耦,可以更好的利用微架构那数量远多于指令集架构的寄存器,消除因程序编译时寄存器重名产生的指令之间伪写后读和写后写相关,以便更多的指令能在下一阶段实现乱序执行。LA464已经是采用物理寄存器,在寄存器重命名阶段,将之前解码好的微操作按功能区域进行处理和分割。首先为src1、src2、src3、dest(可能还包含imm,如果需要包含imm,则在此阶段还需要将imm中的数据存入重命名后的寄存器中)分别分配空闲的物理寄存器编号,并将映射关系按指令顺序存入ROB,ROB中存储的是原始指令的寄存器编号和重命名后的物理寄存器编号,其结构为:“原寄存器1编号”+“原寄存器1映射的物理寄存器编号”+“原寄存器2编号”+“原寄存器2映射的物理寄存器编号”+“原寄存器3编号”+“原寄存器3映射的物理寄存器编号”+“原目标寄存器编号”+“原目标寄存器映射的物理寄存器编号”+其他控制位,长度估计在62-66bit(LA464 2组128项寄存器62bit应该够了,LA664大于2组128项寄存器,每组映射各加1bit,预计需要66bit)。而微操作中的src1、src2、src3、dest则被替换成映射后的物理寄存器编号后,继续送往下一阶段来到调度器,或者也叫保留站。如果是非物理寄存器的设计,在寄存器重命名阶段,ROB中存入的是原始指令的寄存器编号和其中的数据,如果目前数据尚未载入,则先保留长度置为全零,其ROB的结构就变为:“原寄存器1编号”+“原寄存器1需存储的数据”+“原寄存器2编号”+“原寄存器2需存储的数据”+“原寄存器3编号”+“原寄存器3需存储的数据”+“原目标寄存器编号”+“原目标寄存器需存储的数据”+其他控制位,如果考虑到需要与向量寄存器通用,当向量宽度为128bit时,其长度为542bit,而当向量宽度增加到256bit时,其长度会达到1054bit。当然还有一种给向量指令分配多项ROB的方式,但这反过来又会导致ROB的实际可用数量减少。所以在支持向量指令的微架构中,采用非物理寄存器的设计,反而会导致复杂度的增加,而大量的数据移动也会增加延迟和功耗,导致频率提升困难。农企在推土机及其之后就一直采用物理寄存器设计,而牙膏厂在NetBurst已经采用了物理寄存器设计,但在Core2和Nehalem反而退回到了非物理寄存器,但在SNB及其之后又重新采用物理寄存器设计,兆芯就可能奇特了,根据chipsandcheese那篇文章,以赛亚已经采用了物理寄存器的设计,但兆芯“改进”成五道口的时候,又变成非物理寄存器的设计了,而下一代的CNS又是物理寄存器设计。


                            IP属地:浙江14楼2022-12-29 09:37
                            回复
                              调度器中每一项的结构和微操作基本类似,但为了实现tomasulo算法,会增加一些控制位,以提示数据源寄存器是否已经载入数据,当所有数据源均已就位,且所需的执行管线空闲时,该条微操作就会发射到执行管线中。执行管线根据微操作中src的物理寄存器编号读取数据源,并根据op设置执行方式和选择输出结果,然后结果按照dest的物理寄存器编号存储到指定的物理寄存器中,之后根据物理寄存器编号找到ROB中对应的条目,将其控制位中的表示已写回的更新为1。在该条目移动到队列顶端时,如果已写回的标志位为1,就能执行提交阶段,根据该条目存储的物理寄存器编号与逻辑寄存器编号的映射关系,将对应物理寄存器中的数据,提交给程序可见的逻辑寄存器,并将该条目从ROB中删除,同时ROB中后续所有条目均前移一项,至此完成提交。在微操作发射到执行管线后,如果src所对应的物理寄存器编号,不存在与调度器内的其他微操作中,则需要及时将其释放,以便后续微操作寄存器重名时使用。
                              由上可知,ROB、物理寄存器、调度器三者之间的数量关系。1.ROB只要未提交,均需占用1项物理寄存器,用于映射目标寄存器;2.调度器只要未发射,均需占用1-3项物理寄存器,用于映射源寄存器;3.部分微操作的源寄存器相同,或者其源寄存器为其他微操作的目标寄存器;4.可流水微操作的最大延迟周期数*管线数量+调度器的项数,应小于等于ROB的数量(否则可能出现因没有足够的ROB,在即便调度器存在空闲的情况下,依旧无法派发微操作从而导致流水线气泡产生的情况,虽然反过来也会产生气泡,但毕竟调度器是无序队列,结构比有序队列的ROB要复杂很多,更不应该让复杂结构被简单结构所限制)。现在已知LA664的ROB为256项,如果假设可流水微操作的最大延迟周期数为5,执行管线数量为12,则调度器合计项数应小于等于196项。如果假设整数和浮点物理寄存器各256项,合计512项,则调度器应该大于128项(因为平均所需的源寄存器数量会少于2)。考虑到LA664的调度器应该还是会沿用GS464E以来,分成整数、访存、浮点向量三个的设计,如果进一步假设这三者的项数相同,并且考虑到执行管线的数量可能会是4的倍数,则在合计128-196项的范围内有44、48、52、56、60、64项这几种可能。个人偏向于48项,整数、访存、浮点三者合计144项,相比LA464增加50%。


                              IP属地:浙江15楼2022-12-29 15:56
                              收起回复