跳到正文

Wiki

並行是什麼

約 2 分鐘閱讀

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

並行(parallelism)關注的是:

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

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

1.一個直觀理解

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

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

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

這就是並行:

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

2.並行和併發的區別

併發是:

多个任务都在推进

並行是:

多个任务真的同时执行

所以一個程式可以:

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

3.並行不等於執行緒越多越快

執行緒數量超過硬體能同時執行的數量後,作業系統需要不斷切換執行緒。

執行緒切換、同步、鎖競爭、快取失效都會帶來額外開銷。

所以並行最佳化時要關心:

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

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

後續可以繼續補充:

  • 標準庫並行演算法;
  • execution policy;
  • 任務並行;
  • 資料並行;
  • SIMD 與向量化;
  • 執行緒池與任務排程。

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