コンテンツにスキップ

CPU

  • CPU
    • 「中央処理装置」
    • 複雑な処理を行うことに向いている
  • GPU
    • 「画像処理装置」(3Dグラフィックスの描画用)
    • 単純な計算に向いている

CPUは優秀な数学教授、GPUは、電卓をもった小学生1,000人のイメージ。

アーキテクチャはCPU、GPUで体系が別物である。

  • CPUのアーキテクチャ
    • x86_64(amd64),ARM,RISC-V
  • GPUのアーキテクチャ
    • CUDA(NVIDIA),RDNA(AMD)

OSの選択は、CPUのアーキテクチャで決まる。

  • x86_64
    • Windows、サーバーなど
  • ARM
    • スマートフォン、Macなど
アーキテクチャの確認
uname -m

1論理CPUにつき、同時刻に1スレッドのみ実行可能。
1物理CPUは、ハイパースレッディングにより、2論理CPUと表すことができる。
(CPUの遊休時間を削減、性能は20%~30%の向上)

CPUの確認
system_profiler SPHardwareDataType
Hardware:
Hardware Overview:
Model Name: MacBook Pro
Model Identifier: Mac16,8
Model Number: Z1FF000JPJ/A
Chip: Apple M4 Pro
Total Number of Cores: 14 (10 performance and 4 efficiency)
Memory: 48 GB
System Firmware Version: 13822.61.10
OS Loader Version: 13822.61.10
Serial Number (system): GH9QCF2VWF
Hardware UUID: 59DC4621-EB22-53F7-88C3-264F4AE5A2FB
Provisioning UDID: 00006040-000220D81AB8801C
Activation Lock Status: Enabled
CPUの確認
sysctl hw.physicalcpu hw.logicalcpu
hw.physicalcpu: 14
hw.logicalcpu: 14

物理CPU14 / 論理CPU 14 ハイパースレッディングは無効

CPUの確認
$ lscpu
CPU(s): 8
On-line CPU(s) list: 0-7
Vendor ID: AuthenticAMD
Model name: AMD Ryzen 5 3500U with Radeon Vega Mobile Gfx
CPU family: 23
Model: 24
Thread(s) per core: 2
Core(s) per socket: 4
Socket(s): 1
...

物理CPU[Core(s) per socket] x スレッド[Thread(s) per core] = 論理CPU[CPU(s)] 4 x 2 = 8

Zalando Engineering Blog

最適スレッド数 = 論理CPU数 × 目標CPU使用率 × (1 + 待ち時間/CPU時間)

例: CPU数 = 8 目標CPU使用率 = 100% 待ち時間 = 100ms CPU時間 = 20ms

8 * 1 * (1 + 100 / 20) = 48

ただし、Measure, don’t guess(測定せよ、推測するな)

同じディスクへの書き込み実験

Section titled “同じディスクへの書き込み実験”

結果、並列の方が遅くなった。

=== 順次実行 ===
Read完了: 0.611秒
Write完了: 2.170秒
合計時間: 2.922秒
=== 並列実行 ===
Read完了: 0.661秒
Write完了: 2.978秒
合計時間: 2.986秒
sequenceDiagram
    participant CPU_A as CPU A
    participant Memory as Memory
    participant Disk as HardDisk

    Note over CPU_A,Disk: スレッドA: 読み込み処理
    CPU_A->>Disk: read()システムコール
    activate Disk
    Note over CPU_A: CPU待機(遊休)
    Disk->>Memory: データ転送(DMA)
    Disk-->>CPU_A: 読み込み完了通知
    deactivate Disk
    activate CPU_A
    CPU_A->>CPU_A: JSONパース(CPU使用)
    deactivate CPU_A

    Note over CPU_A,Disk: スレッドB: 書き込み処理
    CPU_A->>Memory: JSONシリアライズ
    activate CPU_A
    deactivate CPU_A
    CPU_A->>Disk: write()システムコール
    activate Disk
    Note over CPU_A: CPU待機(遊休)
    Memory->>Disk: データ転送(DMA)
    Disk-->>CPU_A: 書き込み完了通知
    deactivate Disk

    Note over CPU_A,Disk: 合計: 2.922秒(ディスクは順番に処理)
sequenceDiagram
    participant ThreadA as スレッドA
(Read) participant ThreadB as スレッドB
(Write) participant Disk as HardDisk
(物理的に1つ) par 並列開始 ThreadA->>Disk: read()リクエスト ThreadB->>Disk: write()リクエスト end Note over Disk: ❌ 競合発生!
1つのディスクに2つのリクエスト rect rgb(100, 50, 12) Note over Disk: ディスクスケジューラが調停 Disk->>Disk: read優先で処理開始 end Disk-->>ThreadA: 一部データ返却 rect rgb(100, 50, 12) Note over Disk: ヘッド移動(シーク)
読み込み位置→書き込み位置 Disk->>Disk: write処理 end Disk-->>ThreadB: 一部書き込み完了 rect rgb(100, 50, 12) Note over Disk: 再度ヘッド移動
書き込み位置→読み込み位置 Disk->>Disk: read処理再開 end Note over ThreadA,Disk: このヘッド移動が
オーバーヘッド!
=== 順次実行 ===
合計時間: 7.034秒
=== 並列実行 ===
合計時間: 5.604秒