gpt4 book ai didi

performance - 在C虚拟机中实现寄存器

转载 作者:行者123 更新时间:2023-12-04 02:38:10 24 4
gpt4 key购买 nike

我已经用C语言编写了一个虚拟机作为一个业余项目。该虚拟机执行的代码与Intel语法x86程序集非常相似。问题在于该虚拟机使用的寄存器仅是名称上的寄存器。在我的VM代码中,就像x86寄存器一样使用寄存器,但是计算机将它们存储在系统内存中。使用VM代码在系统内存上使用寄存器没有任何性能改进。 (我认为仅凭本地性就可以提高性能,但实际上,什么都没有改变。)

解释程序时,该虚拟机将指令的参数存储为指针。这允许虚拟指令将内存地址,常量值,虚拟寄存器或几乎任何东西作为参数。

由于硬件寄存器没有地址,因此我无法想到一种将VM寄存器实际存储在硬件寄存器中的方法。在虚拟寄存器类型上使用register关键字不起作用,因为我必须获取指向虚拟寄存器的指针才能将其用作参数。有什么方法可以使这些虚拟寄存器的性能更像它们的 native 副本吗?

如有必要,我非常愿意研究组装。我知道JIT编译此VM代码可以允许我利用硬件寄存器,但是我也希望能够将它们与我的解释代码一起使用。

最佳答案

  • 机器寄存器不支持索引:如果没有代码生成,就不能用运行时指定的“索引”访问寄存器,无论这意味着什么。由于您很可能会从指令中解码寄存器索引,因此唯一的方法是进行巨大的转换(即switch (opcode) { case ADD_R0_R1: r[0] += r[1]; break; ... })。这可能是一个坏主意,因为它会过多增加解释器循环的大小,因此将导致指令高速缓存的困惑。
  • 如果我们谈论的是x86,那么另一个问题是通用寄存器的数量非常少。其中一些将用于簿记(存储PC,存储VM堆栈状态,解码指令等)-您为VM拥有多个免费注册的可能性不大。
  • 即使提供了寄存器索引支持,它也不大可能给您带来很多性能。通常,在解释器中,最大的瓶颈是指令解码。 x86支持根据寄存器值(即mov eax, dword ptr [ebx * 4 + ecx])进行快速紧凑的内存寻址,因此您不会获得太多 yield 。不过值得检查生成的程序集-即确保“寄存器池”地址存储在寄存器中。
  • 加速口译员的最佳方法是JITting。即使是简单的JIT(即,不分配智能寄存器-基本上只发出与指令循环和switch语句执行的相同代码,除了指令解码之外)都可以使性能提高3倍或更多(这些是来自简单JITter的实际结果)在基于Lua的基于寄存器的VM之上)。最好将解释器保留为引用代码(或对于冷代码而言,则可以减少JIT内存成本-对于简单JIT而言,JIT生成成本不是问题)。
  • 关于performance - 在C虚拟机中实现寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4790770/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com