一覧OS-01-3 · CPUと命令実行

論理CPUと物理コア

CPU構成表と仕事の対応から、共有する実行資源と並列に使える範囲を確認します。

説明

ソケットはプロセッサのパッケージ、コアはその中の処理単位、論理CPUはOSが実行先として扱う単位です。SMTを備えるコアでは複数のハードウェアスレッドを持ち、論理CPUの数が物理コア数より多くなります。ソフトウェアのスレッド数とも別の量です。

1ソケット・2コア・各コア2スレッドという構成表を使います。シェルで対応を抽出し、二つの仕事を同じコアへ置いた場合と別コアへ置いた場合の負荷を集計します。最後にメモリ待ちの時間を他のスレッドが使う時系列を確認します。

1論理CPUと物理コアの対応

topology.csvはCPU番号・ソケット番号・コア番号・オンライン状態を記録した構成表です。online=1は実行先として利用できる状態を表します。

catファイルを表示 topology.csvCPU構成表

論理CPUは0〜3の4個ですが、コア番号は0・1の2個です。0と2、1と3がそれぞれ同じ物理コアを共有するSMT構成を例にしています。

2物理コア数を数える

コア番号はソケットごとに重複する場合があります。ソケットとコアの組を取り出して一意な組の個数を数えます。

awk -F,カンマ区切りで読む 'NR>1 {print $2 ":" $3}'ヘッダーを除きソケットとコアを出す topology.csv構成表 | sort -u重複を除く | wc -l組の数を数える

物理コアは2個です。論理CPU数4を、そのまま独立した演算器を4組持つという意味にはできません。SMTでは一つのコアの実行資源を複数のハードウェアスレッドで共有します。

3同じコアの論理CPUを抽出

ソケット0のコア0に属する論理CPUを選びます。

awk -F,CSVの各列を読む 'NR==1 || ($2==0 && $3==0)'ヘッダーと指定コアの行 topology.csv構成表

CPU0とCPU2が同じコアに属します。OSが別々の実行先として扱えても、演算器・キャッシュなどの共有によって互いの処理へ影響し得ます。共有の範囲はCPUの実装に依存します。

4仕事を論理CPUへ割り当てる

jobs.csvは仕事A・BをCPU0・2へ割り当てた表です。各仕事は演算100個とします。ここでの割当ては計算モデルの入力です。

cat割当て表を表示 jobs.csv仕事・CPU番号・演算数

二つの仕事は別の論理CPUにありますが、どちらも物理コア0です。ソフトウェアの仕事の数、実行先の論理CPU数、物理コア数を分けて把握します。

5共有するコアごとに仕事を合計

構成表からCPU番号とコアの対応を作り、仕事の演算数を物理コアごとに足します。各コアは1サイクルに合計1演算を処理する簡略モデルとします。

awk -F,二つのCSVを読む 'NR==FNR {if(FNR>1) core[$1]=$2 ":" $3; next} FNR>1 {load[core[$2]]+=$3} END {for(c in load) print c,load[c]}'CPUからコアを引き、演算数を合計 topology.csv jobs.csv構成表と割当て表 | sortコア番号順に表示

コア0へ200演算が集中します。この処理能力モデルでは少なくとも200サイクル必要です。2ハードウェアスレッドに割り当てても、共有演算器の合計能力が自動的に2倍になるわけではありません。

6別コアへ割当てを変える

BのCPU番号だけ2から1へ変更した表を作ります。元の表を残して比較します。

awk -F,CSVを編集 'BEGIN {OFS=FS} NR==1 {print; next} $1=="B" {$2=1} {print}'Bの実行先だけCPU1へ jobs.csv > jobs-separate.csv別ファイルへ出力; cat jobs-separate.csv変更後の表

AはCPU0、BはCPU1です。構成表で見ると物理コア0と1に分かれます。変更した表を次の計算へ渡し、割当てによる負荷の違いを求めます。

7コアごとの負荷を再集計

先ほどと同じ集計で、変更後のコア負荷を計算します。

awk -F,同じ集計規則 'NR==FNR {if(FNR>1) core[$1]=$2 ":" $3; next} FNR>1 {load[core[$2]]+=$3} END {for(c in load) print c,load[c]}'物理コア別の演算数 topology.csv jobs-separate.csv変更後の割当てを使う | sortコア順に表示

各コア100演算となり、両コアが同時に1演算ずつ処理できれば100サイクルです。メモリ帯域の競合や同期の時間を含めていないため、これは実機の速度測定値ではありません。

8SMTが待ち時間を利用できる場合

一方がメモリ待ちで4サイクル空いた間に、他方の仕事が同じコアで演算できる場合を表にします。列はサイクル・仕事A・仕事Bで、execは演算、waitは待ちです。

cat smt-trace.csvサイクルごとの実行記録; awk -F,記録の列を読む 'NR>1 {a+=($2=="exec"); b+=($3=="exec")} END {print "A:",a,"B:",b}'各仕事の演算サイクル数を集計 smt-trace.csv固定した時系列

仕事Aの待ちの間にBが4演算を進めています。同時に同じ演算器を二重使用する例ではなく、空いた資源の利用です。実際の効果は命令の種類、依存、キャッシュや帯域の競合に左右されます。

まとめ

論理CPU番号だけでなく、ソケットと物理コアの組を確認します。

同じコアのハードウェアスレッドは実行資源を共有し、論理CPU数だけで性能倍率を決められません。

別コアへの分散と、同じコアの待ち時間の利用は異なる並行化の仕組みです。

操作履歴と解説を振り返れます。

シェル / CPU構成表

1
cat topology.csv
cpu,socket,core,online
0,0,0,1
1,0,1,1
2,0,0,1
3,0,1,1
2
awk -F, 'NR>1 {print $2 ":" $3}' topology.csv | sort -u | wc -l
       2
3
awk -F, 'NR==1 || ($2==0 && $3==0)' topology.csv
cpu,socket,core,online
0,0,0,1
2,0,0,1
4
cat jobs.csv
job,cpu,operations
A,0,100
B,2,100
5
awk -F, 'NR==FNR {if(FNR>1) core[$1]=$2 ":" $3; next} FNR>1 {load[core[$2]]+=$3} END {for(c in load) print c,load[c]}' topology.csv jobs.csv | sort
0:0 200
6
awk -F, 'BEGIN {OFS=FS} NR==1 {print; next} $1=="B" {$2=1} {print}' jobs.csv > jobs-separate.csv; cat jobs-separate.csv
job,cpu,operations
A,0,100
B,1,100
7
awk -F, 'NR==FNR {if(FNR>1) core[$1]=$2 ":" $3; next} FNR>1 {load[core[$2]]+=$3} END {for(c in load) print c,load[c]}' topology.csv jobs-separate.csv | sort
0:0 100
0:1 100
8
cat smt-trace.csv; awk -F, 'NR>1 {a+=($2=="exec"); b+=($3=="exec")} END {print "A:",a,"B:",b}' smt-trace.csv
cycle,A,B
1,exec,-
2,wait,exec
3,wait,exec
4,wait,exec
5,wait,exec
6,exec,-
A: 2 B: 4

演習完了