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 密码学
每月下载量7,141
用于50个crate(直接使用2个)
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受支持,每个都通过cuda
和opencl
功能标志启用。
依赖关系
~3–13MB
~140K SLoC