首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >详解并行技术SIMD、SIMT、SPMD

详解并行技术SIMD、SIMT、SPMD

作者头像
霞姐聊IT
发布2025-11-12 20:02:41
发布2025-11-12 20:02:41
4810
举报

在今天,几乎所有从事性能敏感领域开发的程序员,都会直接或间接地接触到SIMD和SIMT、SPMD等技术。理解这些概念,已经成为区分普通程序员和高级工程师的一个重要标志。今天就让霞姐带大家一起来学习一下吧!

一、SIMD

1.SIMD起源

SIMD术语来自Flynn分类法。

Flynn是个1934年出生的老爷爷,他的职业生涯聚焦在电气工程和计算机科学领域,尤其在计算机体系结构领域有着广为人知的成就。

Flynn曾参与 IBM 7090 计算机的研发,还担任过 IBM 360 系列中央处理器(CPU)的设计经理。

Flynn于1966年,在他离开IBM后加入西北大学时,提出了Flynn分类法。

当时Flynn在为《IEEE 会刊》(Proceedings of the IEEE)的一个计算机专题写文章,需要梳理整个领域的发展现状。他发现当时有很多并行计算相关的研究,但缺乏统一的分类方式,很难清晰地讨论这些技术,于是他提出了Flynn分类法。

Flynn分类法抓住了计算机工作流程中的两个本质维度:指令流和数据流,并且提供了清晰易记的标准术语,很快就为业界所接受。

2.Flynn分类法

Flynn根据计算机架构可以同时处理的指令流(进程)和数据流数量对计算机架构进行分类,将其分为四类:SISD、SIMD、MISD 和 MIMD。

SISD(单指令单数据):一个指令流处理一个数据。就是最常见的冯诺依曼模型。

这种架构下,处理元件的速度依赖计算机内部信息传输速率,如主频、IPC、内存层次结构和缓存等。

SIMD(单指令多数据):能够在所有CPU 上执行相同的指令,但在不同的数据流上运行。基于SIMD 模型的机器非常适合科学计算,因为它们涉及大量矢量和矩阵运算。主要代表性的系统有Cray的矢量处理机。

MISD(多指令单数据):能够在不同的PE上执行不同的指令,但它们都在同一数据集上运行。使用 MISD 模型的机器在大多数应用中都没有用处,有少量机器使用此模型,但他们都没有商用。

MIMD(多指令多数据):一种多处理器机器,能够在多个数据集上执行多个指令。MIMD 模型中的每个 PE 都有单独的指令和数据流;因此,使用该模型制造的机器能够用于任何类型的应用。绝大多数现代并行系统都属于此类型。

MIMD按照内存组织方式不同,又可划分为共享内存(NUMA、SMP)和分布式内存模型(MPP、集群)。

3.现代计算机和SIMD

我们现在说的SIMD,和Flynn分类中的SIMD系统还有些区别。

现在的计算机一般核心是MIMD或者SISD系统,而SIMD是其中一个功能单元。

从下面AMD的cpu图中可以看出来,simd是cpu硅片的一部分。

现在,x86和arm的cpu都支持simd指令。

Intel在1997年就推出了针对多媒体应用的MMX,后续又陆续推出了SSE系列、AVX系列,以及近些年针对AI矩阵计算设计的AMX指令集等。

ARM则从2000年开始逐渐引入NEON、SVE系列,以及针对矩阵计算的SME。

4.理解SIMD

SIMD单指令多数据,是在寄存器级别,一条指令同时处理多个数据元素;与之对应的是SISD,SISD一条指令只能处理一个数据元素。

另外,SIMD的并行是寄存器级别,意味着它是在单线程内并行处理多个数据。

我们可以类比一下这样的现实场景:

多线程,相当于多个厨师。

SISD,相当于给厨师切菜的刀是普通水果刀,因此只能切一根萝卜。

SIMD,相当于把厨师切菜的刀换成了西瓜刀,西瓜刀同时能切四根萝卜。

SISD一次能处理一个数得到一个结果,而SIMD能一次处理多个数得到多个结果。

5.SIMD并行编程

SIMD是寄存器级别并行,那么是否意味着,我们是否一定要进行汇编语言编程才能使用它呢?

答案是否定的。程序员(我指C语言哈,其它语言我没有深入使用过)可以通过四种方式享受到SIMD的高性能。

(1)编译器自动优化

对于简单循环等简单情况,编译器可以自动识别并向量化。此时代码不需要任何特殊处理,只需要在编译时使用类似下面的命令生成可执行文件即可。

启动自动向量化:gcc -O3 -march=native -ftree-vectorize -fopt-info-vec-missed demo.c -o demo

或者显式启用sse/avx:gcc -O3 -msse -msse2 -mavx demo.c -o demo

(2)OpenMP导语

可以使用编译导语显式指导向量化,再用类似gcc -O3 -march=native -fopenmp demo.c -o demo命令编译即可。

