2个不稳定版本

0.2.0 2022年8月9日
0.1.0 2021年9月30日

图形API 中排名第226

Download history 12843/week @ 2024-03-14 11464/week @ 2024-03-21 10799/week @ 2024-03-28 9242/week @ 2024-04-04 10729/week @ 2024-04-11 10711/week @ 2024-04-18 8248/week @ 2024-04-25 8289/week @ 2024-05-02 3972/week @ 2024-05-09 2972/week @ 2024-05-16 2216/week @ 2024-05-23 2536/week @ 2024-05-30 2903/week @ 2024-06-06 3582/week @ 2024-06-13 4675/week @ 2024-06-20 2559/week @ 2024-06-27

每月下载量14,351
用于 54 个crate(6个直接使用)

MIT/Apache

7KB

ec-gpu & ec-gpu-gen

crates.io Documentation Build Status minimum rustc 1.51 dependency status

crates.io Documentation Build Status minimum rustc 1.51 dependency status

用于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,可以通过设置 cudaopencl 功能标志来启用它们。

环境变量

  • 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-2.0 许可证定义的,您有意提交的任何贡献,都应按上述方式双重许可,而不附加任何额外的条款或条件。

无运行时依赖