为什么我的超轻薄笔记本电脑CPU不能在HPC中保持最高性能?

16
我开发了一个高性能的Cholesky分解程序,应该在单个CPU上(不考虑超线程)的峰值性能约为10.5 GFLOPs。但是当我测试其性能时,出现了一些我不理解的现象。在我的实验中,我测量了从250到10000逐渐增加的矩阵维度N的性能。
  • 在我的算法中,我应用了缓存(调整了块因子),并且在计算期间始终使用单位步幅访问数据,因此缓存性能是最佳的;TLB和分页问题已被消除;
  • 我有8GB可用RAM,并且在实验过程中最大内存占用量不到800MB,因此没有交换发生;
  • 在实验期间,没有运行像Web浏览器这样的资源密集型进程。只有一些真正便宜的后台进程在运行,以记录每2秒的CPU频率和CPU温度数据。
我希望无论我测试什么N,性能(以GFLOPs为单位)都应该保持在大约10.5左右。但是在实验中间观察到了显着的性能下降,如第一张图所示。
CPU频率和温度在第二和第三张图中显示。实验在400秒内完成。当实验开始时,温度为51度,当CPU忙碌时,温度迅速上升至72度。之后它缓慢增长到最高点78度。 CPU频率基本稳定,并且在温度升高时没有下降。
所以,我的问题是:
  • 由于CPU频率没有下降,为什么性能会受到影响?
  • 温度如何影响CPU性能?从72度到78度的增加是否真的会使事情变得更糟? enter image description here enter image description here enter image description here

  • CPU信息

    System: Ubuntu 14.04 LTS
    Laptop model: Lenovo-YOGA-3-Pro-1370
    Processor: Intel Core M-5Y71 CPU @ 1.20 GHz * 2
    
    Architecture:          x86_64
    CPU op-mode(s):        32-bit, 64-bit
    Byte Order:            Little Endian
    CPU(s):                4
    On-line CPU(s) list:   0,1
    Off-line CPU(s) list:  2,3
    Thread(s) per core:    1
    Core(s) per socket:    2
    Socket(s):             1
    NUMA node(s):          1
    Vendor ID:             GenuineIntel
    CPU family:            6
    Model:                 61
    Stepping:              4
    CPU MHz:               1474.484
    BogoMIPS:              2799.91
    Virtualisation:        VT-x
    L1d cache:             32K
    L1i cache:             32K
    L2 cache:              256K
    L3 cache:              4096K
    NUMA node0 CPU(s):     0,1
    
    CPU 0, 1
    driver: intel_pstate
    CPUs which run at the same hardware frequency: 0, 1
    CPUs which need to have their frequency coordinated by software: 0, 1
    maximum transition latency: 0.97 ms.
    hardware limits: 500 MHz - 2.90 GHz
    available cpufreq governors: performance, powersave
    current policy: frequency should be within 500 MHz and 2.90 GHz.
                    The governor "performance" may decide which speed to use
                    within this range.
    current CPU frequency is 1.40 GHz.
    boost state support:
      Supported: yes
      Active: yes
    

    更新1(对照实验)

    在我的原始实验中,CPU从N = 250一直工作到N = 10000。许多人(主要是在重新编辑之前看到这篇文章的人)怀疑CPU过热是性能下降的主要原因。然后我回去安装了lm-sensors Linux软件包来跟踪这些信息,确实,CPU温度上升了。

    但为了完整地呈现情况,我进行了另一个对照实验。这次,我在每个N之间给CPU一段冷却时间。这是通过要求程序在循环通过N的开始处暂停若干秒来实现的。

    • N在250和2500之间时,冷却时间为5秒;
    • N在2750和5000之间时,冷却时间为20秒;
    • N在5250和7500之间时,冷却时间为40秒;
    • 最后,N在7750和10000之间时,冷却时间为60秒。
    请注意,冷却时间要比计算时间长得多。对于N = 10000,仅在最高性能下需要30秒进行Cholesky分解,但我要求60秒的冷却时间。
    在高性能计算中,这显然是非常无聊的设置:我们希望机器一直以最高性能运行,直到完成非常大的任务为止。因此,这种停顿毫无意义。但这有助于更好地了解温度对性能的影响。
    这次,我们看到所有N都实现了峰值性能,就像理论支持的那样!
    CPU频率和温度的周期特征是冷却和提升的结果。温度仍然呈上升趋势,仅因为随着N的增加,工作负载变得越来越大。这也证明了需要更多的冷却时间来使其足够冷却,就像我所做的那样。
    达到峰值性能似乎排除了除温度以外的所有影响。但这真的很烦人。基本上它说计算机在HPC中会感到疲劳,所以我们不能获得预期的性能提升。那么开发HPC算法有什么意义呢?
    OK,这是新的一组图表: 输入图片描述 输入图片描述 我不知道为什么无法上传第6个图。SO在添加第6个图时不允许我提交编辑。对于CPU频率的图表,我很抱歉无法附加。

    更新2(如何测量CPU频率和温度)

    感谢Zboson添加x86标签。以下bash命令是我用于测量的:

    while true
    do 
      cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq >> cpu0_freq.txt  ## parameter "freq0"
      cat sys/devices/system/cpu/cpu1/cpufreq/scaling_cur_freq >> cpu1_freq.txt  ## parameter "freq1"
      sensors | grep "Core 0" >> cpu0_temp.txt  ## parameter "temp0"
      sensors | grep "Core 1" >> cpu1_temp.txt  ## parameter "temp1"
      sleep 2
    done
    

    由于我没有将计算固定在一个核心上,操作系统会交替使用两个不同的核心。更合理的做法是

    freq[i] <- max (freq0[i], freq1[i])
    temp[i] <- max (temp0[i], temp1[i])
    

    作为总体度量。

    2
    非常猜测?省电设置?电池?冷却?在此过程中监视笔记本电脑的物理参数?CPU温度等。如果您可以排除硬件限制,那么这将是有用的?分页? - Ryan Vincent
    1
    更多的猜测:我曾经使用过类似的程序 - 在互联网上搜索:“监控笔记本电脑硬件温度” - 例如 http://openhardwaremonitor.org/,还有:http://www.cpuid.com/softwares/hwmonitor.html。搜索您特定的笔记本电脑。我认为硬件限制可能是原因,因为长时间运行CPU会对硬件造成负担并导致“节流”。增加矩阵任务的优先级可能是值得的。请注意 - 我只是在猜测 - 您需要进行一些数据收集。 - Ryan Vincent
    1
    随着矩阵大小的增加,性能的下降可能是由于缓存利用不足造成的。第二种情况可疑地看起来像是你的 CPU 发热,从而降低时钟频率。但同样也可能是其他在该计算机上运行的进程。此外,您应将任务固定到特定的核心上。时间测量是一件棘手的事情。您如何准确确定 FLOPS? - Alexander Vogt
    1
    有一些程序可以让机器高强度运转,它们会告诉你硬件的极限。 - Ryan Vincent
    当矩阵变大时出现TLB缺失?您可以尝试不同的、更大的页面大小吗? - Andrew Henle
    显示剩余3条评论
    1个回答

    9
    您的结论是正确的。您的CPU的持续性能远未达到峰值。这是正常现象:峰值性能仅作为短期“奖励”提供给突发交互工作负载,超过其额定的持续性能,考虑到轻量级散热器、风扇和电源传递。

    您可以在此机器上进行开发/测试,但基准测试将很困难。您需要在集群、服务器或桌面电脑上运行,或者至少是游戏/工作站笔记本电脑。


    从您发布的CPU信息可以看出,您有一款主频为1.20 GHz的具有超线程技术的双核英特尔酷睿M处理器,属于Broadwell架构。它的最高睿频为2.9GHz,TDP-up可持续频率为1.4GHz(在6W时)。
    短时间内它可以运行比其冷却系统所需更快并产生更多的热量。这就是英特尔“Turbo”功能的作用。 它使像您这样低功耗的便携式笔记本电脑能够在Web浏览器等交互性任务中拥有快速的UI性能,因为交互负载几乎总是突发性的。
    桌面/服务器CPU(Xeon和i5/i7,但不包括i3)仍然有睿频功能,但持续频率要接近最大睿频。例如,Haswell i7-4790k的持续“额定”频率为4.0GHz。在该频率及以下,它不会使用(并转化为热量)超过其额定TDP 88W的功率。因此,它需要一个可以处理88W的冷却系统。当功率/电流/温度允许时,它可以提高到4.4GHz并使用超过88W的功率。(用于计算保持88W持续功率的功率历史记录的滑动窗口有时可以在BIOS中配置,例如20秒或5秒。根据正在运行的代码,4.4GHz可能不会将电流需求增加到接近峰值。例如,具有许多分支错误预测的代码仍受CPU频率限制,但这不会接近像Prime95那样饱和256b AVX FP单元。)
    你的笔记本电脑的最大增强速度比额定频率高2.4倍。那款高端的Haswell桌面CPU只能上调1.1倍。最大持续频率已经非常接近最大峰值限制,因为它需要一个良好的冷却系统来保持这种热量的产生。还需要一个可靠的电源,可以提供足够的电流。
    Core M的目的是拥有一个CPU,可以将自己限制在超低功率水平(额定TDP为1.2GHz时为4.5W,1.4GHz时为6W),因此笔记本电脑制造商可以安全地设计一个小而轻的冷却和电力传递系统,并且只处理那么多功率。"场景设计功率"仅为3.5W,这应该代表了实际代码的热需求,而不是Prime95之类的最大功率负载。
    即使是普通的ULV笔记本电脑CPU也被评为15W持续功率,而高功率游戏/工作站笔记本电脑CPU则达到45W。当然,笔记本电脑厂商会将这些CPU放入带有更强劲散热器和风扇的机器中。请参见维基百科上的表格,并比较桌面/服务器CPU(同一页)。
    成就最佳表现似乎排除了温度以外的所有影响。但这真的很烦人。基本上它说计算机在高性能计算中会变得疲劳,所以我们无法获得预期的性能提升。那么开发HPC算法的意义何在?
    其意义在于运行它们的硬件不受严重的热限制!像Core M这样的超低功耗CPU是一个不错的开发平台,但不是一个好的HPC计算平台。
    即使是带有xxxxM CPU的笔记本电脑而不是xxxxU CPU的笔记本电脑也可以做到。 (例如,“游戏”或“工作站”笔记本电脑,旨在长时间运行CPU密集型任务)。 或者在Skylake系列中,“xxxxH”或“HK”是45W移动CPU,至少是四核。

    更多阅读:


    1
    @AlphaBetaGamma,我有点惊讶,因为有人赞同了你的评论,认为在BIOS中禁用Turbo是不必要的,因为频率是稳定的。但是Peter的回答是否认为它稳定,而是会出现突发情况。我向Eigen的一些作者询问了关于GEMM的问题,并告诉我在基准测试中禁用了Turbo。当我在我的Haswell Intel NUC上进行测试时,我禁用了Turbo。它的xxxxU CPU的基础频率很低(大约是一半),但我大多数时间都在NUC上开发,所以我不在意。 - Z boson
    1
    @Zboson:大幅降低频率可能会使某些东西成为CPU限制而不是内存限制。如果内存带宽/延迟是一个因素,那么从笔记本电脑CPU推断到高功率CPU并没有真正安全的方法。如果您确定它是CPU限制,只需使用perf计数器来计算核心时钟周期应该是相当合理的。(我主要看微基准测试,其中计时整个程序不是问题,所以我不必担心仅计算进程中某些代码中花费的时间。) - Peter Cordes
    @PeterCordes,这是一个有趣的观点。我没有考虑过降低频率会偏移结果,因为它不会改变内存带宽。 - Z boson
    @Zboson:当人们将ARM基准测试与x86进行比较,然后争论如果有人制造出像x86台式机CPU一样高频的芯片,ARM会有多好时,这个问题就浮出水面了。您不能总是通过频率线性缩放基准测试结果。在这种情况下,还有其他影响,因为ARM设计可能需要更长的流水线才能达到那些时钟速度,所以分支预测错误惩罚也会更严重。对于英特尔芯片来说,这不是问题,因为它是完全相同的流水线降频,所以它基本上只涉及内存延迟/带宽,可能还有L3。 - Peter Cordes
    @PeterCordes,对于GPU也是如此。两个核心以半标称频率运行时,使用的功率仅为单个核心以标称频率运行时的40%。假设您可以通过这两个核心获得相同的性能,显然降低频率并扩展核心数量是划算的。我从未想过在内存带宽方面也有类似的优势!这真的很有趣。将核心频率降低到低于内存带宽,并增加核心数量。当然,即使不考虑内存带宽,往往很难将算法并行化。 - Z boson
    1
    @PeterCordes,这里是我讨论40%参考的地方。难怪GPU在许多情况下都能击败CPU。我的光线追踪器在我6年前的GPU架构上仍然比我尝试过的每个英特尔处理器(包括24核IVB双插槽Xeon服务器)运行得更快。 - Z boson

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接