openvm_cuda_backend/
gpu_device.rs

1use derivative::Derivative;
2use openvm_cuda_common::common::get_device;
3use openvm_stark_sdk::config::FriParameters;
4use p3_baby_bear::BabyBear;
5use p3_commit::TwoAdicMultiplicativeCoset;
6use p3_field::FieldAlgebra;
7use p3_util::log2_strict_usize;
8
9use crate::fri_log_up::FriLogUpPhaseGpu;
10
11#[derive(Derivative, derive_new::new, Clone, Copy, Debug)]
12pub struct GpuConfig {
13    pub fri: FriParameters,
14    pub shift: BabyBear,
15}
16
17#[derive(Derivative, Clone, Debug)]
18pub struct GpuDevice {
19    pub config: GpuConfig,
20    pub id: u32,
21    rap_phase_seq: Option<FriLogUpPhaseGpu>,
22}
23
24impl GpuDevice {
25    pub fn new(config: GpuConfig, rap_phase_seq: Option<FriLogUpPhaseGpu>) -> Self {
26        Self {
27            config,
28            id: get_device().unwrap() as u32,
29            rap_phase_seq,
30        }
31    }
32
33    pub fn rap_phase_seq(&self) -> &FriLogUpPhaseGpu {
34        self.rap_phase_seq
35            .as_ref()
36            .expect("FriLogUpPhaseGpu is not initialized")
37    }
38
39    pub fn natural_domain_for_degree(&self, degree: usize) -> TwoAdicMultiplicativeCoset<BabyBear> {
40        let log_n = log2_strict_usize(degree);
41        TwoAdicMultiplicativeCoset {
42            log_n,
43            shift: BabyBear::ONE,
44        }
45    }
46}