SIMD和多线程的区别

4

SIMD和多线程是并行编程范式中常见的概念,它们之间有什么区别呢?


1
关于SIMD:https://stackoverflow.com/tags/simd/info 尽管Mark Setchell的帖子很有启发性,但请注意,与数据相关的延迟、线程/进程间协调成本、相互阻塞可能会轻易地摧毁在几个CPU核心之间进行的任何分割工作处理,以至于弱协调的努力可能需要比纯[串行]、良好设计的SIMD(对齐)计算策略花费更长时间(在同一或分布式厨房内存在多个“大厨”)。硬件细节很重要(Intel AVX-512对于高效的SIMD计算具有不同的属性,而GPU-SMX处理器则不同)。 - user3666197
1个回答

25

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

enter image description here

然后,{{多线程}}就像有多个厨师从共享的蔬菜储藏室中取材料、准备食材并放入一个大的共享炖锅。因为有多个厨师(类似于CPU核心)同时工作,所以可以更快地完成工作。
在这个比喻中,{{多进程}}更像是每个厨师都有自己的蔬菜储藏室和炖锅,因此如果一个厨师用完了蔬菜或烹饪气体,其他人不会受到影响-事情更加独立。你可以更快地完成工作,因为有更多的厨师,只是你需要做一些更多的组织(或“同步”)工作,以便让所有的厨师在最后同时上菜。

没有什么可以阻止应用程序同时使用SIMD、多线程和多处理。回到烹饪类比,您可以有多个厨师(多线程多处理),他们都可以有效地切割他们的青豆(SIMD)。我的印象是,大多数应用程序要么使用SIMD和多线程,要么使用SIMD和多处理,但相对较少使用多线程和多处理。在这一点上,你的经验可能有所不同!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接