3

在 32 位机器中,一个内存读取周期获取 4bytes个数据。
因此,对于读取缓冲区以下内容,读取下面提到的 128 个缓冲区需要 32 个读取周期bytes

char buffer[128];

现在,假设我已经按照下面提到的方式对齐了这个缓冲区,那么请告诉我它将如何使它更快地阅读?

alignas(128) char buffer[128];

我假设内存读取周期将仅保持 4 个字节。

4

2 回答 2

5

用于内存访问的寄存器的大小只是其中的一部分,另一部分是缓存线的大小。

如果一个缓存线是 64 字节并且你char[128]的自然对齐,CPU 通常需要操作三个不同的缓存线。使用alignas(64)or alignas(128),只需要触及两个缓存行。

如果您正在使用内存映射文件,或者在交换条件下,则下一个级别的对齐开始:内存页面的大小。这将需要 4096 或 8192 字节对齐。

alignas()但是,如果指定的对齐方式大于编译器使用的自然对齐方式,我严重怀疑它是否有任何显着的积极影响:它显着增加了内存消耗,这可能足以触发更多的缓存线/内存页面在第一名。只有小的错位需要避免,因为它们可能会在某些 CPU 上引发巨大的减速,或者在其他 CPU 上可能是完全非法/不可能的。

因此,真理只存在于测量中:如果你需要你能得到的所有加速,试试吧,测量运行时的差异,看看它是否有效。

于 2016-11-10T12:47:41.233 回答
1

在 32 位机器中,一个内存读取周期获得 4 个字节的数据。

没那么简单。仅仅“32 位机器”这个术语就已经太宽泛了,可能意味着很多东西。32b 寄存器(GP 寄存器?ALU 寄存器?地址寄存器?)?32b地址总线?32b数据总线?32b 指令字长?

以及由谁“读取内存” 。中央处理器?缓存?DMA芯片?

如果您有一个硬件平台,其中内存在单个周期中读取 4 个字节(按 4 对齐)并且没有任何缓存,那么alignas(128)将没有区别(比alignas(4))。

于 2016-11-10T15:16:39.030 回答