SIMD和多线程之间的区别[关闭]
Posted
技术标签:
【中文标题】SIMD和多线程之间的区别[关闭]【英文标题】:Difference between SIMD and Multi-threading [closed] 【发布时间】:2020-01-07 06:08:58 【问题描述】:在并行编程范式中遇到的 SIMD 和多线程概念之间有什么区别?
【问题讨论】:
关于 SIMD : ***.com/tags/simd/info 虽然 Mark Setchell 的帖子内容丰富,但请注意与数据相关的延迟、thread|process 间协调成本、相互 (b) 锁定可能很容易破坏任何在几个 CPU 核心之间进行分工处理,因此与纯 [SERIAL]、精心设计的 SIMD(对齐)计算相比,弱协调的工作可能需要更长的时间(在同一或分布式厨房内的多个“厨师”之间)策略 - 硬件细节很重要(英特尔 AVX-512 具有与 GPU-SMX 处理器不同的高效 SIMD 计算属性) 【参考方案1】:SIMD 表示 "Single Instruction, Multiple Data",是一个概括性术语,描述了一种方法,其中许多元素同时加载到超宽 CPU 寄存器中,并且单个低级指令(例如 ADD、MULTIPLY、AND、XOR)并行应用于所有元素。具体示例是 Intel 处理器上的 MMX、SSE2/3 和 AVX,或 ARM 处理器上的 NEON,或 PowerPC 上的 AltiVec。它是非常低级的,通常仅用于几个时钟周期。一个例子可能是,不是进入for
循环来逐个增加图像中像素的亮度,而是将64个8位像素加载到一个512位宽的寄存器中并将它们全部相乘在一两个时钟周期内同时启动。 SIMD 通常在高性能库(如 OpenCV)中为您实现,或者在您编译启用矢量化时由您的编译器为您生成,通常在优化级别 3 或更高(-O3
开关)。非常有经验的程序员可以选择自己编写,使用 "intrinsics"。
多线程是指当您有多个执行线程时,通常同时在不同的 CPU 内核上运行。它比 SIMD 更高级别,并且通常线程存在的时间更长。一个线程可能正在获取图像,另一个线程可能正在检测对象,另一个线程可能正在跟踪对象,最后一个线程可能正在显示结果。多线程的一个特点是线程都共享相同的地址空间,因此一个线程中的数据可以被其他线程看到和操作。与多进程相比,这使得线程轻量级,但会使调试更加困难。线程被称为“轻量级”,因为它们通常比成熟的进程花费更少的时间来创建和启动。
多处理类似于多线程,只是每个进程都有自己的地址空间,所以如果你想在进程之间共享数据,你需要更加努力地去做。与多线程相比,它的优势在于一个进程不太可能使另一个进程崩溃或干扰其数据,从而使其更易于调试。
如果我用做饭来做类比,那么SIMD就像把你所有的青豆排成一排,然后一口气把它们切成薄片。单个指令是“slice”,多个重复的数据是bean。事实上,对齐(“内存对齐”)是 SIMD 的一个重要方面。
那么多线程就像让多个厨师从一个共享的蔬菜储藏室中取出食材,准备好并将它们放入一个共享的大锅中。您可以更快地完成工作,因为有多个厨师(类似于 CPU 内核)同时工作。
在这个小类比中,多重处理更像是每个厨师都有自己的蔬菜储藏室和炊具,所以如果一个厨师用完了蔬菜或煤气,其他厨师就没有了受影响 - 事情更加独立。你可以更快地完成工作,因为有更多的厨师,只是你需要做更多的组织(或“同步”)让所有的厨师在同一时间提供他们的饭菜结束。
没有什么可以阻止应用程序同时使用 SIMD 以及多线程和多处理。回到烹饪类比,您可以有多个厨师(多线程或多处理),他们都在高效地切片青豆(SIMD强>)。在我的印象中,大多数应用程序要么使用 SIMD 和多线程,要么使用 SIMD 和多处理,但很少有人同时使用多线程和多处理。 YMMV 关于这一点!
【讨论】:
以上是关于SIMD和多线程之间的区别[关闭]的主要内容,如果未能解决你的问题,请参考以下文章