【问题标题】:Why memory alignment of 4 is needed for efficient access?为什么有效访问需要 4 的内存对齐?
【发布时间】:2011-02-13 01:35:13
【问题描述】:

我理解为什么需要对齐数据(以及为完成对齐所做的所有努力,例如填充),以便我们可以减少内存访问次数,但这假设处理器只能获取 4 的倍数的地址(假设我们使用32 位架构)。 由于这个假设,我们需要对齐内存。

我的问题是:
为什么我们只能访问 4 的倍数(效率、硬件限制、另一个)?

这样做有什么好处?为什么我们不能访问所有可用的地址?

【问题讨论】:

    标签: memory memory-alignment


    【解决方案1】:

    内存由连接到内存总线的硬件 (RAM) 构成。总线越宽,获取数据所需的周期就越少。如果内存为 1 字节宽,则需要 4 个周期才能读取一个 32 位值。随着时间的推移,内存架构不断发展,并且根据处理器的类别(嵌入式、低功耗、高性能等)和缓存设计,内存可能非常宽(例如,256 位)。

    给定一个非常宽的内部总线(在 RAM 或高速缓存之间)和寄存器,比如两倍于寄存器宽度,如果数据路径中有桶形移位器,则无论对齐如何,您都可以在一个周期内获取一个值。桶式移位器很昂贵,因此并非所有处理器都有它们;如果路径中没有一个,则需要多个循环来对齐值。

    【讨论】:

    • 嗨,道格,谢谢您的回复。但是我还是不明白为什么我只能在 4 的倍数的地址上获取数据,这样做有什么好处?
    • 当地址是 4 的倍数时,数据不必从多个物理内存位置移动和合并。在某些处理器上,这会花费时间;在其他处理器上,没有硬件可以进行移位和合并,因此是不允许的。
    • 假设我可以访问内存中的所有地址,而不是 4 的倍数,在这个模式中,内存对齐不是必需的,因为我可以从我的变量存储在内存中的地址开始并获取数据,在这里我将只进行一次获取(我的变量是一个 int)。我的困难是理解为什么我不能访问所有可寻址的内存值?
    • 在某些处理器上,您可以“访问所有可寻址的内存值”,因为在数据缓存和 CPU 之间的(至少两倍)宽的数据路径中有一个桶形移位器,或者在CPU 进行多次内存读取并为您移动/屏蔽数据。在其他处理器上你不能,因为没有桶形移位器,也没有这样的微码;这是 CPU 设计人员的成本/收益决定。
    猜你喜欢
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 2021-12-17
    • 2020-12-08
    • 1970-01-01
    • 2014-03-30
    • 2010-11-07
    • 1970-01-01
    相关资源
    最近更新 更多