自编教材分享:第八章—访存优化(四)



内存优化
减少内存读写
内存又可以叫做主存,是处理器能直接寻址的存储空间,由半导体器件制成。以DDR3内存来说,通常一次内存读写大约要200~400个时钟周期,访问内存速度非常慢,因此在程序优化的过程中应当优先充分使用寄存器而不是访存。大多数情况下,编译器能够很好地解决这个问题,但是在具有存储器别名情况或读写依赖情况下,需要优化人员手动处理。
原始代码:
优化后代码:
数据对齐
当处理器访问正确对齐的数据时,它的运行效率最高。当数据值没有正确对齐时,处理器需要产生一个异常条件或执行多次对齐的内存访问,以便读取完整的未对齐数据,导致运行效率降低。所以处理器提供的对齐的数据访问指令效率要远高于非对齐的数据访问指令。
在32位处理器中,一个int型变量占4个byte,假设这个变量i在内存中占据2、3、4、5这4个byte的位置,数据非对齐存储如图所示。

结构体对齐
结构体分配内存空间时采用的对齐规则为,变量的起始地址能够被其对齐值整除,结构体变量的对齐值为最宽的成员大小;结构体每个成员相对于起始地址的偏移能够被其自身对齐值整除,如果不能则在前一个成员后面补充字节;结构体总大小能够被最宽的成员的大小整除,如不能整除则在后面补充字节。
例如A结构体的各成员所占内存空间大小为sizeof(a)+sizeof(b)+sizeof(c),即1+4+4=9,而实际上结构体的大小为sizeof(A)=12。内存分配如图所示。

在定义结构体时,应按照成员大小从小到大或从大到小依次定义各成员。建议尽量大数据类型在前,小数据类型在后,一方面这样会节省一些空间,另一方面可以更好地满足处理器的对齐要求。
例如结构体A1需要分配12字节的内存空间,将结构体内成员顺序进行调整后得到A2结构体,只需要分配8个字节空间,处理器访问2次内存就可读完数据。
直接内存访问
直接内存访问(Direct Memory Access,DMA),是一种广泛应用的硬件机制,可以直接传输外围设备和主内存之间的数据,这样处理器可以直接使用这部分的数据,这种机制可以提升内设备数据传输的效率,DMA机制如图所示。

DMA机制与上文介绍的缓存机制的不同之处在于,DMA在处理器需要数据时会提前将数据搬移到处理器内,而缓存机制则是在需要数据的时候才搬移数据,因此利用DMA机制,程序的执行时间比利用缓存机制的更短。

以德州仪器C6678板卡为例,若数据存放在DDR中,需要读取到缓存中就可以使用EDMA机制实现。在循环中EDMA读数据需要采用EDMA _WAIT等待数据传输结束,伪代码如下:
前文中提到的数据预取和直接内存访问,目的都是为了数据在使用前能从内存调入缓存中,从而减少处理器停顿的访存优化方法。除了上述两种方法外,还可以在指令层次将访存与计算部分重叠,可以有效地解决访存的延迟。
