笔记来源《计算机体系结构 量化研究方法》第四章
SIMD的引入
许多媒体应用处理的数据往往是以小尺寸的数据类型(如8位、16位)为主,而处理器通常为32位或更大位宽优化。如果能够设计一种方式让处理器同时处理多个这样的小尺寸数据,将能显著提高处理速度。
假设有一个256位宽的加法器,理论上它可以一次性处理4个64位数据或者8个32位数据等。SIMD允许这个加法器被分割成多个小的单元,每个单元独立处理一个小尺寸的数据。例如,可以将其分割成32个8位单元,这样就能同时对32个8位颜色值(如RGB中的每种颜色加上透明度信息)执行加法操作。这样做不仅减少了指令的重复,还充分利用了处理器的并行计算能力,大幅度提升了处理速度。
应用场景
图像处理:快速处理像素颜色变换、滤镜效果等。
视频编码/解码:加速帧间预测、颜色空间转换等。
音频处理:高效执行音频样本的混合、过滤和压缩。
SIMD与向量体系结构的比较
传统向量处理器设计有大规模的向量寄存器,可以存储和操作非常长的向量数据。相比之下,SIMD虽然也是基于向量运算的思想,但它更侧重于在通用处理器上实现低成本、高效能的并行处理能力,因此它操作的数据向量较短,使用的寄存器资源也相对有限。
1. 固定的数据操作数数目
在多媒体SIMD扩展中,对于特定的指令,其操作数的数量固定。例如,一条SSE指令可能明确设计为同时操作4个单精度浮点数。相比之下,一些向量体系结构具有向量长度寄存器,它允许程序员动态指定当前操作要处理的数据元素数量。即使实际数据向量比处理器最大支持的向量长度短,程序也可以通过调整向量长度寄存器来有效利用硬件资源,无需额外的指令来处理不匹配的向量长度问题。向量体系结构的这一特性简化了对不同长度向量操作的管理,同时减少了指令集的复杂度,因为不需要为每种可能的向量长度提供单独的指令。
2. 缺少复杂的寻址模式
向量体系结构通常支持复杂的寻址模式,比如步幅访问和集中-分散访问。步幅访问允许在连续地址空间中以非单位间隔访问数据,这对于处理数组中的跨行或跨列操作特别有用。集中-分散访问则允许从非连续内存位置收集数据或向非连续位置分散数据,这对于非规则数据结构的操作非常关键。而多媒体SIMD指令集往往不包含这些高级寻址模式,这简化了硬件设计,但也限制了编译器自动向量化的能力,因为编译器需要更多工作来重组数据,以便适应SIMD指令的严格对齐和连续性要求。
3. 遮罩寄存器的缺失
向量体系结构常常配备有遮罩寄存器,这是一种用于控制向量操作中哪些元素应该被执行的功能。通过遮罩寄存器,可以在单个指令中实现元素级的条件执行,这对于执行诸如选择、分支等操作非常有用。然而,大多数多媒体SIMD架构不提供遮罩寄存器,这意味着实现元素级条件操作需要额外的逻辑和指令,这增加了编程复杂度,无论是对编译器还是对直接编写SIMD汇编代码的开发者来说。缺少遮罩寄存器意味着SIMD代码生成需要更复杂的算法来绕过这类条件执行的需求,有时甚至需要牺牲一定的性能或代码简洁性。
多媒体SIMD扩展尽管存在上述提到的一些局限性,但依然流行的原因:
1. 成本效益与易实施性
多媒体SIMD扩展能够在现有的处理器设计基础上低成本地增加,因为它们不涉及对核心算术逻辑单元的根本改变,而是作为附加模块集成到CPU中。这使得硬件制造商能够相对容易地提升处理器的并行处理能力,而无需彻底重新设计整个CPU架构。
2. 上下文切换和状态管理
与向量体系结构相比,SIMD扩展在上下文切换时所需的额外状态信息较少。在多任务操作系统中,频繁的上下文切换是常态,如果每次切换都要处理大量状态信息,会显著影响系统性能。SIMD指令集因状态管理简单,所以在多线程环境下的性能损失较小。
3. 存储器带宽和资源需求
向量体系结构为了充分发挥其潜力,通常需要更高的存储器带宽,这是因为它们能够处理更长的向量,而这在很多现有计算机系统中难以满足,尤其是在考虑成本和能耗时。相比之下,SIMD扩展因其操作向量较短,对存储器带宽的要求相对较低,更适合广泛部署。
4. 虚拟内存和页面错误处理
SIMD指令通常处理对齐且长度固定的向量,这意味着它们在执行时不太可能跨越虚拟内存中的页面边界,从而避免了复杂的页面错误处理问题。即便某条指令涉及多个内存访问,由于操作数的对齐性和固定长度,SIMD执行相对安全,不会轻易触发需要昂贵处理时间的页面错误。
5. 灵活性与标准化
SIMD扩展便于引入针对特定应用领域的优化指令,比如媒体处理、图形计算等领域中常用的置换操作等。这些指令针对固定长度的向量设计,易于实现,并且能高效支持新兴媒体标准,提高了硬件对新应用的适应性。