13个版本 (6个破坏性)

0.7.0 2023年6月8日
0.5.2 2023年3月3日
0.5.1 2022年12月1日
0.5.0 2022年11月17日
0.1.2 2021年11月16日

#660 in 密码学

Download history 3445/week @ 2024-03-14 2577/week @ 2024-03-21 2204/week @ 2024-03-28 3379/week @ 2024-04-04 3224/week @ 2024-04-11 2807/week @ 2024-04-18 1635/week @ 2024-04-25 1822/week @ 2024-05-02 1944/week @ 2024-05-09 1634/week @ 2024-05-16 1316/week @ 2024-05-23 1541/week @ 2024-05-30 1998/week @ 2024-06-06 1816/week @ 2024-06-13 1825/week @ 2024-06-20 1095/week @ 2024-06-27

每月下载量7,141
用于50个crate(直接使用2个)

MIT/Apache

98KB
2K SLoC

CUDA/OpenCL代码生成器,用于在素域上执行有限域算术和用Rust构建的椭圆曲线算术。

还支持快速傅里叶变换和多指数运算。

此crate通常在编译时生成GPU内核。CUDA生成fatbin,OpenCL仅生成源代码,然后在运行时编译。

为了使用起来更方便,提供了辅助函数。您需要将一些代码放入build.rs,生成内核,然后将一些代码放入您的库中,该库随后会使用这些生成的内核。内核将被直接嵌入到您的程序/库中。如果出现问题,您将在编译时得到错误。

在这个例子中,我们将使用FFT功能。将以下内容添加到您的build.rs

use blstrs::Scalar;
use ec_gpu_gen::SourceBuilder;

let source_builder = SourceBuilder::new().add_fft::<Scalar>();
ec_gpu_gen::generate(&source_builder);

ec_gpu_gen::generate()负责实际的代码生成/编译。它将自动创建CUDA和/或OpenCL内核。它将定义两个环境变量,这些变量用于内部使用。_EC_GPU_CUDA_KERNEL_FATBIN指向编译后的CUDA内核,而_EC_GPU_OPENCL_KERNEL_SOURCE指向生成的OpenCL源。

然后这些变量由ec_gpu_gen::program!()宏拾取,该宏为给定的GPU设备生成程序。在您的库中使用FFT将如下所示

use blstrs::Scalar;
use ec_gpu_gen::{
    rust_gpu_tools::Device,
};

let devices = Device::all();
let programs = devices
    .iter()
    .map(|device| ec_gpu_gen::program!(device))
    .collect::<Result<_, _>>()
    .expect("Cannot create programs!");

let mut kern = FftKernel::<Scalar>::create(programs).expect("Cannot initialize kernel!");
kern.radix_fft_many(&mut [&mut coeffs], &[omega], &[log_d]).expect("GPU FFT failed!");

功能标志

CUDA和OpenCL受支持,每个都通过cudaopencl 功能标志启用。

依赖关系

~3–13MB
~140K SLoC