1

システムで呼び出しを行うCPU_SETために使用できる CPU の数に使用する正しい値について、混乱があります。sched_setaffinity

私の/proc/cpuinfoファイル:

processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 37
model name  : Intel(R) Core(TM) i5 CPU       M 460  @ 2.53GHz
stepping    : 5
microcode   : 0x2
cpu MHz     : 1199.000
cache size  : 3072 KB
physical id : 0
siblings    : 4
core id     : 0
cpu cores   : 2
apicid      : 0
initial apicid  : 0
fdiv_bug    : no
f00f_bug    : no
coma_bug    : no
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx rdtscp lm constant_tsc arch_perfmon pebs bts xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 popcnt lahf_lm ida arat dtherm tpr_shadow vnmi flexpriority ept vpid
bogomips    : 5056.34
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

processor   : 1
vendor_id   : GenuineIntel
cpu family  : 6
model       : 37
model name  : Intel(R) Core(TM) i5 CPU       M 460  @ 2.53GHz
stepping    : 5
microcode   : 0x2
cpu MHz     : 1199.000
cache size  : 3072 KB
physical id : 0
siblings    : 4
core id     : 0
cpu cores   : 2
apicid      : 1
initial apicid  : 1
fdiv_bug    : no
f00f_bug    : no
coma_bug    : no
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx rdtscp lm constant_tsc arch_perfmon pebs bts xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 popcnt lahf_lm ida arat dtherm tpr_shadow vnmi flexpriority ept vpid
bogomips    : 5056.34
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

processor   : 2
vendor_id   : GenuineIntel
cpu family  : 6
model       : 37
model name  : Intel(R) Core(TM) i5 CPU       M 460  @ 2.53GHz
stepping    : 5
microcode   : 0x2
cpu MHz     : 1199.000
cache size  : 3072 KB
physical id : 0
siblings    : 4
core id     : 2
cpu cores   : 2
apicid      : 4
initial apicid  : 4
fdiv_bug    : no
f00f_bug    : no
coma_bug    : no
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx rdtscp lm constant_tsc arch_perfmon pebs bts xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 popcnt lahf_lm ida arat dtherm tpr_shadow vnmi flexpriority ept vpid
bogomips    : 5056.34
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

processor   : 3
vendor_id   : GenuineIntel
cpu family  : 6
model       : 37
model name  : Intel(R) Core(TM) i5 CPU       M 460  @ 2.53GHz
stepping    : 5
microcode   : 0x2
cpu MHz     : 1199.000
cache size  : 3072 KB
physical id : 0
siblings    : 4
core id     : 2
cpu cores   : 2
apicid      : 5
initial apicid  : 5
fdiv_bug    : no
f00f_bug    : no
coma_bug    : no
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx rdtscp lm constant_tsc arch_perfmon pebs bts xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 popcnt lahf_lm ida arat dtherm tpr_shadow vnmi flexpriority ept vpid
bogomips    : 5056.34
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

このファイルにはprocessor、「物理」プロセッサ (合計 4 プロセッサ) 用に 0 ~ 3 の番号が付けられた行があることがわかりました。この値はから取得できますsysconf(_SC_NPROCESSORS_ONLN)が、各プロセッサには 2 の行もありcpu coresます。これは、説明されている「論理」プロセッサまたはハイパースレッディングを表していると思います。「物理」値のみを使用する必要がありますか、それとも「論理」カウントを使用できますか?

これについては明確ではありません。/proc/PID/statusその行に行くと、0 ~ Cpus_allowed_list7 (合計 8​​ プロセッサ) の範囲になる可能性がありますが、taskset -c -p PID実行中のすべての「PID」を呼び出すスクリプトも作成しました。最大 0 ~ 3 のアフィニティ リスト。

4

2 に答える 2

2

ハイパースレッディングの場合、コアごとに 2 つの論理 CPU を取得します。これは、1 つの論理 CPU が何らかの理由 (キャッシュ ミス、分岐の予測ミス、命令の依存関係など) で停止した場合、コアが他の論理 CPU からの命令を実行でき、そこで待機したり無駄になったりしないことを意味します。さらに、通常、コアは 1 つの論理 CPU が使用するよりも多くの処理を並行して実行できるため、(頻繁に発生する) ストールがなくても (コアのリソースの使用率を高めることによって) 利点が得られます。この場合; すべての論理 CPU を使用したい。

適切に作成されていないマルチスレッド ソフトウェア (スケーラビリティに重大な問題があるソフトウェア) の場合、スケーラビリティが低いためにハイパースレッディングによるメリットが失われる可能性があります。たとえば、プロセスによって「キャッシュ ライン バウンス」 (キャッシュ ラインがコア間で頻繁に「バウンス」される) が発生する可能性があり、アフィニティを使用してコアの数を減らすことができます。別の例として、コアの RAM 帯域幅がボトルネックになる可能性があり (プロセスがハイパースレッディングの恩恵を受けられなくなる)、アフィニティを使用してプロセスが各コアの両方の論理 CPU を使用しないようにすることで、パフォーマンスを向上させることができます。これらの場合には; いくつかの論理 CPU のみを使用したい場合 (ただし、どの論理 CPU かはわかりません)。

シングルスレッド プロセスの場合、何をするかは問題ではありません。

基本的に(マルチスレッドを想定); プロセスに最適な設定はプロセスによって異なります。したがって、いくつかのテストを実行して、アフィニティーがプロセスにどのように影響するかを確認する必要があります。

その他 ノート

ハイパースレッディングが最初に導入されたとき (Netburst/Pentium 4) は「理想的とは言えなかった」ものでした。また、ほとんどのオペレーティング システムのスケジューラは、ハイパー スレッディングの負荷を効率的にスケジュールするように最適化されていませんでした (これによりさらに悪化しました)。これにより、ハイパースレッディングは多くの場合に悪いと多くの人が考えるようになりました。最新の Intel CPU には、Netburst/Pentium 4 で発生したのと同じ問題はなく、最新のオペレーティング システム スケジューラにはハイパースレッディング用の最適化機能があります。これは、当時正しかった古い仮定 (「ハイパースレッディングはおそらく悪い」) がほとんど時代遅れであり、現在では間違っていることを意味します。

于 2014-03-24T02:08:40.620 に答える