私は今朝、どのプロセッサIDがハイパースレッドコアであるかを判断する方法を見つけようとして過ごしましたが、運がありませんでした。
set_affinity()
この情報を見つけて、プロセスをハイパースレッドスレッドまたは非ハイパースレッドスレッドにバインドして、そのパフォーマンスのプロファイルを作成するために使用したいと思います。
私は今朝、どのプロセッサIDがハイパースレッドコアであるかを判断する方法を見つけようとして過ごしましたが、運がありませんでした。
set_affinity()
この情報を見つけて、プロセスをハイパースレッドスレッドまたは非ハイパースレッドスレッドにバインドして、そのパフォーマンスのプロファイルを作成するために使用したいと思います。
私は必要なことをするための単純なトリックを発見しました。
cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
最初の数値がCPU番号(この例では0)と等しい場合、それは実際のコアですが、そうでない場合はハイパースレッディングコアです。
実際のコアの例:
# cat /sys/devices/system/cpu/cpu1/topology/thread_siblings_list
1,13
ハイパースレッディングコアの例
# cat /sys/devices/system/cpu/cpu13/topology/thread_siblings_list
1,13
2番目の例の出力は、最初の例とまったく同じです。ただし、チェックcpu13
しており、最初の数値は1
であるため、CPU13はハイパースレッディングコアです。
lscpu
まだ誰も言及していないことに驚いています。これは、4つの物理コアとハイパースレッディングが有効になっているシングルソケットシステムの例です。
$ 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を持つ論理CPUIDは兄弟です。
HTは対称的です(基本的なリソースに関しては、システムモードは非対称的である可能性があります)。
したがって、HTがオンになっている場合、物理コアの大規模なリソースが2つのスレッド間で共有されます。両方のスレッドの状態を保存するために、いくつかの追加のハードウェアがオンになっています。両方のスレッドは、物理コアに対称的にアクセスできます。
HTが無効なコアとHTが有効なコアには違いがあります。ただし、HT対応コアの前半とHT対応コアの後半に違いはありません。
ある時点で、1つのHTスレッドが他のスレッドよりも多くのリソースを使用する場合がありますが、このリソースバランシングは動的です。CPUは、両方のスレッドが同じリソースを使用する場合に、可能な限りスレッドのバランスを取ります。rep nop
CPUが他のスレッドにより多くのリソースを提供できるようにするには、またはpause
1つのスレッドでのみ実行できます。
この情報を確認し、set_affinity()を使用してプロセスをハイパースレッドスレッドまたは非ハイパースレッドスレッドにバインドし、パフォーマンスのプロファイルを作成したいと思います。
さて、あなたは実際に事実を知らなくてもパフォーマンスを測定することができます。システム内の唯一のスレッドがCPU0にバインドされているときに、プロファイルを実行するだけです。CPU1にバインドされたらそれを繰り返します。結果はほぼ同じだと思います(OSがCPU0にいくつかの割り込みをバインドするとノイズが発生する可能性があるため、テストを行うときは割り込みの数を減らし、CPU2とCPU3がある場合は使用してみてください)。
PS
Agner(彼はx86の第一人者です)は、HTを使用したくない場合に偶数のコアを使用することを推奨していますが、BIOSでは有効になっています。
ハイパースレッディングが検出された場合は、プロセスをロックして、偶数の論理プロセッサのみを使用します。これにより、各プロセッサコアの2つのスレッドの1つがアイドル状態になり、リソースの競合が発生しなくなります。
新しい生まれ変わりHTについてのPPS(P4ではなく、NehalemとSandy)-マイクロアーキテクチャに関するAgnerの調査に基づく
SandyBridgeで注意が必要な新しいボトルネックは次のとおりです。...5.スレッド間でのリソースの共有。重要なリソースの多くは、ハイパースレッディングがオンのときにコアの2つのスレッド間で共有されます。複数のスレッドが同じ実行リソースに依存している場合は、ハイパースレッディングをオフにすることをお勧めします。
..。
中途半端なソリューションがNetBurstに導入され、Nehalem andSandyBridgeにもいわゆるハイパースレッディングテクノロジーが導入されました。ハイパースレッディングプロセッサには、同じ実行コアを共有する2つの論理プロセッサがあります。2つのスレッドが同じリソースをめぐって競合する場合、これの利点は制限されますが、パフォーマンスがメモリアクセスなどの他の何かによって制限される場合、ハイパースレッディングは非常に有利になる可能性があります。
..。
IntelとAMDはどちらも、実行ユニットの一部またはすべてが2つのプロセッサコア間で共有されるハイブリッドソリューションを作成しています(Intelの用語ではハイパースレッディング)。
PPPS:Intel Optimizationの本には、第2世代HTでのリソース共有がリストされています:(93ページ、このリストはnehalem用ですが、Sandyセクションではこのリストに変更はありません)
より深いバッファリングと強化されたリソース共有/パーティションポリシー:
112ページ(図2-13)にも写真があり、両方の論理コアが対称であることを示しています。
HTテクノロジーによる潜在的なパフォーマンスは、次の理由によるものです。
2つのプログラムまたは2つのスレッドから発生する命令は同時に実行され、実行コアとメモリ階層では必ずしもプログラムの順序で実行されるとは限りませんが、フロントエンドとバックエンドには、2つの論理プロセッサからの命令を選択するためのいくつかの選択ポイントが含まれています。1つの論理プロセッサがパイプラインステージを使用できない場合を除き、すべての選択ポイントは2つの論理プロセッサ間で交互になります。この場合、他の論理プロセッサはパイプラインステージのすべてのサイクルを完全に使用します。論理プロセッサがパイプラインステージを使用しない理由には、キャッシュミス、ブランチの予測ミス、および命令の依存関係が含まれます。
OpenMPIプロジェクトによるユニバーサル(Linux / Windows)およびポータブルHWトポロジ検出器(コア、HT、cacahes、サウスブリッジ、ディスク/ネット接続の局所性)hwloc
があります。Linuxは異なるHTコア番号付け規則を使用する可能性があり、それが偶数/奇数またはyとy + 8のナベリング規則であるかどうかはわかりませんので、これを使用できます。
hwlocのホームページ: http ://www.open-mpi.org/projects/hwloc/
ダウンロードページ: http ://www.open-mpi.org/software/hwloc/v1.10/
説明:
Portable Hardware Locality(hwloc)ソフトウェアパッケージは、NUMAメモリノード、ソケット、共有キャッシュ、コア、同時マルチスレッディングなど、最新のアーキテクチャの階層トポロジのポータブルな抽象化(OS、バージョン、アーキテクチャなど)を提供します。また、キャッシュやメモリ情報などのさまざまなシステム属性や、ネットワークインターフェイス、InfiniBand HCA、GPUなどのI/Oデバイスのローカリティも収集します。これは主に、アプリケーションが最新のコンピューティングハードウェアに関する情報を収集し、それに応じて効率的に活用できるようにすることを目的としています。
lstopo
次のようなグラフィック形式でhwトポロジを取得するコマンドがあります
ubuntu$ sudo apt-get hwloc
ubuntu$ lstopo
またはテキスト形式:
ubuntu$ sudo apt-get hwloc-nox
ubuntu$ lstopo --of console
物理コアは、Core L#x
それぞれが2つの論理コア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)
bashでCPUコアのハイパースレッディング兄弟を取得する簡単な方法:
cat $(find /sys/devices/system/cpu -regex ".*cpu[0-9]+/topology/thread_siblings_list") | sort -n | uniq
lscpu -e
関連するコアとCPUの情報を提供するものもあります:
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ
0 0 0 0 0:0:0:0 yes 4100.0000 400.0000
1 0 0 1 1:1:1:0 yes 4100.0000 400.0000
2 0 0 2 2:2:2:0 yes 4100.0000 400.0000
3 0 0 3 3:3:3:0 yes 4100.0000 400.0000
4 0 0 0 0:0:0:0 yes 4100.0000 400.0000
5 0 0 1 1:1:1:0 yes 4100.0000 400.0000
6 0 0 2 2:2:2:0 yes 4100.0000 400.0000
7 0 0 3 3:3:3:0 yes 4100.0000 400.0000
コアの温度とHTコアの負荷を比較して情報を確認してみました。