performance - 为什么我的超便携笔记本电脑 CPU 不能在 HPC 中保持最佳性能

标签 performance x86 intel hpc cpu-speed

我开发了一个 高性能 Cholesky 分解例程,它在单个 CPU(没有超线程)上的峰值性能应该在 10.5 GFLOPs 左右。但是在我测试它的性能时,有一些我不明白的现象。在我的实验中,我测量了矩阵维数 N 增加时的性能,从 250 到 10000。

  • 在我的算法中,我应用了缓存(调整了阻塞因子),并且在计算过程中总是以单位步幅访问数据,因此缓存性能是最佳的;消除了TLB和分页问题;
  • 我有 8GB 的​​可用内存,并且在实验过程中最大内存占用低于 800MB,所以没有出现交换;
  • 在实验过程中,没有像浏览器这样的资源需求进程同时运行。只有一些非常便宜的后台进程正在运行,以每 2 秒记录一次 CPU 频率以及 CPU 温度数据。

  • 对于我正在测试的任何 N,我希望性能(在 GFLOP 中)应该保持在 10.5 左右。但是在实验中间观察到显着的性能下降,如第一张图所示。

    CPU 频率和 CPU 温度见第 2 和第 3 图中。实验在 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之间,冷却时间为5s;
  • N在2750~5000之间,冷却时间为20s;
  • N在5250~7500之间,冷却时间为40s;
  • 最后对于7750到10000之间的N,冷却时间为60s。

  • 请注意,冷却时间远大于计算所花费的时间。对于 N = 10000,Cholesky 分解在峰值性能时只需要 30 秒,但我要求 60 秒的冷却时间。

    这当然是很无趣高性能计算中的设置:我们希望我们的机器一直以最佳性能工作,直到完成一个非常大的任务。所以这种停顿是没有意义的。但它有助于更​​好地了解温度对性能的影响。

    这一次,我们看到所有 N 都达到了峰值性能,正如理论所支持的那样! CPU频率和温度的周期性特征是冷却和提升的结果。温度还是有上升的趋势,因为随着N的增加,工作量越来越大。正如我所做的那样,这也证明需要更多的冷却时间来充分冷却。

    达到峰值性能似乎排除了温度以外的所有影响。 但这真的很烦人。基本上它说计算机会在 HPC 中感到疲倦,因此我们无法获得预期的性能提升。那么开发HPC算法的意义何在?

    好的,这是一组新的图:
    enter image description here
    enter image description here

    我不知道为什么我无法上传第 6 个数字。所以在添加第 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
    

    由于我没有将计算固定到 1 个核心,因此操作系统将交替使用两个不同的核心。采取更有意义
    freq[i] <- max (freq0[i], freq1[i])
    temp[i] <- max (temp0[i], temp1[i])
    

    作为整体测量。

    最佳答案

    电话:DR : 你的结论是正确的。您的 CPU 的持续性能远未达到峰值。这是正常的:考虑到轻量级散热器、风扇和供电,峰值性能仅可作为突发交互式工作负载的短期“奖励”,高于其额定持续性能。
    你可以在这台机器上开发/测试,但基准测试会很困难。您需要在集群、服务器或台式机上运行,​​或者至少是在游戏/工作站笔记本电脑上运行。

    从您发布的 CPU 信息来看,您有一个 dual-core-with-hyperthreading Intel Core M with a rated sustainable frequency of 1.20 GHz ,布罗德威尔一代。它的最大睿频为 2.9GHz,它的 TDP-up 可持续频率为 1.4GHz(6W)。
    对于短时间爆发,它可以运行得更快,并产生比其冷却系统处理所需的热量更多的热量 .这是什么Intel's "turbo" feature都是关于。它让像您这样的低功耗超便携笔记本电脑在 Web 浏览器之类的东西中拥有快速的 UI 性能,因为来自交互的 CPU 负载几乎总是突发的。
    台式机/服务器 CPU(至强和 i5/i7,但不是 i3)仍然具有涡轮增压,但持续频率更接近最大涡轮增压。例如Haswell i7-4790k具有 4.0GHz 的持续“额定”频率。在该频率及以下频率下,它的消耗(并转化为热量)不会超过其 88W 的额定 TDP。因此,它需要一个可以处理 88W 的冷却系统。在功率/电流/温度允许的情况下,它的时钟频率最高可达 4.4GHz,并使用超过 88W 的功率。 (计算功率历史以保持 88W 持续功率的滑动窗口有时可在 BIOS 中配置,例如 20 秒或 5 秒。根据运行的代码,4.4GHz 可能不会将电流需求增加到接近峰值的任何位置。例如有很多分支错误预测的代码仍然受到 CPU 频率的限制,但这不会像 Prime95 那样使 256b AVX FP 单元饱和。)
    笔记本电脑的最大涡轮比额定频率高 2.4 倍。那个高端 Haswell 台式机 CPU 的频率只能提高 1.1 倍。最大持续频率已经非常接近最大峰值限制,因为它被认为需要一个能够跟上这种热量产生的良好冷却系统。还有一个可以提供那么多电流的固态电源。
    Core M 的目的是拥有一个可以将自身限制在超低功耗水平的 CPU (1.2GHz 时的额定 TDP 为 4.5 W,1.4GHz 时为 6W)。因此,笔记本电脑制造商可以安全地设计一个小巧轻便的冷却和电力传输系统,并且只能处理那么多的电力。 “场景设计功率”只有 3.5W,这应该代表实际代码的热要求,而不是像 Prime95 这样的最大功率的东西。
    即使是“普通”超低电压笔记本电脑 CPU 的额定持续功率也为 15W,而高功率游戏/工作站笔记本电脑 CPU 的额定功率为 45W。当然,笔记本电脑供应商将这些 CPU 放入配备更强大散热器和风扇的机器中。见 table on wikipedia ,并比较台式机/服务器 CPU(也在同一页面上)。

    The achievement of peak performance seems to rule out all effects other than temperature. But this is really annoying. Basically it says that computer will get tired in HPC, so we can't get expected performance gain. Then what is the point of developing HPC algorithm?


    关键是要在热限制不太严重的硬件上运行它们!像 Core M 这样的超低功耗 CPU 是一个不错的开发平台,但不是一个好的 HPC 计算平台。
    即使是带有 xxxxM CPU 而不是 xxxxU CPU 的笔记本电脑也可以。 (例如,旨在持续运行 CPU 密集型内容的“游戏”或“工作站”笔记本电脑)。或者在 Skylake 系列中,“xxxxH”或“HK”是 45W 移动 CPU,至少是四核。

    进一步阅读:
  • Modern Microprocessors A 90-Minute Guide!
  • [现代处理器中的供电] - 一般背景,包括奔腾 4 遇到的“电源墙”。
    ( https://www.realworldtech.com/power-delivery/ ) - 真正深入的技术深入研究 CPU/主板设计以及为非常突发的需求提供稳定的低电压的挑战,以及在 CPU 改变频率时对请求更多/更少电压的快速 react 的挑战。
  • 关于performance - 为什么我的超便携笔记本电脑 CPU 不能在 HPC 中保持最佳性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36363613/

    相关文章:

    r - 在 C++ 函数中,如何将 Rcpp 对象传递给其他函数(通过引用或复制)?

    c - 确定函数参数起始地址

    linux - ld:对 'eax' 的 undefined reference

    assembly - 操作 `mov [esp - 4], eax` 添加额外的字节

    x86 - _mm256_testz_pd 不工作?

    javascript - 命名空间的差异

    performance - GWT Grid - 如何测量客户端的渲染时间

    c - 堆栈何时增长?操作系统如何知道何时增长堆栈?

    c++ - STLPort、英特尔编译器、构建错误(尽管应用运行良好!)

    java - 多次执行 if(false) 不好吗?