openvm_cuda_backend/
gpu_device.rs1use 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}