SIMD和多线程的区别

Aim*_*Aim 3 parallel-processing multithreading simd

在并行编程范式中遇到的 SIMD 和多线程概念之间有什么区别?

Mar*_*ell 15

SIMD 的意思是单指令、多数据,是一个总称,描述了一种方法,其中许多元素同时加载到超宽 CPU 寄存器和单个低级指令(如 ADD、MULTIPLY、AND、XOR)并行应用于所有元素。具体示例是Intel 处理器上的MMXSSE2 /3 和AVX,或ARM 处理器上的NEON或PowerPC 上的AltiVec。它是非常低级的,通常仅用于几个时钟周期。一个例子可能是,而不是进入for循环逐个增加图像中像素的亮度,将 64 个 8 位像素加载到单个 512 位宽的寄存器中,并在一两个时钟周期内同时将它们全部相乘。SIMD通常在高性能库(如OpenCV)中为您实现,或者当您在启用矢量化的情况下编译时由编译器为您生成,通常在优化级别 3 或更高级别(-O3switch )。非常有经验的程序员可能会选择自己编写,使用内在函数

多线程是指您有多个执行线程,通常同时运行在不同的 CPU 内核上。它比 SIMD 更高级别,通常线程存在的时间更长。一个线程可能正在获取图像,另一个线程可能正在检测对象,另一个线程可能正在跟踪对象,最后一个线程可能正在显示结果。多线程的一个特点是所有线程共享相同的地址空间,因此一个线程中的数据可以被其他线程看到和操作。与多个进程相比,这使得线程轻量级,但会使调试更加困难。线程被称为“轻量级”,因为它们通常比成熟的进程花费更少的时间来创建和启动。

多处理类似于多线程,只是每个进程都有自己的地址空间,所以如果你想在进程之间共享数据,你需要更加努力地去做。与多线程相比,它的优势在于一个进程不太可能使另一个进程崩溃或干扰其数据,从而使其更容易调试。


如果我用做饭做类比,那么SIMD就像把你所有的青豆排成一排,然后一次切碎。单个指令是“切片”,多个重复的数据是bean。事实上,排列(“内存对齐”)是SIMD 的一个重要方面。

在此处输入图片说明

那么多线程就像让多个厨师都从共享的蔬菜储藏室中取出食材,准备它们并将它们放入一个大的共享烹饪锅中。您可以更快地完成工作,因为有多个厨师(类似于 CPU 内核)同时工作。

在这个小类比中,多加工更像是每个厨师都有自己的蔬菜储藏室和烹饪锅,因此如果一位厨师用完蔬菜或烹饪用气,其他厨师不会受到影响 - 事情更加独立。你可以更快地完成工作,因为有更多的厨师,只是你必须做更多的组织(或“同步”)才能让所有厨师在最后同时为他们提供食物。


没有什么可以阻止应用程序同时使用 SIMD 以及多线程和多处理。让我们再回到烹饪比喻,你可以有多个厨师(多线程或者多处理)谁是所有的切片绿豆有效(SIMD)。在我的印象中,大多数应用程序要么使用 SIMD 和多线程,要么使用 SIMD 和多处理,但很少有人同时使用多线程和多处理。YMMV 在这一点上!