(3)Intrinsics 函数

Intrinsics函数是编译器提供的一种高级的编程方式,它允许程序员使用类似于函数调用的语法来直接操作SIMD指令。这些函数在编译时会被转换为对应的SIMD指令,从而实现对数据的并行处理。

下面的例子中使用了_mm_*这些Intrinsics函数来执行了加法的批量处理。

(4)内联汇编

也可以内联汇编直接用指令进行操作达成目的:

在实际项目中,可以先尝试编译器自动优化,如果不满意,可使用OpenMP SIMD导语显式提示编译器优化。对于性能关键部分,可使用 Intrinsics函数手动控制,极端情况下,可以研究研究内联汇编。

二、SIMT

1.SIMT起源

SIMT(单指令多线程)是NVIDIA(06年有硬件基础,07年随CUDA平台发布)为其GPU架构提出来的并行计算模型。这个名字听起来怪怪的,如果按照“单个指令处理多个线程”来理解的话,甚至会感觉很不通顺。

SIMT指的是多个线程同时执行相同的指令,但可以处理不同的数据。这里的线程可以成千上万个。

其实SIMT的底层还是SIMD。

在GPU 上执行过程中,透明的硬件机制会将线程分组为 “线程束(warp)”,并在 SIMD 单元上以锁步(lockstep)方式执行这些线程的指令.

具体举个例子,在NVIDIA GPU中,32个线程被组织成一个warp,当执行一条加法指令时,底层硬件会调用32宽的加法单元,同时对32个线程的输入数据执行加法。

2.Why SIMT

既然SIMT底层是SIMD,那为什么NVIDIA不说自己的GPU是SIMD,而是生造了一个SIMT呢?霞姐认为,原因有三个:

(1)SIMT在 SIMD 基础上允许以 “线程” 形式编程,无需像传统 SIMD 那样手动处理数据打包,降低 GPGPU 开发门槛。

(2)SIMT的硬件设计上,相比于传统SIMD,进行了优化。SIMT的每个线程有独立的寄存器文件和程序计数器(逻辑上),硬件可通过 “线程切换” 隐藏内存延迟(当一个线程等待内存访问时,快速切换到另一个就绪线程);

(3)SIMT强调GPU的多线程,能区别于CPU上的SIMD技术,在市场上更具记忆点。

3.SIMT编程

以对两个大型浮点数组进行元素级相加为例,程序员只用写标量代码,硬件自动实现并行:

而在第一节SIMD编程中,程序员则需要了解更多的硬件细节,比如具体的向量宽度,处理长度不是硬件整数倍的情况等。

另外在带条件分支的运算等复杂场景下,SIMT会处理的更加简单直观。

三、SPMD

1.SPMD起源

SPMD(单程序多数据)概念雏形于上世纪70年代末出现。当时研究人员开始构建第一批并行计算机,发现科学计算中的许多问题(气候模型、物理模拟、矩阵计算)天生就具有数据并行性,而最直观的解决方案就是:编写一份处理单个数据单元的程序,然后在多个处理器上同时运行这个程序的副本,每个副本处理不同的数据单元。 这就是 SPMD 的核心思想。

1988 年,在由 IEEE 组织的一次关于“可伸缩并行计算机”的重要研讨会上,Darema 等人的论文明确地描述并定义了 SPMD 模式。SPMD被确立成一个术语:它是 MIMD 计算机的一种主要且实用的编程模式,而不是一个全新的硬件架构类别。

SPMD 模式在1990年代初期,随着消息传递接口(MPI) 标准的诞生 而普及。

MPI提供了一个标准化的库,允许运行在分布式内存系统上的多个进程通过发送和接收消息进行通信。MPI 程序几乎总是以 SPMD 风格编写,它的成功使得 SPMD 成为了高性能计算领域事实上的标准编程模型。

2.SPMD vs SIMT

从程序员和编译器的角度看,SIMT也是一种SPMD。因为在SIMT编程中,程序员编写一个单独的程序或内核(kernel),随后大量的内核实例(或线程)会并行运行。

当然SIMT是软硬件优势结合形成的一个概念,SIMT可以理解成:SPMD 的编程抽象 + 硬件的 SIMD 执行 + 自动的线程管理。

3.SPMD编程

下面是mpi程序的一个示例:

综上所述,从Flynn分类法的理论奠基,到实践中应运而生的SPMD编程模型,再到NVIDIA为释放GPU算力而创造的SIMT架构,从这三个术语可以隐约窥探到并行计算技术的发展历程。

它们并非相互替代,而是在不同层级和场景下协同作战,共同构成了现代计算的并行基石。SIMD 专注于数据级的细粒度并行,SPMD统领着从单机到集群的宏观并行,而SIMT 则通过通过精妙的软硬件抽象,让成千上万的线程能够高效协同,开启AI与图形计算的崭新时代。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 霞姐聊IT 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档