當我lscpu在我的主機上運行時,它顯示
CPU(s): 8
Thread(s) per core: 2
Core(s) per socket: 4
我的主機有 4 個物理 CPU,但由于每個內核有 2 個執行緒,所以有 8 個邏輯 CPU。好的,“每個內核2個執行緒”意味著一個內核可以同時執行2個執行緒,就好像我們將CPU容量增加了一倍?所以這是平行概念?
雖然我們有另一個概念“一個行程可以有多個執行緒”,但我相信這意味著一個行程可以通過切換背景關系來同時處理多個執行緒,但不一定是并行的。在大多數情況下,一個 CPU 一次可以執行一個執行緒,對嗎?
我想確認我上面的理解是正確的。謝謝
參考并發和并行區別:并發和并行有什么區別?
uj5u.com熱心網友回復:
這個概念稱為同時多執行緒(SMT)。它在許多處理器中實作,從 x86-64(AMD 和 Intel)到 POWER。這個想法是同時執行 2 個執行緒。關于特定的目標架構,一些操作可以是并行的。
一個核心可以同時執行2個執行緒,就好像我們的CPU容量增加了一倍?
不。硬體執行緒(也稱為邏輯核心)不等同于核心(即與物理核心相反)。一些處理器單元是為硬體執行緒靜態分配的,而一些單元是為硬體執行緒動態分配的,這意味著執行緒共享可用資源。
最初的想法是在內核停止某些操作(如記憶體讀取)時執行一些有用的操作。使用 2 個硬體執行緒,如果當前執行緒正在等待記憶體,例如由于快取未命中,一個內核可以執行另一個執行緒的指令。受 RAM 延遲限制的記憶體系結并行代碼(如簡單轉置或鏈表遍歷)可以從這種機制中受益。
隨著時間的推移,SMT 的實施有了顯著改善。特別是最近在 x86-64 處理器中。如今,現代處理器的硬體執行緒可以真正并行執行計算指令。例如,得益于 4個 ALU ,英特爾 Skylake 處理器每個周期一次最多可以執行 4 條算術指令. 僅當指令是獨立的(在目標周期期間)時,1 個執行緒每個周期才能執行 4 條指令。這并不總是可能的,因為某些回圈本質上是順序的,并且每個回圈不包含足夠的獨立指令(例如,累積和)。啟用 2-way SMT 后,可以在同一內核上調度 2 個軟體執行緒,并且內核可以在給定周期內完全并行執行每個執行緒的 2 條指令。它甚至可以根據每個執行緒的實時需求對指令數量進行負載平衡(例如,每個周期 1 對 3 條指令)。最后,在像 Skylake 這樣的 2 路 SMT 處理器上,受延遲限制的代碼最多可以快 2 倍。話雖如此,它并沒有加速已經可以充分利用所有可用處理器計算單元的代碼. 例如,使用優化的 BLAS 庫的并行矩陣乘法在每個內核運行 2 個軟體執行緒時幾乎總是比每個內核僅運行 1 個軟體執行緒時要慢。執行速度可能會變慢,因為硬體執行緒共享一些資源,例如快取,并且它們可能會相互沖突,每個內核同時運行 2 個執行緒。簡而言之,高效的代碼不應該從中受益,但是人們傾向于撰寫低效的代碼,并且編譯器無法生成使核心計算單元飽和的高效代碼的情況并不少見(他們通常需要一些幫助)。
雖然我們有另一個概念“一個行程可以有多個執行緒”,但我相信這意味著一個行程可以通過切換背景關系同時處理多個執行緒,但不一定是并行的。
我想澄清一下:軟體執行緒和硬體執行緒是兩個非常不同的東西,盡管名稱不同。
軟體執行緒是可以在硬體執行緒上調度的邏輯作業系統單元。硬體執行緒可以看作是處理器內核的物理部分(實際上是一種幼稚的簡單化觀點)。軟體執行緒是作業系統行程的一部分。作業系統負責準備就緒的軟體執行緒的調度。行程沒有調度,軟體執行緒是(至少在現代作業系統上)。2 個不同行程的 2 個軟體執行緒可以在具有多個內核的處理器上并行運行(甚至在某些 2 路 SMT 內核上)。
在大多數情況下,一個 CPU 一次可以執行一個執行緒,對嗎?
術語“CPU”在這里并不清楚:它可能在背景關系中表示不同的含義。
如果“一個 CPU”是指現代微處理器芯片,現在通常是多核芯片,那么絕對不是。例如,軟體執行緒可以真正在不同的內核上并行運行。
如果“一個 CPU”是指一個內核(通常在高性能計算中),那么它取決于:1 路 SMT 內核一次只能執行 1 個執行緒,而 2 路 SMT 內核一次可以執行 2 個執行緒.
在具有 1 個內核且沒有 SMT 的舊微處理器芯片上,確實一次運行一個執行緒,并且背景關系切換用于從用戶的角度并發執行執行緒,而不是并行執行。除了一些嵌入式微處理器芯片之外,這個時間已經過去了(近 2 年以來)。
uj5u.com熱心網友回復:
這是……平行的嗎?
也許。
超執行緒是英特爾的商標*,用于具有兩套完整背景關系暫存器的處理器內核。超執行緒 CPU 可以代表兩個執行緒同時執行代碼,而無需作業系統的任何干預(即,無需背景關系切換。)
這兩個并發執行實際上是并行執行的程度因 CPU 模型而異,這取決于兩個執行緒實際在做什么。例如(我只是編造這部分,因為我需要擔心任何特定的 CPU 架構已經有幾十年了)如果某個“超執行緒”CPU 每個內核有兩個整數 ALU,那么這兩個執行緒可能都是能夠并行執行整數運算,但如果每個內核只有一個 FPU,那么他們將不得不輪流使用它。
一些超執行緒 CPU 模型具有比其他模型更多的重復執行單元,因此可以并行執行更多部分。
* AMD 將它們的類似功能稱為“2 路同時多執行緒”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/533129.html
