跳到正文

Wiki

並行是什麼

約 1 分鐘閱讀

本文由簡體中文內容確定性轉換,並受版本化術語表保護。

並行(parallelism)關注的是:

多個任務是否在同一時刻真的同時執行。

它更偏向性能和吞吐,而不是單純的程序結構。

1.一個直觀理解

如果一件事可以拆成幾份獨立工作:

任务 A
任务 B
任务 C
任务 D

並且機器有多個 CPU 核心,那麼這些任務就可能同時運行。

這就是並行:

多个执行单元
同一时刻
同时干活

2.並行和併發的區別

併發是:

多个任务都在推进

並行是:

多个任务真的同时执行

所以一個程序可以:

  • 有併發,但沒有並行:單核 CPU 上多個線程輪流執行;
  • 有併發,也有並行:多核 CPU 上多個線程同時計算;
  • 使用並行算法,但不手動創建線程:讓標準庫或底層運行時決定怎樣執行。

3.並行不等於線程越多越快

線程數量超過硬件能同時執行的數量後,操作系統需要不斷切換線程。

線程切換、同步、鎖競爭、緩存失效都會帶來額外開銷。

所以並行優化時要關心:

  1. 任務能不能拆開?
  2. 拆開以後是否足夠獨立?
  3. 每個任務的計算量是否足夠大?
  4. 任務之間是否頻繁爭搶同一份數據?
  5. 並行帶來的收益是否大於調度和同步成本?

4.C++ 中可能遇到的並行內容

後續可以繼續補充:

  • 標準庫並行算法;
  • execution policy;
  • 任務並行;
  • 數據並行;
  • SIMD 與向量化;
  • 線程池與任務調度。

當前先預留這個位置,等併發基礎學完後再展開會更合適。