本文对Stwo Poseidon AIR进行了基准测试,主要针对WebGPU上proving过程中最耗时的trace生成、trace插值、trace扩展和组合多项式评估等操作进行了性能分析和优化。
我们以 Stwo Poseidon AIR 作为基准,分析了 proving 的执行时间,并在 WebGPU 中实现了最耗时的操作:trace 生成、trace 插值、trace 扩展和计算组合多项式。
即使在考虑了各种开销(例如 CPU 到 GPU 的内存复制)之后,这些使用 WebGPU 的操作也比 wasm 构建上的 Simd 实现快大约 5 倍。
由于这些操作大约占总 proving 执行时间的 65%,即使在当前的部分实现下,整体执行速度也快了 2 倍。
与其他 Stwo GPU 实现一样,将整个证明过程卸载到 GPU 似乎是最有效的方法。
在主要任务中,尚未移植到 WebGPU 的剩余组件是 commitment 和 FRI 代码。
flowchart LR
L1["主要影响<br/>>15%"] --- L2["显著影响<br/>5-15%"] --- L3["中等影响<br/>1-5%"] --- L4["轻微影响<br/><1%"]
classDef red fill:#ff0000,color:white
classDef orange fill:#ffa500,color:black
classDef gray fill:#808080, color:white;
classDef white fill:#ffffff, color:black;
class L1 red
class L2 orange
class L3 gray
class L4 white
flowchart TD
A["总 Poseidon 证明<br/>13.78s | 100%"] --> B["预计算 twiddle 因子<br/>9.01ms | 0.07%"]
A --> C["常量<br/>1.04ms | 0.01%"]
A --> D["Trace<br/>5.19s | 37.66%"]
A --> E["交互<br/>331ms | 2.40%"]
A --> F["证明<br/>8.24s | 59.80%"]
F --> G["组合<br/>6.80s | 49.35%"]
F --> H["计算域外列<br/>997ms | 7.24%"]
F --> I["计算 FRI 商<br/>261ms | 1.89%"]
F --> J["承诺<br/>105ms | 0.76%"]
F --> K["研磨<br/>13.3ms | 0.10%"]
G --> L["生成<br/>6.73s | 48.84%"]
G --> M["承诺<br/>68.7ms | 0.50%"]
L --> N["扩展<br/>5.66s | 41.07%"]
L --> O["约束逐点求值<br/>1.04s | 7.55%"]
L --> P["约束插值<br/>22.8ms | 0.17%"]
D --> Q["生成<br/>865ms | 6.28%"]
D --> R["承诺插值<br/>1.51s | 10.96%"]
D --> S["承诺<br/>2.82s | 20.46%"]
S --> T["承诺<br/>2.82s | 20.46%"]
T --> U["扩展<br/>2.58s | 18.72%"]
T --> V["Merkle<br/>243ms | 1.76%"]
%% Color definitions based on impact:
%% Major Impact (>15%): red
%% Significant Impact (5-15%): orange
%% Moderate Impact (1-5%): gray
%% Minor Impact (<1%): white
classDef red fill:#ff0000, color:white;
classDef orange fill:#ffa500, color:black;
classDef gray fill:#808080, color:white;
classDef white fill:#ffffff, color:black;
class A,D,F,G,L,N,S,T,U red;
class H,O,Q,R orange;
class E,I,V gray;
class B,C,J,K,M,P white;
细节
深度 | 操作 | 时间(忙碌) | 总百分比 | 父百分比 |
---|---|---|---|---|
0 | 总 Poseidon 证明 | 13.78s | 100% | 100% |
1 | ├── 预计算 twiddle 因子 | 9.01ms | 0.07% | 0.07% |
1 | ├── 常量 | 1.04ms | 0.01% | 0.01% |
1 | ├── Trace | 5.19s | 37.66% | 37.66% |
2 | │ ├── 生成 | 865ms | 6.28% | 16.67% |
2 | │ ├── 承诺插值 | 1.51s | 10.96% | 29.09% |
2 | │ └── 承诺 | 2.82s | 20.46% | 54.33% |
3 | │ └── 承诺 | 2.82s | 20.46% | 100% |
4 | │ ├── 扩展 | 2.58s | 18.72% | 91.49% |
4 | │ └── Merkle | 243ms | 1.76% | 8.62% |
1 | ├── 交互 | 331ms | 2.40% | 2.40% |
1 | └── 证明 | 8.24s | 59.80% | 59.80% |
2 | ├── 组合 | 6.80s | 49.35% | 82.52% |
3 | │ ├── 生成 | 6.73s | 48.84% | 98.97% |
4 | │ │ ├── 扩展 | 5.66s | 41.07% | 84.10% |
4 | │ │ ├── 约束逐点求值 | 1.04s | 7.55% | 15.45% |
4 | │ │ └── 约束插值 | 22.8ms | 0.17% | 0.34% |
3 | │ └── 承诺 | 68.7ms | 0.50% | 1.01% |
2 | ├── 计算域外列 | 997ms | 7.24% | 12.10% |
2 | ├── 计算 FRI 商 | 261ms | 1.89% | 3.17% |
2 | ├── Commit | 105ms | 0.76% | 1.27% |
2 | └── Grind | 13.3ms | 0.10% | 0.16% |
Repo: https://github.com/zksecurity/stwo/commits/gpu-extend-trace/
Poseidon 实例 | WebGPU | CPU 总计 | CPU 扩展 | CPU 计算 |
---|---|---|---|---|
2^12 | 32 | 117 | 62 | 55 |
2^13 | 52 | 242 | 129 | 113 |
2^14 | 83 | 537 | 312 | 225 |
2^15 | 155 | 814 | 365 | 449 |
2^16 | 229 | 1647 | 751 | 896 |
2^17 | 528 | 3265 | 1470 | 1795 |
2^18 | 1100 | 6497 | 2952 | 3545 |
Poseidon 实例 | WebGPU | CPU Ex+Comp | CPU 扩展 | CPU 计算 |
---|---|---|---|---|
2^12 | 40 | 7 | 4 | 2 |
2^13 | 53 | 14 | 9 | 4 |
2^14 | 77 | 31 | 22 | 9 |
2^15 | 116 | 59 | 45 | 14 |
2^16 | 207 | 124 | 92 | 32 |
2^17 | 404 | 277 | 206 | 70 |
2^18 | 785 | 530 | 412 | 118 |
基准测试步骤 ### 运行 WASM
test_poseidon_prove_wasm_gpu_cpu
中的 LOG_N_INSTANCES
compute_composition_polynomial.rs
中的 N_ROWS
LOG_N_INSTANCES=12 => N_ROWS=32
LOG_N_INSTANCES=13 => N_ROWS=64
compute_composition_polynomial.wgsl
中的 N_ROWS
compute_composition_polynomial.rs
相同的值wasm-pack test --chrome --release
test_simd_poseidon_prove
中的 LOG_N_INSTANCES
compute_composition_polynomial.rs
中的 N_ROWS
LOG_N_INSTANCES=12 => N_ROWS=32
LOG_N_INSTANCES=13 => N_ROWS=64
compute_composition_polynomial.wgsl
中的 N_ROWS
compute_composition_polynomial.rs
相同的值cargo test --release --features parallel test_simd_poseidon_prove -- --nocapture
- 原文链接: hackmd.io/XM9z2p8sSIS1w_...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!