2个不稳定版本
0.2.0 | 2022年8月9日 |
---|---|
0.1.0 | 2021年9月30日 |
在 图形API 中排名第226
每月下载量14,351次
用于 54 个crate(6个直接使用)
7KB
ec-gpu
& ec-gpu-gen
用于Rust的有限域算术(素域)和椭圆曲线算术(用Rust构建)的CUDA/OpenCL代码生成器。
注意事项
- 肢数长度为32/64位,由您选择(在CUDA中仅支持32位肢数)。
- 该库假定您的素域的最高位未设置。这允许进行便宜的重减。
使用方法
快速入门
为 blstrs
标量元素生成CUDA/OpenCL代码
use blstrs::Scalar;
use ec_gpu_gen::SourceBuilder;
let source = SourceBuilder::new()
.add_field::<Scalar>()
.build_64_bit_limbs();
集成到您的库中
该crate通常在编译时创建GPU内核。CUDA生成fatbin,而OpenCL仅生成源代码,然后在运行时进行编译。
为了使使用更加方便,提供了辅助函数。您需要在 build.rs
中放入一些代码,生成内核,然后在您的库中放入一些代码来消费这些生成的内核。内核将被直接嵌入到您的程序/库中。如果发生错误,您将在编译时得到错误。
在这个例子中,我们将使用FFT功能。将以下内容添加到您的 build.rs
use blstrs::Scalar;
use ec_gpu_gen::SourceBuilder;
fn main() {
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 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::<Fr>::create(programs).expect("Cannot initialize kernel!");
kern.radix_fft_many(&mut [&mut coeffs], &[omega], &[log_d]).expect("GPU FFT failed!");
功能标志
此库支持CUDA和OpenCL,可以通过设置 cuda
和 opencl
功能标志来启用它们。
环境变量
-
EC_GPU_CUDA_NVCC_ARGS
默认情况下,CUDA内核会为多个架构进行编译,这可能会花费很长时间。
EC_GPU_CUDA_NVCC_ARGS
可以用来覆盖这些参数。输入和输出文件将仍然自动设置。// Example for compiling the kernel for only the Turing architecture. EC_GPU_CUDA_NVCC_ARGS="--fatbin --gpu-architecture=sm_75 --generate-code=arch=compute_75,code=sm_75"
-
EC_GPU_FRAMEWORK
当库同时支持CUDA和OpenCL时,您可以在运行时选择使用哪一个。默认情况下是
cuda
,如果没有设置或设置了其他(无效)值。另一个可能的值是opencl
。// Example for setting it to OpenCL. EC_GPU_FRAMEWORK=opencl
-
EC_GPU_NUM_THREADS
限制了库中使用的线程数。默认设置为机器报告的逻辑核心数。
// Example for setting the maximum number of threads to 6. EC_GPU_NUM_THREADS=6
许可证
许可协议为以下之一:
- Apache License,版本 2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交的任何贡献,都应按上述方式双重许可,而不附加任何额外的条款或条件。