在32位机器中,一个内存读取周期获得4 bytes
个数据
因此,对于读取下面的缓冲区,读取下面提到的128 bytes
的缓冲区需要32个读周期。
char buffer[128];
现在,假设我已经按照下面的说明对齐了这个缓冲区,那么请告诉我它如何让它更快阅读?
alignas(128) char buffer[128];
我假设内存读取周期仅为4个字节。
答案 0 :(得分:4)
用于内存访问的寄存器大小只是故事的一部分,另一部分是缓存行的大小。
如果缓存行是64字节且char[128]
自然对齐,则CPU通常需要操作三个不同的缓存行。使用alignas(64)
或alignas(128)
时,只需要触摸两个缓存行。
如果您正在使用内存映射文件,或者在交换条件下,则下一级别的对齐将启动:内存页面的大小。这将需要4096或8192个字节对齐。
但是,我严重怀疑alignas()
如果指定的对齐大于编译器使用的自然对齐,则会产生任何显着的正面影响:它会显着增加内存消耗,这可能足以触发更多缓存 - 首先触摸行/内存页面。这只是需要避免的小错位,因为它们可能会导致某些CPU出现大幅减速,或者对其他CPU来说可能是彻头彻尾的非法/不可能。
因此,事实只是在测量中:如果你需要所有加速,你可以尝试,测量运行时差异,看看它是否有用。
答案 1 :(得分:1)
在32位机器中,一个存储器读周期获得4个字节的数据。
不是那么简单。只是术语" 32位机器" 已经过于宽泛,可能意味着许多事情。 32b寄存器(GP寄存器?ALU寄存器?地址寄存器?)? 32b地址总线? 32b数据总线? 32b指令字大小?
"记忆读取" 由谁。中央处理器?缓存? DMA芯片?
如果你有一个硬件平台,在一个周期内没有任何缓存,4个字节(由4对齐)读取内存,那么alignas(128)
将没有区别(比alignas(4)
)。