为什么不同的CPU100%负载会导致CPU温度不同?

为什么不同的CPU100%负载会导致CPU温度不同?

我一直在使用 CPUz 和 OCCT 进行测试。我注意到,如果我将 CPUz 设置为使用多个线程对 CPU 施加压力,它永远不会超过 70c。另一方面,运行 OCCT 加载 CPU 时,它会立即超过 75c,有时甚至会在 85c 时停止测试。

这是怎么回事?我一直认为,虽然显卡有很多核心需要单独承受压力,但 CPU 很简单。一个基本的 for 循环就可以让 CPU 负载达到 100%。在多个线程上运行的一组 for 循环可以加载每个核心。为什么 OCCT 会让我的 CPU 发热这么多。是什么让它做到了 CPUz 做不到的?

一些背景信息:CPU 是 Intel Core i7-4790k。Turbo boost 已启用,但我认为当任一进程运行时,它只会停留在 5%

答案1

CPU 使用率是衡量 CPU 可用资源量的指标,但可以处理多种不同类型的指令,并且它们都有不同的处理和内存要求。

内存密集型任务可能会导致 CPU 在从内存中获取数据时停顿,从而降低有效操作说明吞吐量,同时 CPU 仍然处于“使用中”。

此外,CPU 的许多不同部分可能会以不同的方式饱和。

来自 Wikichips桑迪桥

在此处输入图片描述

您可以看到我们有一个初始指令解码器前端,对于复杂多样的指令流,它可能难以保持管道其余部分充满。

如果你仅有的有整数加法,那么你将能够使用 3 个核心执行单元,因为 CPU 有 3 个 INT ALU 单元。如果你只有浮点乘法,那么你可能只使用单个 FPU MUL(乘法)单元。

CPU 也像管道一样运行,当一个单元在执行单元中使用时,你可以安排一个操作在下一个周期。这意味着多样化的指令流可以更好地利用资源,因为未使用的单元可以在同一个 EU 中调度,但使用不同的指令类型。不同的指令也将具有不同的执行时间,并且具有更大或更小的相关电路集来执行。一个简单的加法可能需要一个或两个时钟周期,而一个浮点指令可能需要更长时间并涉及更大量的电路。花费更长时间可能意味着它消耗更多的电量,更大的电路面积也可能意味着消耗更多的电量。或者,指令花费更长时间可能意味着前端调度电路在等待可用的执行单元时暂停并短暂地消耗更少的电量,而如果包括 CPU 的其他部分,较小且更快的指令会使用更多的整体电路。

因此满的使用CPU时,您需要多样化的指令流,并且由于执行单元及其功能的安排和数量不同,一个CPU可以完全执行的指令可能无法完全执行另一个CPU。

执行单元可以利用现代电源门控方法实现“低功耗”,从而不会增加设备的热量输出,或者减少很多热量。

缓存也会增加功耗。使用缓存意味着可以获取指令和数据,因此,与内存中数据集太大而缓存无法容纳的程序相比,缓存的执行速度更快。

因此,不同的程序或指令流可能会导致不同的峰值功率使用量,从而导致不同的温度。

不同处理器代之间的架构差异,甚至在同一代处理器中,缓存大小、处理器选项和不同的指令可用性都可能产生影响。

答案2

我明白,您想知道为什么运行多线程紧缩测试不会像单线程测试那样使 CPU 发热。

简单的解释是 Turbo boost 是罪魁祸首,因为当 CPU 在多个核心上同样努力工作时,它被禁用。只有当一个核心使用率很高时(并且只有一个核心),它才会启用。

当 Turbo boost 处于活动状态时,它会将更多的电力分流到增强的核心,从而减少其他核心的电力,从而降低它们的速度。

然后,升压核心会以更高的速度运行,并且会比未升压核心发热更多。传感器会捕捉到这一变化,然后将该核心的温度报告为整个 CPU 的温度。

答案3

CPU“负载”(或使用率)是一种活动监视器,用于指示 CPU 时间在“有用”活动与“空闲”时间中所占的百分比。操作系统确定什么是“有用”活动,什么是“空闲”时间。

当 CPU 负载为零时,操作系统不会在该时间间隔内安排任何用户进程。
当 CPU 负载为 50% 时,操作系统已为用户进程安排了大约一半的时间间隔,而该时间间隔的另一半则用于空闲循环。即使只有一个用户进程,它也可能无法消耗 100% 的 CPU 负载,因为该进程不是 CPU 密集型的,必须在等待 I/O 操作完成等时重新安排。当
CPU 负载为 100% 时,操作系统已将所有时间间隔安排给用户进程。

请注意,CPU 实际上始终处于忙碌状态(通电时),即始终在执行指令。如果没有(用户)进程准备执行,则 OS 调度程序必须执行其空闲循环。

CPU 温度是 CPU 电路消耗的电能的结果。随着晶体管开关的增多,需要和消耗的电能也随之增加,CPU 温度也随之升高。CPU
“负载”并不表示这种功耗,它只是一个基于时间的活动监视器。
进程可以通过简单地在内存中复制或移动数据(例如加载和存储指令)来保持 CPU“忙碌”(时间方面)(这不会比空闲状态产生显著的额外电能负荷)。
而另一个计算密集型进程可以执行计算(例如乘法和除法指令),这些计算会利用 CPU 中的许多其他电路,例如 ALU(算术/逻辑单元)和 FPU(浮点单元)。

换句话说,进程执行的指令组合(即指令类型)决定了所消耗的电能以及随后的温度水平。
操作系统无法测量这种功耗,只能使用 CPU 负载和温度传感器报告基于时间的活动测量值。

答案4

我来举个例子。以两个循环为例:

for (i = 0; i < 1000000000; ++i) {
    x += a [i];
}

for (i = 0; i < 1000000000; ++i) {
    x += a [i];
    y += a [i];
    z += a [i];
}

在第一个循环中,处理器必须等待上一个加法完成才能开始下一个加法。如果加法的延迟为 3 个周期,则处理器每 3 个周期执行一次加法。CPU 负载为 100%,但 CPU 实际上并没有做那么多工作。

在第二个循环中,每三个周期也会进行一次迭代,但由于加法是独立的,因此处理器每三个周期会进行三次加法,工作量增加三倍。CPU 负载仍为 100%,但增加三倍的工作量会产生更多热量。

因此,如果代码在每个周期中使用更多的可用计算资源,那么就会产生更多的热量。

相关内容