Intel Turbo Boost 的 "spool time" 是多少?
What is the "spool time" of Intel Turbo Boost?
就像涡轮发动机由于涡轮加速需要时间而具有“涡轮迟滞”一样,我很好奇英特尔处理器中的“涡轮迟滞”是什么。
例如,我的 MacBook Pro 15" 2018(运行ning macOS Catalina 10.15.7)中的 i9-8950HK 在空闲时通常位于 1.3 GHz 左右,但是当我 运行 CPU 密集程序,CPU 频率飙升至 4.3 GHz 左右(最初)。问题是:从 1.3 到 4.3 GHz 需要多长时间?1 微秒?1 毫秒?100 毫秒?
我什至不确定这取决于硬件或操作系统。
这是在对一些 CPU 密集型代码进行基准测试的情况下,这些代码需要几十毫秒才能达到 运行。问题是,就在这段 CPU 密集型代码是 运行 之前,CPU 基本上处于空闲状态(因此时钟速度将下降到 1.3 GHz)。我想知道我的基准测试的哪一部分是 运行ning 在 1.3 GHz 和什么是 运行ning 在 4.3 GHz:1%/99%? 10%/90%? 50%/50%?或者更糟?
根据答案,我认为在启动基准测试之前 运行 一些 CPU 密集型代码是有意义的,作为“加速”TurboBoost 的一种方式。这引出了另一个问题:我应该 运行 这个“假脱机”代码多长时间?可能一秒钟就足够了,但是如果我试图将它最小化怎么办——将代码“假脱机”到 运行 的安全时间是多少,以确保 CPU 将 运行 从第一条指令开始执行的最大频率的主代码?
我在 Intel Power Gadget API 的帮助下编写了一些代码来检查这一点。它休眠一秒钟(因此 CPU 回到它的最低速度),测量时钟速度,运行s 一些代码给定的时间,然后再次测量时钟速度。
我只在我的 2018 15" MacBook Pro (i9-8950HK CPU) 运行ning macOS Catalina 10.15.7 上试过这个。具体的 CPU-intensive 代码是 运行 时钟速度测量之间也可能影响结果(它只是整数吗?FP?SSE?AVX?AVX-512?),所以不要将这些作为确切数字,而只是 order-of-magnitude/ballpark 个数字。我有不知道结果如何转化为不同的 hardware/OS/code 组合。
在我的配置中空闲时的最低时钟速度是 1.3 GHz。这是我以表格形式获得的结果。
+--------+-------------+
| T (ms) | Final clock |
| | speed (GHz) |
+--------+-------------+
| <1 | 1.3 |
| 1..3 | 2.0 |
| 4..7 | 2.5 |
| 8..10 | 2.9 |
| 10..20 | 3.0 |
| 25 | 3.0-3.1 |
| 35 | 3.3-3.5 |
| 45 | 3.5-3.7 |
| 55 | 4.0-4.2 |
| 66 | 4.6-4.7 |
+--------+-------------+
所以 1 毫秒似乎是获得任何类型变化的最短时间。 10 毫秒使 CPU 达到其标称频率,从那时起它有点慢,显然超过 50 毫秒才能达到最大涡轮频率。
Evaluation of CPU frequency transition latency 论文介绍了各种英特尔处理器的转换延迟。简而言之,延迟取决于核心当前所处的状态,以及目标状态是什么。对于经过评估的 Ivy Bridge 处理器 (i7-3770 @ 3.4 GHz),延迟从 23 (1.6 GH -> 1.7 GHz) 到 52 (2.0 GHz -> 3.4 GHz) micro-seconds.
在 Hot Chips 2020 会议上提出了未来 Ice Lake 处理器的一项重大转换延迟改进,这应该主要对使用 AVX-512 指令的部分矢量化代码产生重大影响。虽然这些指令不支持与 SSE 或 AVX-2 指令一样高的频率,但使用这些指令的孤岛会导致处理器频率下降和跟随 up-scaling。
Pre-heating 处理器显然是有意义的,还有“pre-heating”内存。先前工作负载的一秒足以达到最高可用涡轮频率,但是您还应该考虑处理器的温度,这可能 down-scale 频率(实际上 CPU 核心和非核心频率,如果说的话关于最新的英特尔处理器之一)。您无法在一秒钟内达到温度限制。但这取决于您要通过基准测量的内容,以及是否要考虑温度限制。谈到温度限制时,请注意您的处理器也有功率限制,这是 down-scaling 应用程序期间频率的另一个可能原因 运行。
另一个认为您在对代码进行基准测试时应该考虑的因素是它的 运行时间非常短。请注意 runtime/resources 消耗量测量的可靠性。我建议人为地延长 运行 时间(运行 代码 10 次并测量整体消耗)以获得更好的结果。
就像涡轮发动机由于涡轮加速需要时间而具有“涡轮迟滞”一样,我很好奇英特尔处理器中的“涡轮迟滞”是什么。
例如,我的 MacBook Pro 15" 2018(运行ning macOS Catalina 10.15.7)中的 i9-8950HK 在空闲时通常位于 1.3 GHz 左右,但是当我 运行 CPU 密集程序,CPU 频率飙升至 4.3 GHz 左右(最初)。问题是:从 1.3 到 4.3 GHz 需要多长时间?1 微秒?1 毫秒?100 毫秒?
我什至不确定这取决于硬件或操作系统。
这是在对一些 CPU 密集型代码进行基准测试的情况下,这些代码需要几十毫秒才能达到 运行。问题是,就在这段 CPU 密集型代码是 运行 之前,CPU 基本上处于空闲状态(因此时钟速度将下降到 1.3 GHz)。我想知道我的基准测试的哪一部分是 运行ning 在 1.3 GHz 和什么是 运行ning 在 4.3 GHz:1%/99%? 10%/90%? 50%/50%?或者更糟?
根据答案,我认为在启动基准测试之前 运行 一些 CPU 密集型代码是有意义的,作为“加速”TurboBoost 的一种方式。这引出了另一个问题:我应该 运行 这个“假脱机”代码多长时间?可能一秒钟就足够了,但是如果我试图将它最小化怎么办——将代码“假脱机”到 运行 的安全时间是多少,以确保 CPU 将 运行 从第一条指令开始执行的最大频率的主代码?
我在 Intel Power Gadget API 的帮助下编写了一些代码来检查这一点。它休眠一秒钟(因此 CPU 回到它的最低速度),测量时钟速度,运行s 一些代码给定的时间,然后再次测量时钟速度。
我只在我的 2018 15" MacBook Pro (i9-8950HK CPU) 运行ning macOS Catalina 10.15.7 上试过这个。具体的 CPU-intensive 代码是 运行 时钟速度测量之间也可能影响结果(它只是整数吗?FP?SSE?AVX?AVX-512?),所以不要将这些作为确切数字,而只是 order-of-magnitude/ballpark 个数字。我有不知道结果如何转化为不同的 hardware/OS/code 组合。
在我的配置中空闲时的最低时钟速度是 1.3 GHz。这是我以表格形式获得的结果。
+--------+-------------+
| T (ms) | Final clock |
| | speed (GHz) |
+--------+-------------+
| <1 | 1.3 |
| 1..3 | 2.0 |
| 4..7 | 2.5 |
| 8..10 | 2.9 |
| 10..20 | 3.0 |
| 25 | 3.0-3.1 |
| 35 | 3.3-3.5 |
| 45 | 3.5-3.7 |
| 55 | 4.0-4.2 |
| 66 | 4.6-4.7 |
+--------+-------------+
所以 1 毫秒似乎是获得任何类型变化的最短时间。 10 毫秒使 CPU 达到其标称频率,从那时起它有点慢,显然超过 50 毫秒才能达到最大涡轮频率。
Evaluation of CPU frequency transition latency 论文介绍了各种英特尔处理器的转换延迟。简而言之,延迟取决于核心当前所处的状态,以及目标状态是什么。对于经过评估的 Ivy Bridge 处理器 (i7-3770 @ 3.4 GHz),延迟从 23 (1.6 GH -> 1.7 GHz) 到 52 (2.0 GHz -> 3.4 GHz) micro-seconds.
在 Hot Chips 2020 会议上提出了未来 Ice Lake 处理器的一项重大转换延迟改进,这应该主要对使用 AVX-512 指令的部分矢量化代码产生重大影响。虽然这些指令不支持与 SSE 或 AVX-2 指令一样高的频率,但使用这些指令的孤岛会导致处理器频率下降和跟随 up-scaling。
Pre-heating 处理器显然是有意义的,还有“pre-heating”内存。先前工作负载的一秒足以达到最高可用涡轮频率,但是您还应该考虑处理器的温度,这可能 down-scale 频率(实际上 CPU 核心和非核心频率,如果说的话关于最新的英特尔处理器之一)。您无法在一秒钟内达到温度限制。但这取决于您要通过基准测量的内容,以及是否要考虑温度限制。谈到温度限制时,请注意您的处理器也有功率限制,这是 down-scaling 应用程序期间频率的另一个可能原因 运行。
另一个认为您在对代码进行基准测试时应该考虑的因素是它的 运行时间非常短。请注意 runtime/resources 消耗量测量的可靠性。我建议人为地延长 运行 时间(运行 代码 10 次并测量整体消耗)以获得更好的结果。