SIMD 意指“单指令多数据”,是一个涵盖多种方法的总称,其方式是将许多元素同时加载到额外宽度的 CPU 寄存器中,并对所有元素应用单个低级指令(如 ADD、MULTIPLY、AND、XOR)以并行方式进行操作。具体示例包括在 Intel 处理器上的 MMX、SSE2/3 和 AVX,在 ARM 处理器上的 NEON,或在 PowerPC 上的 AltiVec。这是非常底层的操作,通常只需要几个 CPU 时钟周期。例如,你可以将 64 个 8 位像素加载到一个 512 位宽的寄存器中,一次性地乘起来,而不是逐个在图像中增加像素的亮度,从而避免 for 循环。在高性能库(如 OpenCV)中,SIMD 通常由库实现,或者在启用了向量化编译选项(如 -O3)的情况下,由编译器为您生成代码。非常有经验的程序员可能会选择使用“内嵌函数”编写自己的 SIMD 实现。{{多线程}}是指同时有多个执行线程,通常运行在不同的CPU核心上。它比SIMD更高级,线程存在的时间也更长。一个线程可能正在获取图像,另一个线程可能正在检测对象,另一个可能正在跟踪对象,最后一个可能正在显示结果。多线程的一个特点是所有线程共享相同的地址空间,因此一个线程中的数据可以被其他线程看到和操作。这使得线程相对于多进程来说更轻量级,但也可能导致调试更加困难。线程被称为“轻量级”,因为它们通常比完整进程创建和启动所需的时间要短得多。{{多进程}}与多线程类似,但每个进程都有自己的地址空间,因此如果要在进程之间共享数据,则需要更多的工作才能实现。与多线程相比,它的好处是一个进程不太可能崩溃另一个进程或干扰其数据,这使得调试相对更容易。 如果我用烹饪比喻,那么SIMD就像将所有的青豆排成一行并一次性切割。单个指令是"切割",多个重复数据是豆子。事实上,将事物排列整齐("内存对齐")是SIMD的一个重要方面。 然后,{{多线程}}就像有多个厨师从共享的蔬菜储藏室中取材料、准备食材并放入一个大的共享炖锅。因为有多个厨师(类似于CPU核心)同时工作,所以可以更快地完成工作。在这个比喻中,{{多进程}}更像是每个厨师都有自己的蔬菜储藏室和炖锅,因此如果一个厨师用完了蔬菜或烹饪气体,其他人不会受到影响-事情更加独立。你可以更快地完成工作,因为有更多的厨师,只是你需要做一些更多的组织(或“同步”)工作,以便让所有的厨师在最后同时上菜。 没有什么可以阻止应用程序同时使用SIMD、多线程和多处理。回到烹饪类比,您可以有多个厨师(多线程或多处理),他们都可以有效地切割他们的青豆(SIMD)。我的印象是,大多数应用程序要么使用SIMD和多线程,要么使用SIMD和多处理,但相对较少使用多线程和多处理。在这一点上,你的经验可能有所不同!