Rapidsnark 的 GPU 加速

本文介绍了对 rapidsnark 进行 GPU 加速的动机、背景和性能。通过将硬件加速集成到 rapidsnark 中,性能达到了 CPU 版本的约 4 倍。主要针对 NTT 和 MSM 计算进行优化,Orbiter Finance 团队开源了加速后的 rapidsnark 代码。

概括:

在这篇博文中,我们将介绍 rapidsnark 的 GPU 加速的动机、背景和性能,其性能大约是 CPU 版本的 4 倍

背景和动机

零知识证明在区块链中蓬勃发展。

Plonky2 是 ZK 开发者最受欢迎的 STARK 框架之一。但众所周知,在智能合约中使用基于 FRI 的多项式承诺和 Fiat-Shamir 验证 Plonky2 证明比验证 Groth16 证明更昂贵。因此,在 Orbiter 业务场景中,有必要将 Plonky2 递归证明转换为 Groth16 证明。

Rapidsnark 是一个用 C++ 编写的快速 zkSNARK 证明器,它为使用 circom 和 snarkjs 创建的电路生成证明。但是,它只支持 CPU 加速。此外,在 CPU 上,大约 98% 的处理时间专用于 NTT 和 MSM 计算。

此外,已经证明硬件加速可以有效地处理 NTT 和 MSM(参见 Zprize)。

因此,我们花了三周时间将基于 HW 的加速集成到 rapidsnark 中。随后,我们将其开源,开源存储库可以在以下位置找到:https://github.com/Orbiter-Finance/rapidsnark

基准测试

我们在包含以下内容的设置上运行了基准测试:

GPU — NVIDIA GeForce RTX 4090 24GB,

CPU — 2* AMD EPYC 7763 64-Core Processor

执行时间:

以下是 CPU 和 GPU 版本的数据:

  • CPU 版本测试数据
init and set str for altBbn128r: 0 ms
get zkey,zkeyHeader,wtns,wtnsHeader: 0 ms
make prover: 64 ms
get wtnsData: 0 ms
Multiexp A: 1816 ms
Multiexp B1: 2020 ms
Multiexp B2: 2520 ms
Multiexp C: 2775 ms
Initializing a b c A: 59 ms
Processing coefs: 593 ms
Calculating c: 49 ms
Initializing fft: 0 ms
iFFT A: 18158 ms
a After ifft: 0 ms
Shift A: 46 ms
a After shift: 0 ms
FFT A: 3188 ms
a After fft: 0 ms
iFFT B: 1805 ms
b After ifft: 0 ms
Shift B: 45 ms
b After shift: 0 ms
FFT B: 750 ms
b After fft: 0 ms
iFFT C: 971 ms
c After ifft: 0 ms
Shift C: 49 ms
c After shift: 0 ms
FFT C: 779 ms
c After fft: 0 ms
Start ABC: 48 ms
abc: 0 ms
Multiexp H: 4720 ms
generate proof: 40708 ms
write proof to file: 0 ms
write public to file: 0 ms
prover total: 41757 ms
  • GPU 版本测试数据
init and set str for altBbn128r: 0 ms
get zkey,zkeyHeader,wtns,wtnsHeader: 0 ms
make prover: 65 ms
get wtnsData: 0 ms
get MSM config: 0 ms
Multiexp A: 848 ms
Multiexp B1: 679 ms
Multiexp B2: 1080 ms
Multiexp C: 683 ms
Initializing a b c A: 75 ms
Processing coefs: 618 ms
Calculating c: 38 ms
Initializing fft: 148 ms
iFFT A: 291 ms
a After ifft: 0 ms
Shift A: 164 ms
a After shift: 0 ms
FFT A: 294 ms
a After fft: 0 ms
iFFT B: 272 ms
b After ifft: 0 ms
Shift B: 33 ms
b After shift: 0 ms
FFT B: 308 ms
b After fft: 0 ms
iFFT C: 255 ms
c After ifft: 0 ms
Shift C: 28 ms
c After shift: 0 ms
FFT C: 278 ms
c After fft: 0 ms
Start ABC: 46 ms
abc: 0 ms
Multiexp H: 929 ms
generate proof: 7362 ms
write proof to file: 0 ms
write public to file: 0 ms
prover cuda total: 8443 ms

值得注意的是,CPU 版本的 iFFT A 似乎具有稍微异常高的处理时间。

我们是如何做到的

我们仅对数据类型转换使用 reinterpret_cast。请参阅 https://github.com/Orbiter-Finance/rapidsnark/blob/6deb16bc974e12170e9f1f11ca59985b19d027da/src/groth16_cuda.cu#L56 中概述的具体步骤。

关于 Orbiter Finance 的更多信息

参考文献

[1] https://github.com/iden3/rapidsnark

[2] https://github.com/ingonyama-zk/icicle

[3] https://dev.ingonyama.com/

[4] https://github.com/supranational/sppark

[5] https://en.cppreference.com/w/

[6] https://cliutils.gitlab.io/modern-cmake/

[7] https://google.github.io/googletest/

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

0 条评论

请先 登录 后评论
orbiter-finance
orbiter-finance
江湖只有他的大名,没有他的介绍。