1

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

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

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

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

4

1 回答 1

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 访问。

于 2013-05-08T01:47:13.257 回答