Posted by My Blog on December 28, 2022

前言

在阅读一些源代码的时候,看到使用字节对齐和SSE指令进行优化。由于之前对字节对齐并不熟悉,所以在网上查看了相关的博客加深自己的理解。

1. 字节对齐是什么

字节对齐是数据存储在内存中的起始地址的限制。

对于程序中的变量而言,都需要存储在内存设备中,CPU通过地址对数据进行访问。然而不同的数据类型所需的存储空间是不同的,比如int在x86.

理论而言,计算机可以读取任何位置的数据。然而在实际的计算机中,计算机并非逐字节读取读写内存,而是要求数据的首地址的值是某个数的倍数,这就是字节对齐。

2. 为什么需要字节对齐

那么为什么在计算机中需要字节对齐呢?

2.1 计算机读取粒度

尽管内存是以字节为单位(8bits),但是大部分处理器并不是按照字节块来存取内存对的。

如微软的MSDN所言:

Many CPUs, such as those based on Alpha, IA-64, MIPS, and SuperH architectures, refuse to read misaligned data. When a program requests that one of these CPUs access data that is not aligned, the CPU enters an exception state and notifies the software that it cannot continue. On ARM, MIPS, and SH device platforms, for example, the operating system default is to give the application an exception notification when a misaligned access is requested

大致是说,有些CPU,如Alpha、IA-64、MIPS架构,若读取的数据是未对齐的,将拒绝访问、或抛出异常

2.2 读取效率

考虑到CPU处理内存的方式(如32位的x86 CPU,一个时钟周期可以读取4个连续的内存单元,即4字节),使用字节对齐将会提高系统的性能(比如,int数据若放在奇数位置,读取这4个字节至少需要访问两次内存,但是字节对齐之后读取一次即可。

3. 字节对齐如何实现

SSE指令

SSE指令是intel公司设计的、对其X86体系的SIMD拓展指令集,它基于SIMD向量化技术,提高了X86

硬件的计算能力。

向量化数据并行是指,一个指令可以同时对多个数据进行操作,一次操作的的数据个数由向量寄存器的长度和数据类型共同决定。例如,

SSE组成

SSE函数的命名可大致分为三部分,中间使用“_“隔开,含义如下:

第一部分为寄存器类型。_mm或_mm256。_mm表示其为SSE指令,操作向量长度为64位或128位

第二部分为操作函数名称,如_add、_load

第三部分为操作的对象名及其数据类型