我一直在使用 CPUz 和 OCCT 之间运行测试。我注意到,如果我将 CPUz 设置为使用多个线程对 CPU 施加压力,它永远不会超过 70c。另一方面,运行 OCCT 来加载 CPU,它会立即超过 75c,然后有时甚至会在 85c 停止测试。
这里发生了什么?我一直明白,虽然显卡有很多需要单独强调的核心,但 CPU 很简单。一个基本的 for 循环可以给 CPU 带来 100% 的负载。在多个线程上运行的一堆 for 循环可以加载每个内核。OCCT 是如何使我的 CPU 变得如此之热的。CPUz 做不到的原因是什么?
一些背景信息:CPU 是 Intel Core i7-4790k。启用了涡轮增压,但我认为当任一进程运行时它只会挂起 5%
CPU 使用率衡量 CPU 有多少可用资源,但是可以处理许多不同类型的指令,它们都有不同的处理和内存要求。
内存密集型任务可能会导致 CPU 在从内存中获取数据时停止,从而降低有效指令吞吐量,同时仍让 CPU “处于使用中”。
此外,CPU 的许多不同部分可能会以不同方式饱和。
来自 Wikichips Sandy Bridge uArch:
您可以看到我们有一个初始指令解码器前端,对于复杂多样的指令流,它可能难以保持管道的其余部分满载。
如果您只有整数加法,那么您将能够使用 3 个核心执行单元,因为 CPU 有 3 个 INT ALU 单元。如果您只有浮点乘法,那么您只能使用单个 FPU MUL(乘法)单元。
CPU 也作为流水线运行,当一个单元在执行单元中使用时,您可以在下一个周期安排一个操作. 这意味着多样化的指令流可以更好地利用资源,因为一个未使用的单元可以在同一个 EU 中调度,但具有不同的指令类型。不同的指令也将具有不同的执行时间,并具有更大或更小的相关电路集来执行。一个简单的加法可能需要一个或两个时钟周期,而浮点指令可能需要更长的时间并且涉及更多的电路。花费更长的时间可能意味着它使用更多的功率,更大的电路面积也可能意味着它使用更多的功率。或者,花费更长的指令可能意味着前端调度电路暂停并在等待可用的执行单元时短暂使用更少的功率,而如果您包括 CPU 的其他部分,则更小更快的指令使用更多的整体电路。
因此,要充分利用 CPU,您需要多样化的指令流,并且由于执行单元的排列和数量及其能力不同,可能运行一个 CPU 的内容可能无法完全运行另一个 CPU。
执行单元可以通过现代电源门控方法进入“低功耗”状态,因此不会对设备的热量输出做出贡献,或者贡献更少。
高速缓存也有助于功耗。使用缓存意味着可以获取指令和数据,因此,执行速度比内存中的数据集对于缓存来说太大的例程更快。
因此,不同的程序或指令流可能会导致不同的峰值功率使用以及不同的温度。
处理器代之间的架构差异,甚至在同一代中,缓存大小、处理器选项和不同的指令可用性可能会产生影响。
我知道您想知道为什么运行多线程紧缩测试不会像单线程测试那样使 CPU 升温。
简单的解释是 Turbo Boost 是罪魁祸首,因为当 CPU 在多个内核上同样努力工作时它被禁用。它仅在一个核心被大量使用(并且只有一个核心)时启用。
当 Turbo Boost 处于活动状态时,它会将更多的功率分流到提升的核心,从而降低其他核心的功率,从而减慢它们的速度。
然后,升压核心以更高的速度运行,并且会比非升压核心加热更多。这由传感器捕获,然后将一个内核的温度报告为整个 CPU 的温度。
CPU“负载”(或使用)是一个活动监视器,用于指示用于“有用”活动与“空闲”时间的 CPU 时间百分比。操作系统决定什么是“有用的”活动,什么是“空闲”时间。
在 CPU 负载为零的情况下,操作系统不会在该时间间隔内调度任何用户进程。
在 CPU 负载为 50% 时,操作系统已为用户进程安排了大约一半的时间间隔,而该时间间隔的另一半用于空闲循环。即使只有一个用户进程,它也可能无法消耗 100% 的 CPU 负载,因为该进程不是 CPU 密集型的,并且必须在例如等待 I/O 操作完成时重新调度。
在 100% CPU 负载下,操作系统已将所有时间间隔安排给用户进程。
请注意,CPU 实际上总是很忙(上电时),即总是在执行指令。如果没有(用户)进程准备好执行,则 OS 调度程序必须执行其空闲循环。
CPU 温度是 CPU 电路消耗的电能的结果。随着更多晶体管开关的出现,需要和消耗更多的功率,CPU 温度也会升高。
CPU“负载”不会指示此功耗,它只是一个基于时间的活动监视器。
一个进程可以通过简单地在内存中复制或移动数据(例如加载和存储指令)来保持CPU“忙碌”(时间方面)(这在空闲时并不是一个显着的额外功率负载)。
而另一个计算密集型进程可以执行计算(例如乘法和除法指令),它利用 CPU 中的许多其他电路,例如 ALU(算术/逻辑单元)和 FPU(浮点单元)。
IOW 是过程执行的指令组合(即指令的类型)决定了消耗的电能和随后的温度水平。
操作系统无法测量此功耗,并且仅使用 CPU 负载和温度传感器报告基于时间的活动测量。
另外需要注意的是,大部分热量是在 CPU 内部的位在 0 和 1 之间翻转时产生的,而不是在它们被“处理”时产生的。通过 ALU 管道推送零流将产生比推送随机比特流少得多的热量。当管道停止时,这也是我所期望的:它将被输入恒定值(不会产生有用的结果),但出于 CPU 负载估计的目的,它是 100% 忙的。
这不一定是您的情况(我认为@harrymc 确定了它),我所说的只是 CPU 负载和耗散功率是不直接相关的不同物理量。
我给你举个例子。采取两个循环:
和
在第一个循环中,处理器必须等待上一次加法完成才能开始下一次加法。如果加法的延迟为 3 个周期,则处理器每 3 个周期执行一次加法。CPU 负载为 100%,但 CPU 实际上并没有做那么多工作。
在第二个循环中,每三个周期也有一次迭代,但由于加法是独立的,因此处理器将每 3 个周期执行 3 次加法,多做 3 倍的工作。CPU 负载仍然是 100%,但是 3 倍的工作量会产生更多的热量。
因此,在每个周期中使用更多可用计算资源的代码将获得更多热量。