openvm_cuda_backend/
gpu_device.rs

1use derivative::Derivative;
2use openvm_cuda_common::common::get_device;
3use openvm_stark_backend::config::DeepAliParameters;
4use openvm_stark_sdk::config::FriParameters;
5use p3_baby_bear::BabyBear;
6use p3_field::{coset::TwoAdicMultiplicativeCoset, PrimeCharacteristicRing};
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    pub deep_ali: DeepAliParameters,
16}
17
18#[derive(Derivative, Clone, Debug)]
19pub struct GpuDevice {
20    pub config: GpuConfig,
21    pub id: u32,
22    rap_phase_seq: Option<FriLogUpPhaseGpu>,
23}
24
25impl GpuDevice {
26    pub fn new(config: GpuConfig, rap_phase_seq: Option<FriLogUpPhaseGpu>) -> Self {
27        Self {
28            config,
29            id: get_device().unwrap() as u32,
30            rap_phase_seq,
31        }
32    }
33
34    pub fn rap_phase_seq(&self) -> &FriLogUpPhaseGpu {
35        self.rap_phase_seq
36            .as_ref()
37            .expect("FriLogUpPhaseGpu is not initialized")
38    }
39
40    pub fn natural_domain_for_degree(&self, degree: usize) -> TwoAdicMultiplicativeCoset<BabyBear> {
41        let log_n = log2_strict_usize(degree);
42        TwoAdicMultiplicativeCoset::new(BabyBear::ONE, log_n).unwrap()
43    }
44}