65个版本
0.26.0 | 2023年9月1日 |
---|---|
0.25.0 | 2023年4月14日 |
0.24.1 | 2022年11月21日 |
0.22.0 | 2022年6月15日 |
0.2.0 | 2019年5月20日 |
#1278 in 神奇豆子
7,200 每月下载量
在 57 个crate(直接) 中使用
440KB
10K SLoC
bellperson
这是伟大的bellman库的一个分支。
bellman
是一个用于构建zk-SNARK电路的crate。它提供了电路特性和基本结构,以及基本的gadget实现,如布尔值和数字抽象。
后端
目前有一个后端可用于Bls12 381的实现
GPU
这个分支包含了对groth16证明代码库中的FFT和多指数算法的GPU并行加速,编译特性为cuda
和opencl
。
需求
- NVIDIA或AMD GPU显卡驱动程序
- OpenCL
(对于AMD设备,我们推荐ROCm)
环境变量
gpu扩展包含一些可能需要在此库外部设置的env变量。
-
BELLMAN_NO_GPU
将禁用库中的GPU功能并强制使用CPU。
// Example env::set_var("BELLMAN_NO_GPU", "1");
-
BELLMAN_VERIFIER
选择批量验证器将要运行的设备。可以是
cpu
、gpu
或auto
。Example env::set_var("BELLMAN_VERIFIER", "gpu");
-
RUST_GPU_TOOLS_CUSTOM_GPU
允许添加不在测试列表中的GPU。这需要研究GPU设备的名称和核心数量,格式如下:
["name:cores"]
。// Example env::set_var("RUST_GPU_TOOLS_CUSTOM_GPU", "GeForce RTX 2080 Ti:4352, GeForce GTX 1060:1280");
-
BELLMAN_CPU_UTILIZATION
可以在[0,1]区间内设置,以指定多指数计算的比例,在GPU并行执行的同时将其移至CPU,以保持所有硬件占用。
// Example env::set_var("BELLMAN_CPU_UTILIZATION", "0.5");
-
RAYON_NUM_THREADS
限制了库中使用的线程数,大约为该数值(尽力而为)。在过去,这是通过
BELLMAN_NUM_CPUS
实现的,现在已弃用。默认设置为机器上报告的逻辑核心数。// Example env::set_var("RAYON_NUM_THREADS", "6");
-
EC_GPU_NUM_THREADS
限制了FFT和多指数计算使用的线程数。在过去,此设置与
RAYON_NUM_THREADS
共享,现在它们是独立的设置,可以独立控制。默认设置为机器上报告的逻辑核心数。// Example env::set_var("EC_GPU_NUM_THREADS", "6");
-
BELLMAN_GPU_FRAMEWORK
Bellman可以与OpenCL和CUDA支持一起编译。当两者都可用时,可以使用
BELLMAN_GPU_FRAMEWORK
将其设置为特定的一个,即cuda
或opencl
。// Example env::set_var("BELLMAN_GPU_FRAMEWORK", "opencl");
-
BELLMAN_CUDA_NVCC_ARGS
默认情况下,CUDA内核编译为几个架构,这可能会花费很长时间。
BELLMAN_CUDA_NVCC_ARGS
可以用来覆盖这些参数。输入和输出文件仍然会自动设置。// Example for compiling the kernel for only the Turing architecture env::set_var("BELLMAN_CUDA_NVCC_ARGS", "--fatbin --gpu-architecture=sm_75 --generate-code=arch=compute_75,code=sm_75");
-
BELLPERSON_GPUS_PER_LOCK
限制了FFT和多指数计算使用的设备数量。
- 如果没有设置,将创建单个锁,并且每个计算都使用所有设备
- 如果BELLPERSON_GPUS_PER_LOCK = 0,则不会创建锁,每个计算都使用所有设备,每个设备可以运行多个计算。**警告**:此选项可能会轻易导致问题。每个内核都期望在没有其他东西同时运行在GPU上时运行。如果同时运行两个内核,它们可能会相互干扰,导致崩溃或错误的结果。
- 如果BELLPERSON_GPUS_PER_LOCK > 0,为每个设备创建一个锁,每个计算使用BELLPERSON_GPUS_PER_LOCK(最多设备数)个设备
// Example env::set_var("BELLPERSON_GPUS_PER_LOCK", "0"); env::set_var("BELLPERSON_GPUS_PER_LOCK", "1");
支持的/测试过的卡
根据要传递给GPU进行工作的证明的大小,某些卡将无法为FFT或多指数内核分配足够的内存。以下是适用于小型集的设备列表。将来,我们将添加一个截止点,在此之后,给定的卡将无法为利用GPU分配足够的内存。
设备名称 | 核心 | 注释 |
---|---|---|
Quadro RTX 6000 | 4608 | |
TITAN RTX | 4608 | |
Tesla V100 | 5120 | |
Tesla P100 | 3584 | |
Tesla T4 | 2560 | |
Quadro M5000 | 2048 | |
GeForce RTX 3090 | 10496 | |
GeForce RTX 3080 | 8704 | |
GeForce RTX 3070 | 5888 | |
GeForce RTX 2080 Ti | 4352 | |
GeForce RTX 2080 SUPER | 3072 | |
GeForce RTX 2080 | 2944 | |
GeForce RTX 2070 SUPER | 2560 | |
GeForce GTX 1080 Ti | 3584 | |
GeForce GTX 1080 | 2560 | |
GeForce GTX 2060 | 1920 | |
GeForce GTX 1660 Ti | 1536 | |
GeForce GTX 1060 | 1280 | |
GeForce GTX 1650 SUPER | 1280 | |
GeForce GTX 1650 | 896 | |
gfx1010 | 2560 | AMD RX 5700 XT |
gfx906 | 7400 | AMD RADEON VII |
------------------------ | ------- | ---------------- |
运行测试
RUSTFLAGS="-C target-cpu=native" cargo test --release --all
要使用CUDA和OpenCL运行,可以使用
RUSTFLAGS="-C target-cpu=native" cargo test --release --all --features cuda,opencl
要运行多指数一致性测试,可以使用
RUST_LOG=info cargo test --features cuda,opencl -- --exact multiexp::gpu_multiexp_consistency --nocapture
注意事项
Bellperson使用rust-gpu-tools
作为其CUDA/OpenCL后端,因此您可能在自己的主目录中看到一个名为~/.rust-gpu-tools
的目录,其中包含在此存储库中使用的OpenCL内核的编译二进制文件。
实验性
由 groth16::aggregate::prove::aggregate_proofs_and_instances()
提供的实例聚合尚未经过审计,因此应谨慎使用。建议在经过审计之前不要在生产环境中使用实例聚合。
许可
在以下任一许可下:
- Apache License, Version 2.0,|LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证(《LICENSE-MIT》或 http://opensource.org/licenses/MIT》)
由您选择。
贡献
除非您明确声明,否则您提交给作品以供包含的任何贡献(根据 Apache-2.0 许可证定义),将按照上述双重许可方式授予,不附加任何额外条款或条件。
依赖关系
~7–16MB
~290K SLoC