MLIR助力EVM性能提升

该团队在两周内用五名新员工完成了以太坊虚拟机(EVM)75%的功能,并通过最先进的编译器后端将 VM 操作码逻辑编译为本地机器代码。他们创建了 EVM-MLIR 项目,旨在提供比 revm 更快的替代方案,并计划将其集成到新的以太坊执行客户端 ethrex 中,以提高性能并增加实现的多样性。基准测试显示,在运行阶乘和斐波那契程序时,吞吐量比 revm 高 300% 到 600%。

我们在两周内,通过五名新员工,实现了以太坊虚拟机 75% 的功能,并使用最先进的编译器后端将 VM opcode 逻辑编译为本地机器代码。我们为什么要这样做? 怎么做的?

简而言之:为了获得性能提升(最近的基准测试结果显示,在运行阶乘和斐波那契程序时,吞吐量比 revm 高 300% 到 600% 倍),增加实现多样性,并将其用于我们即将推出的以太坊执行客户端实现中。

看到许多其他 VM 将字节码编译成原生指令,我们觉得奇怪的是,以太坊虚拟机(EVM)的实现并没有这样做。 在做 Cairo Native 时,我们学到了很多关于 MLIR/LLVM 的知识,因此我们启动了 EVM-MLIR 项目,目标是拥有一个比 revm 更快的替代方案。

我们希望尽快了解可行性,因此我们首先明确了问题(和解决方案),制定了项目框架和实用程序,并确保新团队拥有坚实的基础。 通过准备好要分配的明确任务,我们设法在两周内实现了主网中 149 个 opcode 中的 111 个!

将 MLIR 应用于 EVM

EVM 是一种基于堆栈的虚拟机,其编译后的字节码表示一个指令序列,该序列由带有隐式参数的 1 字节 opcode 组成。 Push 操作还包括最多 32 字节的额外数据(要推送到堆栈的数字)。

它的内存架构由五个组件组成:

  • 堆栈:最多存储 1024 个 256 位宽的整数。 每个操作都会从中弹出操作数,和/或将结果推送到其中。 如果程序耗尽堆栈,它将终止。
  • 内存:字节数组,允许按字节进行随机寻址。 用于以有序方式存储和访问易失性数据。
  • Calldata:类似于 内存 的只读字节数组,作为每次交易的输入发送。 某些操作数允许将数据从 calldata 复制到堆栈或内存。
  • 存储:具有 256 位键和值的字典。 除非交易被回滚,否则更改会持久保存。
  • 瞬时存储:类似于 存储,但更改会在交易结束时被丢弃。

我们可以看到,EVM 的执行模型非常简单,这是有意的。

在指令序列上实现一个简单的解释器循环很容易,但很难优化。 有很多方法可以实现字节码解释器(这是一个有趣且具有教育意义的项目!),但是通过将每个 opcode 直接转换为机器指令来消除解释器开销非常有效。 唯一的困难是需要一个编译器后端以及一种链接和调用生成代码的方法。

我们决定利用我们最近使用 MLIR 的经验,并编写一个库,将每个操作转换为一系列 MLIR 代码块,其中包含实现每个 opcode 行为的 MLIR 操作,通过将每个操作连接到下一个操作来将它们连接起来。 最后,此表示形式可以转换为 LLVM IR,并通过 LLVM 的优化通道。

我们不仅需要根据 MLIR 操作来转换每个 opcode 的逻辑,还需要转换内存架构:

  • 堆栈:我们在启动上述序列之前预先分配最大堆栈大小(1024 个元素)。 当前指针和基址指针用于维护堆栈并检查溢出或下溢。
  • 内存:我们在 Rust 中处理内存分配,根据需要由 FFI 回调扩展。
  • Calldata:我们将其存储在 Rust 端,并将其作为输入提供给 EVM。
  • 存储/瞬时存储:将通过 syscall 处理,API 类似于 revm

基准

阶乘

该程序计算第 N 个阶乘数,其中 N 通过 calldata 传递。 我们选择 1000 作为 N,并在循环中运行该程序 100,000 次。

MacBook Air M1 (16 GB RAM)
Mean [s] Min [s] Max [s] Relative
EVM-MLIR 1.062 ± 0.004 1.057 1.070 1.00
revm 6.747 ± 0.190 6.497 7.002 6.36 ± 0.18
AMD Ryzen 9 5950X 16-Core Processor (128 GB RAM)
Mean [s] Min [s] Max [s] Relative
EVM-MLIR 1.363 ± 0.151 1.268 1.691 1.00
revm 5.081 ± 0.685 4.839 7.025 3.73 ± 0.65

斐波那契

该程序计算第 N 个斐波那契数,其中 N 通过 calldata 传递。 同样,我们选择 1000 作为 N,并在循环中运行该程序 100,000 次。

MacBook Air M1 (16 GB RAM)
Mean [s] Min [s] Max [s] Relative
EVM-MLIR 1.010 ± 0.016 0.990 1.040 1.00
revm 6.192 ± 0.119 6.094 6.374 6.13 ± 0.15
AMD Ryzen 9 5950X 16-Core Processor (128 GB RAM)
Mean [s] Min [s] Max [s] Relative
EVM-MLIR 1.496 ± 0.236 1.243 1.756 1.00
revm 4.586 ± 0.066 4.537 4.727 3.07 ± 0.49

这些基准测试的代码可以在我们的 repo 中看到:lambdaclass/evm_mlir,以及有关如何重现它们的文档。 我们目前在我们的 CI 上运行它们以检测性能回归,并且我们将在不久的将来添加更复杂的程序。

后续步骤

我们现在留下一个精干的团队来完成剩余的功能并继续进行优化,并将重点放在我们新的执行客户端上 —— 以 ETHereum Rust EXecution 命名为 ethrex

如前所述,我们新的执行客户端的目标是在未来两个月内为以太坊生态系统提供一个具有简单、直接代码的替代 Rust 执行客户端。 在 MLIR EVM 准备就绪后,我们打算将其集成到 ethrex 中,作为一种自食其力的努力。

  • 原文链接: blog.lambdaclass.com/evm...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
lambdaclass
lambdaclass
LambdaClass是一家风险投资工作室,致力于解决与分布式系统、机器学习、编译器和密码学相关的难题。