
我一直在使用 CPUz 和 OCCT 之間運行測試。我注意到,如果我將 CPUz 設定為使用多個執行緒對 CPU 施加壓力,它永遠不會超過 70c。另一方面,執行 OCCT 載入到 CPU 上,它會立即飆升到 75c 以上,有時甚至會在 85c 時停止測試。
這裡發生了什麼事?我一直明白,雖然顯示卡有很多需要單獨處理的核心,但 CPU 很簡單。一個基本的 for 迴圈可以為 CPU 帶來 100% 的負載。在多個執行緒上執行的一堆 for 迴圈可以載入每個核心。 OCCT 為何讓我的 CPU 溫度升高這麼多?是什麼讓它做到了 CPUz 做不到的事?
一些背景資訊:CPU 是 Intel Core i7-4790k。渦輪增壓已啟用,但我認為當任一進程運行時它只會停留在 5%
答案1
CPU 使用率衡量 CPU 有多少可用資源,但可以處理的指令有許多不同類型,而且它們都有不同的處理和記憶體需求。
記憶體密集型任務可能會導致 CPU 在從記憶體中獲取資料時停止運行,從而降低有效效率操作說明吞吐量,同時仍有 CPU「正在使用」。
此外,CPU 的許多不同部分可能會以不同的方式飽和。
來自維基晶片桑迪橋 uArch:
您可以看到我們有一個初始指令解碼器前端,對於複雜且多樣化的指令流,它可能很難保持管道的其餘部分充滿。
如果你僅有的如果有整數加法,那麼您將能夠使用 3 個核心執行單元,因為 CPU 有 3 個 INT ALU 單元。如果您只有浮點乘法,那麼您只能使用單一 FPU MUL(乘法)單元。
CPU 也作為管道運行,當一個單元在執行單元中使用時,您可以安排一項操作在下一個週期。這意味著多樣化的指令流可以更好地利用資源,因為可以在同一 EU 中調度未使用的單元,但具有不同的指令類型。不同的指令還將具有不同的執行時間,並且具有更大或更小的一組要執行的關聯電路。簡單的加法可能需要一兩個時脈週期,而浮點指令可能需要更長的時間並且涉及更多的電路。花費更長的時間可能意味著它會消耗更多的電量,電路面積也可能更大。或者,耗時較長的指令可能意味著前端調度電路會暫停,並在等待可用執行單元時短暫使用較少的功率,而如果包含CPU 的其他部分,則較小的較快指令會使用更多的整體電路。
結果使滿的使用 CPU 時,您需要不同的指令流,並且由於執行單元的排列和數量及其功能的不同,可以使用一個 CPU 的指令可能無法完全使用另一個 CPU。
執行單元可以透過現代功率門控方法實現“低功耗”,因此不會對設備的熱量輸出產生影響,或貢獻少得多。
高速緩存也會增加功耗。使用高速緩存意味著可以獲取指令和數據,因此,與記憶體中數據集對於高速緩存來說太大的例程相比,執行速度更快。
因此,不同的程式或指令流可能會導致不同的峰值功率使用以及不同的溫度。
不同代處理器之間的架構差異,甚至在同一代中,快取大小、處理器選項和不同的指令可用性也可能會產生影響。
答案2
我理解您想知道為什麼運行多執行緒緊縮測試不會像單執行緒測試那樣使 CPU 升溫。
簡單的解釋是睿頻加速是罪魁禍首,因為當 CPU 在多個核心上同樣努力工作時,睿頻加速會被禁用。僅當一個核心被大量使用(並且只有一個核心)時才啟用。
當睿頻加速處於活動狀態時,它會將更多功率分流至增強核心,從而減少其他核心的功率,從而減慢它們的速度。
然後,升壓核心會以更高的速度運行,並且會比非升壓核心發熱更多。感測器捕獲此數據,然後將一個核心的溫度報告為整個 CPU 的溫度。
答案3
CPU「負載」(或使用情況)是活動監視器,用於指示「有用」活動與「空閒」時間所花費的 CPU 時間百分比。作業系統決定什麼是「有用」活動以及什麼是「空閒」時間。
當 CPU 負載為零時,作業系統在該時間間隔內不會調度任何使用者程序。
當 CPU 負載為 50% 時,作業系統為使用者程序安排了大約一半的時間間隔,而另一半的時間間隔則花費在空閒循環中。即使只有一個使用者進程,它也可能無法消耗 100% 的 CPU 負載,因為該進程不是 CPU 密集型的,並且必須在等待 I/O 操作完成等過程中重新調度。
在 100% CPU 負載時,作業系統已將所有時間間隔安排給使用者進程。
請注意,CPU 實際上始終處於忙碌狀態(上電時),即始終在執行指令。如果沒有(使用者)程序準備好執行,則作業系統調度程序必須執行其空閒循環。
CPU 溫度是 CPU 電路消耗的電力的結果。隨著電晶體開關次數的增加,需要並消耗更多的功率,CPU 溫度也會升高。
此功耗並非由 CPU「負載」指示,它只是一個基於時間的活動監視器。
進程可以透過簡單地在記憶體中複製或移動資料(例如載入和儲存指令)來保持CPU「忙碌」(時間方面)(這不是比空閒狀態顯著增加的額外功率負載)。
而另一個運算密集型程序可以執行利用 CPU 中許多其他電路(例如 ALU(算術/邏輯單元)和 FPU(浮點單元))的計算(例如乘法和除法指令)。
IOW,進程執行的指令混合(即指令的類型)決定了消耗的電力和隨後的溫度水平。
作業系統無法測量此功耗,並且僅使用 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 實際上並沒有做那麼多工作。
在第二個循環中,每三個週期也有一次迭代,但由於加法是獨立的,因此處理器將每 3 個週期執行 3 次加法,多做 3 倍的工作。 CPU負載仍是100%,但多工作3倍就會產生更多的熱。
因此,在每個週期中使用更多可用運算資源的程式碼將會獲得更多熱量。