90033


# 背景

[［試して理解］Linuxのしくみ](https://gihyo.jp/book/2018/978-4-7741-9607-7)の4章「プロセススケジューリング」を読んでいます。

# 質問

P68では、複数の論理CPUで`sched`を実行する際、`taskset`コマンドで以下のように指定しています。

[code]

    $ taskset -c 0,4 ./sched {process_num} 100 1
    
[/code]

`taskset -c 0,1`ではなく`taskset -c 0,4`である理由を、次のように説明していました。

>
> なぜCPU0とCPU1ではなく、CPU0とCPU4なのかというと、簡単に言えば、この2つの論理CPUは6章において述べるキャッシュメモリを共有していないなどの理由によって、独立性が高いため、schedプログラムの性能測定に適しているからです。皆さんがこのプログラムを試す際は、論理CPU0と、番号が「論理CPU数/2」であるものを選べば、おおむねうまくいきます。

著者のマシンでは、8個の論理CPUが認識されています。

CPU0とCPU1がキャッシュメモリを共有していること、CPU0とCPU4がキャッシュメモリを共有していないことは、どのように確認できるのでしょうか？  
参考になるサイトなどあれば、教えていただきたいです。

論理CPUの性質？はどれも同じだと思っていたので、「このペアは独立性が低い/高い」という事実に、驚きました。

# 補足:私の端末環境

### lscpu

[code]

    $ lscpu
    アーキテクチャ:                      x86_64
    CPU 操作モード:                      32-bit, 64-bit
    バイト順序:                          Little Endian
    Address sizes:                       36 bits physical, 48 bits virtual
    CPU:                                 4
    オンラインになっている CPU のリスト: 0-3
    コアあたりのスレッド数:              2
    ソケットあたりのコア数:              2
    ソケット数:                          1
    NUMA ノード数:                       1
    ベンダー ID:                         GenuineIntel
    CPU ファミリー:                      6
    モデル:                              42
    モデル名:                            Intel(R) Core(TM) i7-2640M CPU @ 2.80GHz
    ステッピング:                        7
    CPU MHz:                             899.454
    CPU 最大 MHz:                        3500.0000
    CPU 最小 MHz:                        800.0000
    BogoMIPS:                            5582.03
    仮想化:                              VT-x
    L1d キャッシュ:                      64 KiB
    L1i キャッシュ:                      64 KiB
    L2 キャッシュ:                       512 KiB
    L3 キャッシュ:                       4 MiB
    NUMA ノード 0 CPU:                   0-3
    Vulnerability Itlb multihit:         KVM: Vulnerable
    Vulnerability L1tf:                  Mitigation; PTE Inversion
    Vulnerability Mds:                   Mitigation; Clear CPU buffers; SMT vulnerable
    Vulnerability Meltdown:              Mitigation; PTI
    Vulnerability Mmio stale data:       Not affected
    Vulnerability Spec store bypass:     Mitigation; Speculative Store Bypass disabled via prctl and seccomp
    Vulnerability Spectre v1:            Mitigation; usercopy/swapgs barriers and __user pointer sanitization
    Vulnerability Spectre v2:            Mitigation; Retpolines, IBPB conditional, IBRS_FW, STIBP conditional, RSB filling
    Vulnerability Srbds:                 Not affected
    Vulnerability Tsx async abort:       Not affected
    フラグ:                              fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ht tm pbe syscall nx rdtscp lm constant_tsc arch
                                         _perfmon pebs bts nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x
                                         2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm epb pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid xsaveopt dtherm ida arat pln pts m
                                         d_clear flush_l1d
    
    
[/code]

### ハイパースレッドが有効であることの確認

[code]

    $ sudo dmidecode -t processor | grep -E '(Core Count|Thread Count)'
        Core Count: 2
        Thread Count: 4
    
[/code]

### cpuinfo

[code]

    $ cat /proc/cpuinfo 
    processor   : 0
    vendor_id   : GenuineIntel
    cpu family  : 6
    model       : 42
    model name  : Intel(R) Core(TM) i7-2640M CPU @ 2.80GHz
    stepping    : 7
    microcode   : 0x2f
    cpu MHz     : 858.809
    cache size  : 4096 KB
    physical id : 0
    siblings    : 4
    core id     : 0
    cpu cores   : 2
    apicid      : 0
    initial apicid  : 0
    fpu     : yes
    fpu_exception   : yes
    cpuid level : 13
    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 ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm epb pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid xsaveopt dtherm ida arat pln pts md_clear flush_l1d
    bugs        : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit
    bogomips    : 5582.03
    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       : 42
    model name  : Intel(R) Core(TM) i7-2640M CPU @ 2.80GHz
    stepping    : 7
    microcode   : 0x2f
    cpu MHz     : 821.302
    cache size  : 4096 KB
    physical id : 0
    siblings    : 4
    core id     : 0
    cpu cores   : 2
    apicid      : 1
    initial apicid  : 1
    fpu     : yes
    fpu_exception   : yes
    cpuid level : 13
    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 ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm epb pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid xsaveopt dtherm ida arat pln pts md_clear flush_l1d
    bugs        : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit
    bogomips    : 5582.03
    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       : 42
    model name  : Intel(R) Core(TM) i7-2640M CPU @ 2.80GHz
    stepping    : 7
    microcode   : 0x2f
    cpu MHz     : 845.573
    cache size  : 4096 KB
    physical id : 0
    siblings    : 4
    core id     : 1
    cpu cores   : 2
    apicid      : 2
    initial apicid  : 2
    fpu     : yes
    fpu_exception   : yes
    cpuid level : 13
    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 ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm epb pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid xsaveopt dtherm ida arat pln pts md_clear flush_l1d
    bugs        : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit
    bogomips    : 5582.03
    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       : 42
    model name  : Intel(R) Core(TM) i7-2640M CPU @ 2.80GHz
    stepping    : 7
    microcode   : 0x2f
    cpu MHz     : 826.173
    cache size  : 4096 KB
    physical id : 0
    siblings    : 4
    core id     : 1
    cpu cores   : 2
    apicid      : 3
    initial apicid  : 3
    fpu     : yes
    fpu_exception   : yes
    cpuid level : 13
    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 ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm epb pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid xsaveopt dtherm ida arat pln pts md_clear flush_l1d
    bugs        : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit
    bogomips    : 5582.03
    clflush size    : 64
    cache_alignment : 64
    address sizes   : 36 bits physical, 48 bits virtual
    power management:
    
[/code]


CC BY-SA 4.0
2022-07-16T23:34:03.507
90028
2022-07-17T23:30:02.800
2022-07-17T23:30:02.800
4236
19524
question
linux cpu
複数の論理CPU間で、キャッシュメモリが共有されている/共有されていないという情報は、どのようにして確認できますか？


一言で言ってしまえば論理CPUとの性質をすべて同じにしなければならないという規則も原理もないのでCPUメーカーがCPUの性能を高めるために色々と工夫をしているからですね。キャッシュメモリの共有情報の取得については私は知らないのでそっちがメインの質問であればここで読み終えてください。キャッシュメモリ以外にも論理CPU0には機能Aがあるが論理CPU5にはないなんてこともありますね。

ほかの人も言及しているようにintel製CPUかつHTT搭載CPUを前提にした説明かと思います。  
HTTはSMTの一種でCPUがOSに対しCPUのコアを二つ以上に見せる手法です。この場合論理CPUと物理CPUが2:1で紐づくので論理CPU0と1論理、論理CPU2と論理CPU3といった具合にキャッシュを共有することになります。まあキャッシュ以外にもいろいろ共有しているのですがそこは枝葉のため省略します。  
問題の書籍の出版時点ではパソコン向けCPUにはHTT搭載で1物理コアが2論理コアに見えるものとHTT非搭載で1物理コアが1論理コアに見えるものの二種類のみでした。したがって書籍に記載された方法で別の物理コアに対しもろもろアサインできることになります。  
まあ細かいこと言いだすと当時も独立性以外にCPUのコアごとに最高動作周波数が違うなどありましたが。またサーバのことを言い出せば複数ソケット対応のサーバなんて珍しくないのでメモリ空間も物理的に切り離されてたりしますけども。  
おまけに現代的なCPUはコアをヘテロジニアス化してしまったのでパソコンでもコアによって処理速度が全然違ったりしますね。(EコアPコアとかbig.LITTLEとか)


CC BY-SA 4.0
2022-07-17T03:26:05.010
90032
2022-07-17T03:26:05.010
53286
90028
answer


> 論理CPUの性質？はどれも同じだと思っていたので、「このペアは独立性が低い/高い」という事実に、驚きました。

[Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3A:
System Programming Guide, Part
1](https://www.intel.com/content/www/us/en/developer/articles/technical/intel-
sdm.html) で触れられています。

  * Package 
    * Core 
      * SMT (Hyper-Threading)

の階層があります。

[![画像の説明をここに入力](https://i.stack.imgur.com/MIv6A.png)](https://i.stack.imgur.com/MIv6A.png)

> CPU0とCPU1がキャッシュメモリを共有していること、CPU0とCPU4がキャッシュメモリを共有していないことは、どのように確認できるのでしょうか？

実際に共有しているかどうかはそれぞれのプロセッサアーキテクチャを確認する必要があります。しかし、プロセッサは３次キャッシュまで持ち、どこかしら共有している可能性があるため、独立性が欲しいのであれば、上記階層の中から単純に一番遠いプロセッサを選択すればよいかと。  
Intelプロセッサには`APIC ID`というものが振られており、

[code]

    $ cat /proc/cpuinfo
    
[/code]

で参照することができます。加えて`APIC ID`だけでなくそれを解析した結果として、`physical id`や`core
id`なども出力されます。（Package IDは出てこなかった…）  
参考としてうちのPCは6core 12threadですが、processor 0と6が`physical id==0`、`core
id==0`でキャッシュ共有など距離が近い存在でした。（つまり質問者さんが参照された書籍と真逆です）


CC BY-SA 4.0
2022-07-17T04:41:27.443
90033
2022-07-17T04:41:27.443
4236
90028
answer