intel吧 关注:746,155贴子:3,025,005

基于Alder lake的内存子系统与性能杂谈

只看楼主收藏回复

由于疫情的缘故,被困在魔都已经五十多天了,困着就想摸鱼,再加上物流不通,因此很多测试都未能顺利进行,不过还是趁着被封控的功夫做了一点有意思的测试。
内存子系统,是CPU中的重要组成部分,它的缓内存配置,与CPU的实际性能直接相关。
在很多场景中,单线程性能往往使用Latency Performance(延迟)表示,而多线程性能则习惯性用Throughput Performance(吞吐)表示,这实际上揭示了不同侧重性能对内存子系统不同方向上的要求。
因此合理的配置对其性能的好坏具有极大的影响,在这里,我们将基于Alder lake系统,来阐述Latency/Throughput对性能的影响。
这边我们使用的测试环境如下
CPU:
Intel Core 12700K,其中P core固定在5.0 Ghz全核心,以避免由于多线程turbo影响频率,从而在影响多线程的效率计算。类似的,E core被固定在3.8 Ghz全核心。
总线频率被固定在了4000 Mhz,这主要是为了避免由于开关E core导致的ringbus频率变化从而影响测试结果。
DRAM:
这里我们使用的是芝奇的4000CL19的皇家戟,容量为2*16 GB。
具体设置为4000CL16-16-16-32-320-65535,Gear1模式。
OS:Win 11/WSL2/Ubuntu20.04
我们首先对该系统的内缓存的延迟情况进行了相应的Full random latency测试,并标出了对应的一些重要节点。

在Alder lake系统中,我们同时对P/E的内缓存延迟进行了相应的测试。
可以看见在E core的cache中,实际上有一些比较重要的延迟变化情况,在比较重要的几个变化点在L2与L3中。
其中影响比较大的系192KB与512 KB位置,前者超过L1 TLB的cover范围,因此从这个点开始latency将有所增加,而后者则是L2从private过度到4C shared的部分,因此这个点之后的latency也会略有变化。接近的情况也出现了L3中,只不过由于L3(LLC)系全核心shared的部分,故不存在由于缓存性质导致延迟变化节点。
E core的内存延迟大约在79ns左右,系256 MB处的测试情况,实际上我们测试过1 GB附近的情况,延迟也大概在80-81ns左右,因此这里我们标注了79-81ns,对应的cycle数大约为300-308左右。
类似的,我们也对P core的情况进行了相应测试,其内存延迟大约在59-62ns,其中59ns在256M处取得,62ns则约在1 GB处取得,对应的cycle数大约为296-309左右,可以看见其与E core的内存延迟在cycle层面实际上是相差无几的。
Latency ns=cycle/frequency。
值得注意的是,从E-core访问L3的速度似乎比从P-core访问来的更快,快大约10 cycle。


