概念

并行(Parallel)

同一时刻运行多个计算。

位级并行(Bit-level parallelism)

(这也算并行?)(还真是,同一时刻计算多个位……)

一个很好的例子就是比较两个整数,不是逐个位串行比较而是一次就比较所有位。

That’s one of the reason we increase the word length of a CPU.

指令级并行(Instruction-level parallelism)

同一时刻执行多个指令。

  • 硬件上
    • 流水线
    • 超标量:多个ALU或类似运算单元(如FPU),某个ALU忙着的时候可以用别的ALU(md,我真希望ALU能直接组合逻辑完成一切计算)
    • 多发射:为什么要让ALU闲着?取指令什么的工序也给我多整几个。(于是变成了多个流水线一起跑)
  • 软件&硬件上
    • 多发射中,对目前正在执行指令的结果有依赖的指令不能执行,此时可以让后面对结果没有依赖的指令先执行。这可以通过编译时的指令重排(龙书第10章)和执行时的乱序执行来实现。

数据级并行

同一时刻单个指令处理多个数据。

  • cuda

  • mpi

  • openmp

  • simd

任务级并行

我们常用的多线程/多进程属于这一级别。

并发(Concurrent)

同一时间段内运行多个计算。

并发——有并行的潜力。

同步IO

发起IO请求的线程不从正在调用的IO操作函数返回(即被阻塞),直至IO操作完成。

异步IO

发起IO请求的线程不等IO操作完成,就继续执行随后的代码,IO结果用其他方式通知发起IO请求的程序。

阻塞

IO结果准备好之前,当前线程/进程挂起。

显然的,异步阻塞IO没有意义。

非阻塞

IO结果准备好之前,当前线程不挂起,而是继续做下面的事情。

同步非阻塞就是(由当前线程自己)不断轮询IO结果是否准备好。

wikipedia 上的伪代码。