SIMD 和多线程之间的区别

Difference between SIMD and Multi-threading

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

SIMD 表示 "Single Instruction, Multiple Data" and is an umbrella term describing a method whereby many elements are loaded into extra-wide CPU registers at the same time and a single low-level instruction (such as ADD, MULTIPLY, AND, XOR) is applied to all the elements in parallel. Specific examples are MMX, SSE2/3 and AVX on Intel processors, or NEON on ARM processors, or AltiVec on PowerPC. It is very low-level and typically only for a few clock cycles. An example might be that, rather than go into a for loop increasing the brightness of the pixels in an image one-by-one, you load 64 off 8-bit pixels into a single 512-bit wide register and multiply them all up at the same time in one or two clock cycles. SIMD is often implemented for you in high-performance libraries (like OpenCV) or is generated for you by your compiler when you compile with vectorisation enabled, typically at optimisation level 3 or higher (-O3 switch). Very experienced programmers may choose to write their own, using "intrinsics".

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

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


如果用做饭来类比,那么SIMD就像是把所有的青豆排成一排,一次切好。单个指令是"slice",多个重复的数据是bean。事实上,排列("memory alignment")是SIMD.

的一个重要方面

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

在这个小类比中,多处理 更像是每个厨师都有自己的蔬菜储藏室和烹饪锅,所以如果一位厨师用完蔬菜或燃气,其他人不受影响 - 事情更加独立。您可以更快地完成工作,因为有更多的厨师,只是您需要做更多的组织工作(或 "synchronisation")才能让所有厨师在最后的同一时间。


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