回答
我發現了簡單的伎倆來做我所需要的。
cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
如果第一數目等於(在本例中爲0)的CPU編號那麼它是一個真正的核心,如果不是它是一個超線程芯。
實芯例如:
# cat /sys/devices/system/cpu/cpu1/topology/thread_siblings_list
1,13
超線程芯示例
# cat /sys/devices/system/cpu/cpu13/topology/thread_siblings_list
1,13
第二示例的輸出是完全一樣的第一個。但是我們正在檢查cpu13
,第一個數字是1
,所以CPU 13這是一個超線程核心。
HT是對稱的(就基本資源而言,系統模式可能是不對稱的)。
因此,如果打開HT,物理內核的大量資源將在兩個線程之間共享。一些額外的硬件被打開以保存兩個線程的狀態。兩個線程都具有對物理內核的對稱訪問。
HT禁用內核和HT內核之間有區別;但是啓用HT的核心的第一半與啓用HT的核心的第二半沒有區別。
在單一時刻,一個HT-線程可能使用比其他更多的資源,但是這種資源平衡是動態的。如果兩個線程都想使用相同的資源,CPU就會盡可能地平衡線程。您只能在一個線程中執行rep nop
或pause
以讓CPU爲其他線程提供更多資源。
我希望找出這些信息並使用set_affinity()將進程綁定到超線程線程或非超線程線程來分析其性能。
好的,你實際上可以在不知道事實的情況下測量性能。當系統中唯一的線程綁定到CPU0時,只需執行配置文件;並在綁定到CPU1時重複。我認爲,結果幾乎是相同的(如果CPU將某些中斷綁定到CPU0,則操作系統可能會產生噪聲;因此嘗試在測試時降低中斷的數量,如果有這種情況,則嘗試使用CPU2和CPU3)。
PS
昂納(他是大師中的x86)recommends to use even-numbered cores的情況下,當你想不使用HT,但它是在BIOS中啓用:
如果檢測超線程然後鎖上進程僅使用偶數編號的邏輯處理器。這將使每個處理器內核中的兩個線程中的一個處於空閒狀態,以便不會爭用資源。
PPS關於新輪迴HT(不P4之一,但Nehalem處理器和Sandy) - 基於昂納對微體系結構的研究
需要關注的Sandy Bridge的有以下新的瓶頸: ... 5.共享線程間的資源。超線程開啓時,核心的兩個線程之間共享許多關鍵資源 。當多個線程依賴於相同的執行資源時,將 關閉爲超線程可能是明智的。
...
中途解決方案的NetBurst架構,並再次在Nehalem處理器與Sandy Bridge引入與所謂 超線程技術。超線程處理器具有共享相同執行核心的兩個邏輯處理器 。如果兩個線程 競爭相同的資源,則其優勢是有限的,但如果性能受其他因素(例如內存訪問)限制,則超線程可能非常有利。
...
Intel和AMD正在其中一些或所有的執行 單元被之間的兩個處理器核心(超線程在英特爾 術語)共享的混合解決方案。
PPPS:Intel Optimization book lists resource sharing in second-generation HT:(93頁,這份名單是Nehalem的,但這個名單的桑迪部分沒有變化)
更深的緩衝和增強資源共享/分區策略:
- - 對於HT操作複製的資源:寄存器狀態,改名返回堆棧緩衝 ,受我大頁ITLB //註釋:有2臺本HW的
- - 用於HT操作的分區資源:加載緩衝區,存儲緩衝區,重新排序緩衝區,小頁面ITLB在兩個邏輯 處理器之間靜態分配。 //由我評論:這個HW有一套;它在兩個半中靜態地分成兩個HT-虛擬核心
- -在HT操作期間的競爭性共享資源:保留站, 緩存層次結構,填充緩衝區,DTLB0和STLB。 //評論:單曲集,但分成兩半。 CPU將動態地重新分配資源。
- - HT操作期間交替:前端操作通常在兩個邏輯處理器之間交替 以確保公平。 //註釋:有單個前端(指令解碼器),所以線程將按照1,2,1,2的順序解碼。
- - HT未知資源:執行單元。 //評論:有實際的硬件設備將執行計算,內存訪問。只有一套。如果其中一個線程能夠使用大量執行單元,並且內存等待時間較少,則它將佔用所有的執行單元,而第二個線程的執行性能會很低(但HT有時會切換到第二個線程,多久? )。如果兩個線程都不進行重優化和/或有內存等待,那麼執行單元將在兩個線程之間分割。
也有圖片在頁112(圖2-13),它表明這兩個邏輯核心是對稱的。
的性能潛力由於HT技術是由於:
- •是操作系統和用戶程序可以調度進程或 線程每個物理到邏輯處理器同時執行的事實 處理器
- •使用片上執行資源的能力高於只有單線程佔用執行資源時的片上執行資源;資源 利用率更高的水平可以導致更高的系統吞吐量
儘管從兩個節目或兩個線程始發指令在程序順序中執行核心和存儲器層級, 前端同時執行 並且不一定後端包含幾個選擇點,以便在來自兩個邏輯處理器的 指令之間進行選擇。除非一個邏輯處理器不能使用管線 階段,否則所有選擇點在兩個邏輯處理器的 之間交替。在這種情況下,另一個邏輯處理器充分利用了管道 階段的每個週期。邏輯處理器爲什麼不使用流水線階段的原因包括: 緩存未命中,分支預測失誤以及指令相關性。
我試圖通過比較核心和HT核心上的負載溫度來驗證信息。
你的方法很奇怪,可能無法正常工作。試試hwloc:http://www.open-mpi.org/projects/hwloc/它有win32和win64變種 – osgx
有通用(Linux/Windows的)和便攜式硬件拓撲探測器(核心,HT,cacahes,南,北橋和磁盤/網絡連接地點) - hwloc
通過的openmpi項目。你可以使用它,因爲linux可能使用不同的HT核心編號規則,我們不知道它會是偶數/奇數還是y和y + 8定位規則。hwloc的
主頁: http://www.open-mpi.org/projects/hwloc/
下載頁面: http://www.open-mpi.org/software/hwloc/v1.10/
說明:
的便攜式硬件局部性(hwloc)軟件包提供了一個便攜的抽象(跨操作系統,版本,架構等),包括NUMA內存節點,套接字,共享緩存,內核和同步多線程等現代體系結構的分層拓撲。它還收集各種系統屬性,如緩存和內存信息以及I/O設備(如網絡接口,InfiniBand HCA或GPU)的位置。它主要旨在幫助應用程序收集有關現代計算機硬件的信息,從而相應並高效地利用它。
它lstopo
命令來獲取硬件拓撲結構以圖形形式像
ubuntu$ sudo apt-get hwloc
ubuntu$ lstopo
或文本形式:
ubuntu$ sudo apt-get hwloc-nox
ubuntu$ lstopo --of console
我們可以看到物理核心,因爲每個Core L#x
具有兩個邏輯核心PU L#y
和PU L#y+8
。
Machine (16GB)
Socket L#0 + L3 L#0 (4096KB)
L2 L#0 (1024KB) + L1 L#0 (16KB) + Core L#0
PU L#0 (P#0)
PU L#1 (P#8)
L2 L#1 (1024KB) + L1 L#1 (16KB) + Core L#1
PU L#2 (P#4)
PU L#3 (P#12)
Socket L#1 + L3 L#1 (4096KB)
L2 L#2 (1024KB) + L1 L#2 (16KB) + Core L#2
PU L#4 (P#1)
PU L#5 (P#9)
L2 L#3 (1024KB) + L1 L#3 (16KB) + Core L#3
PU L#6 (P#5)
PU L#7 (P#13)
Socket L#2 + L3 L#2 (4096KB)
L2 L#4 (1024KB) + L1 L#4 (16KB) + Core L#4
PU L#8 (P#2)
PU L#9 (P#10)
L2 L#5 (1024KB) + L1 L#5 (16KB) + Core L#5
PU L#10 (P#6)
PU L#11 (P#14)
Socket L#3 + L3 L#3 (4096KB)
L2 L#6 (1024KB) + L1 L#6 (16KB) + Core L#6
PU L#12 (P#3)
PU L#13 (P#11)
L2 L#7 (1024KB) + L1 L#7 (16KB) + Core L#7
PU L#14 (P#7)
PU L#15 (P#15)
我很驚訝沒有人提到過lscpu
呢。以下是一個啓用了四個物理內核和超線程的單路系統示例:
$ lscpu -p
# The following is the parsable format, which can be fed to other
# programs. Each different item in every column has an unique ID
# starting from zero.
# CPU,Core,Socket,Node,,L1d,L1i,L2,L3
0,0,0,0,,0,0,0,0
1,1,0,0,,1,1,1,0
2,2,0,0,,2,2,2,0
3,3,0,0,,3,3,3,0
4,0,0,0,,0,0,0,0
5,1,0,0,,1,1,1,0
6,2,0,0,,2,2,2,0
7,3,0,0,,3,3,3,0
輸出說明了如何解釋ID表;具有相同核心ID的邏輯CPU ID是兄弟。
但是哪個兄弟是HT核心? –
他們是同齡人,沒有一個主要核心和二級「超線程」核心。 –
- 1. 發現使用線程的CPU核心數量
- 2. .net核心使用ubuntu linux流水線
- 3. 多線程 - 線程每個核心
- 4. linux - 內核線程搶佔
- 5. Linux內核線程問題
- 6. perl線程核心轉儲
- 7. cpu核心與線程
- 8. 多線程和多核心
- 9. 多線程核心數據
- 10. 超線程CPU +調度程序上的硬件線程(邏輯核心)
- 11. OpenMP:不使用超線程核心(half`num_threads()`w/hyperthreading)
- 12. linux內核如何決定下一個線程ID
- 13. Openmp。如何檢索線程正在運行的核心ID
- 14. Linux內核線程 - 調度程序
- 15. 核心數據和多線程編程
- 16. 多線程程序的核心轉儲
- 17. Linux內核驅動程序:IRQ觸發或超時
- 18. 誤差Asp.NET核心Linux上
- 19. 設置核心速度-linux
- 20. Linux核心轉儲過大!
- 21. 核心藍牙無法發現外設
- 22. 無法發現核心藍牙外設
- 23. 會話超時核心Php
- 24. Asp Net核心超時
- 25. 核心PLT下載超時
- 26. 如何在多線程環境中實現核心數據
- 27. Linux內核實現
- 28. Linux中的內核線程退出
- 29. linux內核的list.h線程安全嗎?
- 30. 核心數據 - 價值ID
通常,所有內核都是超線程的,或者沒有內核。或者我錯了這個假設? – knittl
是的,如果啓用HT,每個物理內核將有2個線程(1個物理+ 1個HT)。在軟件中,兩個線程的處理方式都是相同的,但它們將具有不同的處理器ID(在Linux中)。我想知道哪個id屬於物理線程,哪些屬於HT線程。 – Patrick
你的CPU是什麼? P4或Core2或Corei7或Atom? – osgx