跳到正文

Wiki

并行是什么

约 1 分钟阅读

并行(parallelism)关注的是:

多个任务是否在同一时刻真的同时执行。

它更偏向性能和吞吐,而不是单纯的程序结构。

1.一个直观理解

如果一件事可以拆成几份独立工作:

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

并且机器有多个 CPU 核心,那么这些任务就可能同时运行。

这就是并行:

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

2.并行和并发的区别

并发是:

多个任务都在推进

并行是:

多个任务真的同时执行

所以一个程序可以:

  • 有并发,但没有并行:单核 CPU 上多个线程轮流执行;
  • 有并发,也有并行:多核 CPU 上多个线程同时计算;
  • 使用并行算法,但不手动创建线程:让标准库或底层运行时决定怎样执行。

3.并行不等于线程越多越快

线程数量超过硬件能同时执行的数量后,操作系统需要不断切换线程。

线程切换、同步、锁竞争、缓存失效都会带来额外开销。

所以并行优化时要关心:

  1. 任务能不能拆开?
  2. 拆开以后是否足够独立?
  3. 每个任务的计算量是否足够大?
  4. 任务之间是否频繁争抢同一份数据?
  5. 并行带来的收益是否大于调度和同步成本?

4.C++ 中可能遇到的并行内容

后续可以继续补充:

  • 标准库并行算法;
  • execution policy;
  • 任务并行;
  • 数据并行;
  • SIMD 与向量化;
  • 线程池与任务调度。

当前先预留这个位置,等并发基础学完后再展开会更合适。