IP属地:上海1楼2022-05-01 22:27回复
    我们同时使用SPECint2017以及Geekbench 5.4.4进行了相应的性能测试,结果如图。
    其中SPEC测试使用的是WSL2-UB20.04+GCC10.3.0环境,这里我们使用了-ofast + -flto的测试条件,尽可能的获得相对较高的分数,具有较好的对比效应。

    在测试的过程中,我们使用Intel Vtune进行了相应的监测,这里选取其中的典型代表SPECint的500.perlbench_r项目结果参考。

    可以看见在这个项目的内存子系统考量中,比较明显的瓶颈出现在latency而不是bandwidth上,类似的情况也出现在其他的几个子项目里。
    换句话说,单线程的瓶颈对于内存子系统来说,更多的出现在延迟层面。


    IP属地:上海2楼2022-05-01 22:28
    回复
      紧接着,我们对单个核心能获得的带宽也进行了相应的测试,可以看见单个P核心可以从DRAM中获得30-35 GB/s的带宽,L3中获得80-90 GB/s带宽,L2甚至可以获得超过200 GB/s的read带宽,考虑到绝大多数单线程应用的带宽需求平均都不会超过 10GB/s,峰值也相对难以达到30 GB/s的情况,可以说:对于单线程情形来说,绝大多数情况下的带宽都是相对足够的。

      对于E core来说,由于Alder lake的内存分配以及自身微架构对应缓存配置等原因存在,其可获得的带宽相对还是相对较低,当然其规模也相对较小,而且在绝大多数情况下很难被分配到单线程任务。
      当然也有少数的几个项目会面临带宽瓶颈的情况,譬如一些对吞吐要求相对较大的相关浮点项目。

      农企临时工说:yes!


      IP属地:上海3楼2022-05-01 22:29
      回复
        但是上述的情况在多实例任务中就会产生很大的变化,当每个线程或核心都需要承担一个实例 进行多线程计算的时候,此时更多的瓶颈就会出现并且落在带宽项目上,尤其是内存带宽。
        在这里,我们首先对8P与4E的情况进行了相应的带宽测试。

        从结果中我们注意到,虽然单个核心可以获得超过30 GB/s的内存带宽,但由于受限于128 bit DRAM controller以及DDR4-4000的内存,实际8C可以获得的最大内存带宽仅有大约60 GB/s,而此时16M处的L3缓存带宽则高达600 GB/s以上。假设8个P核心同时进行8个实例任务,对应的每个任务将仅能分配到7.5 GB/s的带宽,在这种情形下,内存带宽的瓶颈是可以预见的,多实例任务的效率将很容易受到带宽的影响而打折扣。
        我们以P core+8 copies的502.gcc_r项目为例,使用Vtune进行分析,结果如图所示。

        从结果中可以看见,此时内存带宽成为了OS中占比最大的瓶颈项目,停滞占比甚至高达16%(0.252*0.644),作为int项目在多线程应用中尚且严重的受到双通道带宽限制的影响,何况是浮点项目呢?
        如果说P core的多线程限制更多出现在整个CPU的内存带宽不足上,那么E core的问题出现的更多。

        由于4E跟1E是shared 2M L2的缘故,其L2的可用带宽并没有随着核心数增加而线性增加。
        而到了LLC以及DRAM上,由于1C/4C需要使用相同一组的ringbus agent跟snoop filter,以及微架构自身的缘故,这里的多线程实际L3 带宽情况简直惨不忍睹。
        4C能使用的L3 bandwidth竟然只有60 GB/s,能使用的DRAM bandwidth甚至只有42 GB/s,先不谈在P+E的多线程中能分配到的带宽问题,即便是单cluster分配满带宽的情况,对于每个核心来说也仅有10.5 GB/s左右,这种级别的带宽在很多浮点负载上是决然不够使用的,甚至在一些整数负载上都会出现一定的带宽瓶颈问题。


        IP属地:上海4楼2022-05-01 22:32
        回复

          在这里,我们对不同线程的情况进行了SPEC的相应测试,并将最终结果和子项同时放在本文中。


          可以看见,对于int项目来说,其主要的瓶颈出现在4P以上的情况下,此时因受带宽限制。多线程的效率有比较明显的下降,部分子项甚至出现倒挂情况。
          假设我们按照4P+4E 共5 cluster(其中4E共享一个cluster)的情况分析,假设带宽平均分配,此时每个cluster分配到的带宽约为12 GB/s,此时对于单个的P核心来说,还属于带宽相对足够的情况,而对于4E来说,12 GB/s的带宽会对其多线程效率整体产生明显的瓶颈,单个核心仅能分配到3GB/s不到的带宽,对于peak需求时的情形来说是显著不足的,这也可以从int结果也可以判别得知。
          而对于FP项目来说,其主要的带宽瓶颈分界线出现在2P+4E之后,这也证明FP子项实际更吃内存带宽。


          IP属地:上海5楼2022-05-01 22:33
          回复
            相对的,我们也测试了Geekbench的情况,如图所示。

            尽管GB使用的带宽量相比之下较小,但相对显著的带宽瓶颈也出现在了4P+4E的情况,与先前类似。
            需要注意的是:这个1T的N-Body Physics跑了很多组都是很低的结果,另外这里的1T选择的是1C1T跑GB5的多线程,而非是单线程部分。当指定1C1T进行测试时,GB5的单线程与多线程的测试方法并不完全相同,因此会产生即便都是1C1T测试,但ST仍旧会比MT高一些的情况。
            在多线程系统中,部分场景中,缓存带宽的多少也将在一定程度上影响性能。


            IP属地:上海6楼2022-05-01 22:34
            回复
              值得一提的是,在Alder lake的系统中,当E core关闭(NE)时,P core从L3中将获得更多的bandwidth。
              如图所示,在16-32M L3附近,8P可以获得大约最多 约多10%的带宽,此时L3的访问延迟大约少2ns即10 cycle左右,即在没有E的情况下系统会更加依赖于L3,从L3获得更多的吞吐。


              但我们还注意到,如果E core开启时,L2的的实际延迟会相对更低一个cycle,而在L3的8M以内即L2 TLB cover范围内 P core 获得的带宽也将比关闭E时稍微多一些,这彰显了E core的开关对内缓存子系统的实际影响情况。
              对于数据集能够大量hit L3 大约16-32M范围内应用来说,关闭E core对于能够获得一定的性能提升,这里我们使用Geekbench进行相应测试,其内存要求相对较低,其能比较好的反应这个过程。

              当使用的实例为8C时,此时E 关闭能获得更好的性能情况,已经用绿色标注。
              然而当我们进一步缩减实例至4P4T时,多测试下来我们发现E core关闭反而会带来性能下降的情况,一开始我们怀疑是否是测试产生的误差,但定频的多次测试均获得了接近的结果。

              农企临时工把锅背上就完事了!
              这种情形的出现,我们猜测实际上应该与E core的L3相关依赖性有一定的关系。在之前的延迟测试中,我们可以清晰的看见,E core的L3比P core实际上要低 10 cycle左右,这似乎意味着它更适合依赖L3,但是由于L3的bandwidth相对较低,似乎也需要加大L2来提供一定的带宽。
              总结一下,简单的说,就是当E开启时,P的L2依赖增加,L3依赖相对减少。
              这种独特的内存子系统设计十分有趣,这让我们不禁升起了新的想法,如果要进一步改进的话,又该怎么做呢?
              从内存角度:必不可少的是增加能支持的内存频率,从而增加带宽,继而增加多线程性能。
              从缓存角度:
              由于受限于4C/cluster的情形,因此E的多线程带宽相对会受到一定的限制,对于E来说,增加其L2的大小跟带宽从而缓解总体带宽不足的情形也许是一个比较优的选择,大量增加L3的收益也许会比较低,因此其能获得的L3 bandwidth实际上是比较少的,当然增加L3可以小幅提升对应的单线程性能,但对于并不承担单线程性能的E core来说,意义不会很大。
              对于P来说,尽可能的增加P core的私有缓存大小与带宽,这可以降低其对L3的需求量,从而使得E core能获得足够的bandwidth毫无疑问是较优的选择。当然L3的增加也会小幅影响单线程性能,所以最好能跟着进一步增加。


              IP属地:上海7楼2022-05-01 22:36
              回复
                关于缓存/延迟 与性能的关系,更多的情形要考虑微架构的吞吐情况,这里我们以Zen3D以及Broadwell的情况做了相应的测试。
                从借测的7773X对比7763的情况看,虽然每个core能访问的L3从实际的32M增加到了96M,但单线程性能同频性能,实际上增加的性能换算下来,平均仅有2-3%左右。回头如果借到58X3D的话,会进一步分线程做更加详细的测试。
                这个结果证明在32M大小的L3下,单线程所需的L3已然接近饱和,进一步增加并不能有效的提升性能。然而,到了多线程中,这种情况出现了比较大的改善,其SPEC2017 N-copy的性能增加了将近10%之多,这意味着这个尺度大小的L3更多提升的还是多线程性能。
                除了增加cache大小之外,增加一级的新的缓存也是一种比较常见有趣的调整思路。
                我们借用4C的BDW进行了相关的测试,在同频的情况下,128M的L4延迟大约在 30-40ns附近,在DDR3的年代,其可以提供比1600 Mhz的DDR3内存更多的带宽(接近DDR4 3200的水准)与更好的延迟,可以缓解6M L3带来的问题(5850HQ,故L3为6M)。

                从结果中可见,其ipc提升约在6%附近,由于受限于测试时间与条件,我们没能进一步测试5850HQ多线程的情况。但可以预见的是,L4的SOC显然在这一方面也会有比较有意思的提升。
                至此,我们已经针对一些有意思的情形进行过相应的探讨,本文也将在此告一段落,接下来就是雷丘君的摸鱼时间啦XD,我的关注者们,下一篇文章再见(如果有的话)。
                感谢在这篇文章的测试过程中提供帮助的朋友们
                1.轮子妈
                2.d大
                雷丘
                2022.5.1


                IP属地:上海8楼2022-05-01 22:37
                回复
                  能坚持看完的,cpu都不会弯............


                  IP属地:广东9楼2022-05-01 22:39
                  收起回复
                    大佬,sa电压要自动还是手动


                    IP属地:河南来自Android客户端10楼2022-05-01 23:55
                    收起回复
                      可以,十三代就按这么改


                      来自手机贴吧11楼2022-05-02 01:05
                      回复
                        我想玩13代


                        IP属地:江苏来自Android客户端12楼2022-05-02 03:29
                        收起回复
                          内存一直是瓶颈,服务器cpu更为明显


                          IP属地:广东来自Android客户端13楼2022-05-02 08:43
                          回复
                            cy


                            IP属地:辽宁来自Android客户端14楼2022-05-02 10:40
                            回复
                              12代这个L3延迟太烂了,要是L3有Zen3的延迟水平说不定IPC会更好看一点,13代的ring有12个节点,恐怕L3延迟会更难看,增加L2可能是唯一的选择


                              IP属地:广东15楼2022-05-02 12:05
                              收起回复