CPU
プロセッサの種類
Section titled “プロセッサの種類”- CPU
- 「中央処理装置」
- 複雑な処理を行うことに向いている
- GPU
- 「画像処理装置」(3Dグラフィックスの描画用)
- 単純な計算に向いている
CPUは優秀な数学教授、GPUは、電卓をもった小学生1,000人のイメージ。
アーキテクチャ
Section titled “アーキテクチャ”アーキテクチャはCPU、GPUで体系が別物である。
- CPUのアーキテクチャ
- x86_64(amd64),ARM,RISC-V
- GPUのアーキテクチャ
- CUDA(NVIDIA),RDNA(AMD)
OSの選択は、CPUのアーキテクチャで決まる。
CPUのアーキテクチャ
Section titled “CPUのアーキテクチャ”- x86_64
- Windows、サーバーなど
- ARM
- スマートフォン、Macなど
uname -mハイパースレッディング
Section titled “ハイパースレッディング”1論理CPUにつき、同時刻に1スレッドのみ実行可能。
1物理CPUは、ハイパースレッディングにより、2論理CPUと表すことができる。
(CPUの遊休時間を削減、性能は20%~30%の向上)
Macの場合
Section titled “Macの場合”❯ system_profiler SPHardwareDataTypeHardware:
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❯ sysctl hw.physicalcpu hw.logicalcpuhw.physicalcpu: 14hw.logicalcpu: 14物理CPU14 / 論理CPU 14 ハイパースレッディングは無効
Arch Linux
Section titled “Arch Linux”$ lscpu
CPU(s): 8 On-line CPU(s) list: 0-7Vendor 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
CPUに対して最適なスレッド数
Section titled “CPUに対して最適なスレッド数”最適スレッド数 = 論理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秒スレッドが1つの場合
Section titled “スレッドが1つの場合”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秒(ディスクは順番に処理)
スレッドが2つの場合
Section titled “スレッドが2つの場合”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: このヘッド移動が
オーバーヘッド!
ネットワークを経由するもの
Section titled “ネットワークを経由するもの”=== 順次実行 ===合計時間: 7.034秒=== 並列実行 ===合計時間: 5.604秒