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 神奇豆子

Download history 3125/week @ 2024-04-13 1673/week @ 2024-04-20 1206/week @ 2024-04-27 1703/week @ 2024-05-04 1518/week @ 2024-05-11 1215/week @ 2024-05-18 959/week @ 2024-05-25 1548/week @ 2024-06-01 1615/week @ 2024-06-08 1548/week @ 2024-06-15 1110/week @ 2024-06-22 1819/week @ 2024-06-29 1461/week @ 2024-07-06 2541/week @ 2024-07-13 1448/week @ 2024-07-20 1112/week @ 2024-07-27

7,200 每月下载量
57 个crate(直接) 中使用

MIT/Apache

440KB
10K SLoC

bellperson Crates.io

这是伟大的bellman库的一个分支。

bellman 是一个用于构建zk-SNARK电路的crate。它提供了电路特性和基本结构,以及基本的gadget实现,如布尔值和数字抽象。

后端

目前有一个后端可用于Bls12 381的实现

  • blstrs - 使用blst进行手工调优的汇编优化

GPU

这个分支包含了对groth16证明代码库中的FFT和多指数算法的GPU并行加速,编译特性为cudaopencl

需求

  • NVIDIA或AMD GPU显卡驱动程序
  • OpenCL

(对于AMD设备,我们推荐ROCm

环境变量

gpu扩展包含一些可能需要在此库外部设置的env变量。

  • BELLMAN_NO_GPU

    将禁用库中的GPU功能并强制使用CPU。

    // Example
    env::set_var("BELLMAN_NO_GPU", "1");
    
  • BELLMAN_VERIFIER

    选择批量验证器将要运行的设备。可以是cpugpuauto

    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将其设置为特定的一个,即cudaopencl

    // 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-2.0 许可证定义),将按照上述双重许可方式授予,不附加任何额外条款或条件。

依赖关系

~7–16MB
~290K SLoC