关于内存模型的问题

时间:2013-05-08 01:36:24

标签: memory compiler-construction cpu-registers memory-model register-allocation

当我读到与编译器相关的书时,我看到有两种主要的内存模型。

注册注册模型和内存到内存模型。

在书中,它说寄存器到寄存器模型忽略了寄存器数量的机器限制,编译器后端必须插入加载和存储。是因为寄存器到寄存器模型可以使用虚拟寄存器......并且此模型保留所有可以存储在寄存器中的值,因此在完成之前必须插入加载和存储(与存储器相关)?

此外,在内存到内存部分,本书说编译器后端可以删除冗余的加载和存储。这是否意味着该模型必须删除多余的内存使用以进行优化?

1 个答案:

答案 0 :(得分:0)

我将在编译器的上下文中回答你的问题,因为这就是你所说的你正在阅读的内容。在计算机体系结构环境中,这些答案将适用,因此请谨慎阅读。

  

是因为寄存器到寄存器模型可以使用虚拟寄存器......并且此模型保留所有可以存储在寄存器中的值,因此在完成之前必须插入加载和存储(与存储器相关)?

这可能是一个原因。如果底层机器不支持寄存器/寄存器操作,则需要将“虚拟寄存器”操作转换为加载和存储。类似地,如果您的编译器在IR阶段假定无限寄存器机器,则可能需要在寄存器分配阶段(将您的无限虚拟寄存器集映射到有限的实际寄存器集中)将一些寄存器溢出到存储器中。当你用完时记忆访问。)

  

这是否意味着模型必须删除内存的冗余使用以进行优化?

是的,编译器可以将其作为优化步骤。如果我们这样做:

register1 <- LOAD 1234
// Operation using register 1 that leaves the result in register 1
STORE register1, 1234
register1 <- LOAD 1234
// Another operation that uses register 1
STORE register1, 1235

这可以优化,只需将值保留在寄存器中,如下所示:

register1 <- LOAD 1234
// Operation using register 1 that leaves the result in register 1
// Another operation that uses register 1
STORE register1, 1235

这显然更有效,因为它避免了与寄存器相比较慢的额外DRAM访问。