16.3 SIMD 指令集
冯诺伊曼计算模型的特征是线性的,且不认为多种操作可以并行执行。显而易见,当今时代为了获得更优性能并行执行是非常必要的了。如果计算行为彼此独立,就可以进行并行执行。例如,为了计算 100 万个数值的和,我们可以在十个处理器中分别处理 10 万个数的和,然后再把结果加起来。这是 map-reduce 技术能够适用的场景之一[5]。
我们可以使用两种方式实现并行执行:
- 并行执行几个序列的汇编指令。在多核的场景下就可以做得到。在 17 章中会讨论使用到了多核心的多线程编程知识。
- 将一条指令拆成多条并行执行。这种情况下我们可以调用多个独立的计算,这些计算会使用处理器的多种元件。这也是并行可以被开发的地方。
为了实现这样的指令,CPU 需要包含一些 ALU 单元来获得实际的性能提升,不过也并不一定需要真的去同时执行多条指令。这种指令被称为 SIMD(Single Instruction, Multiple Data) 指令。
下一节中我们将要学习 CPU 的扩展 SSE(Streaming SIMD Extensions) 和类似的 AVX(Advanced Vector Extensions)。
和 SIMD 指令对比的话,我们学习过的大多数指令都是 SISD(Single Instruction,Single Data) 的。