Skip to main content

openvm_cuda_backend/
error.rs

1use openvm_cuda_common::error::{CudaError, MemCopyError};
2use thiserror::Error;
3
4use crate::{
5    logup_zerocheck::{
6        FoldPleError, FractionalSumcheckError, InteractionGpuError, Round0EvalError,
7    },
8    sponge::GrindError,
9};
10
11#[derive(Error, Debug)]
12pub enum ProverError {
13    #[error("MemCopy: {0}")]
14    MemCopy(#[from] MemCopyError),
15    #[error("stream_synchronize: {0}")]
16    StreamSynchronize(CudaError),
17    #[error("collapse_strided_matrix: {0}")]
18    CollapseStrided(CudaError),
19    #[error("Stack traces: {0}")]
20    StackTraces(#[from] StackTracesError),
21    #[error("MerkleTree: {0}")]
22    MerkleTree(#[from] MerkleTreeError),
23    #[error("rs_code_matrix: {0}")]
24    RsCodeMatrix(#[from] RsCodeMatrixError),
25    #[error("WHIR: {0}")]
26    Whir(#[from] WhirProverError),
27    #[error("Stacked reduction: {0}")]
28    StackedReduction(#[from] StackedReductionError),
29    #[error("LogupZerocheck: {0}")]
30    LogupZerocheck(#[from] LogupZerocheckError),
31}
32
33#[derive(Error, Debug)]
34pub enum StackedReductionError {
35    #[error(transparent)]
36    MemCopy(#[from] MemCopyError),
37    #[error("ensure_device_ntt_twiddles_initialized: {0}")]
38    InitNttTwiddles(CudaError),
39    #[error("EqEvalSegments: {0}")]
40    EqEvalSegments(KernelError),
41    #[error("fill_zero: {0}")]
42    FillZero(CudaError),
43    #[error("stacked_reduction_sumcheck_round0: {0}")]
44    SumcheckRound0(CudaError),
45    #[error("stacked_reduction_fold_ple: {0}")]
46    FoldPle(CudaError),
47    #[error("init_k_rot_from_eq_segments: {0}")]
48    InitKRot(CudaError),
49    #[error("vector_scalar_multiply_ext: {0}")]
50    VectorScalarMul(CudaError),
51    #[error("sumcheck_mle_round_degenerate: {0}")]
52    SumcheckMleRoundDegenerate(CudaError),
53    #[error("sumcheck_mle_round: {0}")]
54    SumcheckMleRound(CudaError),
55    #[error("fold_mle: {0}")]
56    FoldMle(CudaError),
57    #[error("triangular_fold_mle: {0}")]
58    TriangularFoldMle(CudaError),
59}
60
61#[derive(Error, Debug)]
62pub enum LogupZerocheckError {
63    #[error(transparent)]
64    MemCopy(#[from] MemCopyError),
65    #[error("Grind: {0}")]
66    Grind(GrindError),
67    #[error("Round0 eval: {0}")]
68    Round0Eval(#[from] Round0EvalError),
69    #[error("Interaction eval: {0}")]
70    InteractionEval(#[from] InteractionGpuError),
71    #[error("Fractional sumcheck: {0}")]
72    FractionalSumcheck(#[from] FractionalSumcheckError),
73    #[error("Fold PLE: {0}")]
74    FoldPle(#[from] FoldPleError),
75    #[error("Lambda combinations: {0}")]
76    LambdaCombinations(CudaError),
77    #[error("Logup combinations: {0}")]
78    LogupCombinations(CudaError),
79    #[error("Sumcheck: {0}")]
80    Sumcheck(#[from] SumcheckError),
81    #[error("MLE constraint eval: {0}")]
82    MleConstraintEval(KernelError),
83    #[error("MLE interaction eval: {0}")]
84    MleInteractionEval(KernelError),
85    #[error("EqEvalLayers: {0}")]
86    EqEvalLayers(KernelError),
87    #[error("fold_selectors_round0: {0}")]
88    FoldSelectorsRound0(CudaError),
89    #[error("interpolate_columns: {0}")]
90    InterpolateColumns(KernelError),
91    #[error("batch_fold_mle: {0}")]
92    BatchFoldMle(CudaError),
93    #[error("fill_zero: {0}")]
94    FillZero(CudaError),
95}
96
97#[derive(Error, Debug)]
98pub enum SumcheckError {
99    #[error(transparent)]
100    MemCopy(#[from] MemCopyError),
101    #[error("sumcheck_mle_round: {0}")]
102    SumcheckMleRound(KernelError),
103    #[error("fold_mle: {0}")]
104    FoldMle(KernelError),
105    #[error("batch_ntt_small: {0}")]
106    BatchNttSmall(KernelError),
107    #[error("reduce_over_x_and_cols: {0}")]
108    ReduceOverXAndCols(KernelError),
109    #[error("batch_expand_pad_wide: {0}")]
110    BatchExpandPadWide(KernelError),
111    #[error("fold_ple_from_coeffs: {0}")]
112    FoldPleFromCoeffs(KernelError),
113}
114
115#[derive(Error, Debug)]
116pub enum MerkleTreeError {
117    #[error(transparent)]
118    MemCopy(#[from] MemCopyError),
119    #[error(
120        "unsupported rows_per_query {rows_per_query}; CUDA Merkle row hashing supports at most {max_rows_per_query}"
121    )]
122    UnsupportedRowsPerQuery {
123        rows_per_query: usize,
124        max_rows_per_query: usize,
125    },
126    #[error("poseidon2_compressing_row_hashes error: {0}")]
127    CompressingRowHashes(CudaError),
128    #[error("poseidon2_compressing_row_hashes_ext error: {0}")]
129    CompressingRowHashesExt(CudaError),
130    #[error("poseidon2_adjacent_compress_layer [layer={layer}] error: {error}")]
131    AdjacentCompressLayer { error: CudaError, layer: usize },
132    #[error("query_digest_layers_kernel error: {0}")]
133    QueryDigestLayers(CudaError),
134    #[error("matrix_get_rows_fp_kernel [matrix_idx={matrix_idx}] error: {error}")]
135    MatrixGetRows { error: CudaError, matrix_idx: usize },
136}
137
138#[derive(Error, Debug)]
139pub enum StackTracesError {
140    #[error(transparent)]
141    MemCopy(#[from] MemCopyError),
142    #[error("batch_expand_pad_wide error: {0}")]
143    BatchExpandPadWide(CudaError),
144    #[error("fill_zero error: {0}")]
145    FillZero(CudaError),
146}
147
148#[derive(Error, Debug)]
149pub enum RsCodeMatrixError {
150    #[error(transparent)]
151    MemCopy(#[from] MemCopyError),
152    #[error("stack_traces_into_expanded error: {0}")]
153    StackTraces(StackTracesError),
154    #[error("batch_expand_pad error: {0}")]
155    BatchExpandPad(CudaError),
156    #[error("custom_batch_intt error: {0}")]
157    CustomBatchIntt(CudaError),
158    #[error("mle_interpolate_stage_2d [step={step}] error: {error}")]
159    MleInterpolateStage2d { error: CudaError, step: u32 },
160    #[error("bit_rev error: {0}")]
161    BitRev(CudaError),
162}
163
164#[derive(Error, Debug)]
165pub enum WhirProverError {
166    #[error(transparent)]
167    MemCopy(#[from] MemCopyError),
168    #[error("MerkleTree: {0}")]
169    MerkleTree(MerkleTreeError),
170    #[error("rs_code_matrix: {0}")]
171    RsCodeMatrix(RsCodeMatrixError),
172    #[error("whir_algebraic_batch_traces: {0}")]
173    AlgebraicBatch(CudaError),
174    #[error("transpose_fp_to_fpext_vec: {0}")]
175    Transpose(CudaError),
176    #[error("mle_interpolate_stage_ext [step={step}]: {error}")]
177    MleInterpolate { error: CudaError, step: u32 },
178    #[error("custom_batch_intt error: {0}")]
179    CustomBatchIntt(CudaError),
180    #[error("evals_eq_hypercube: {0}")]
181    EvalEq(KernelError),
182    #[error("whir_sumcheck_coeff_moments_round [whir_round={whir_round}, round={round}]: {error}")]
183    SumcheckMleRound {
184        error: CudaError,
185        whir_round: usize,
186        round: usize,
187    },
188    #[error("fold_mle [whir_round={whir_round}, round={round}]: {error}")]
189    FoldMle {
190        error: CudaError,
191        whir_round: usize,
192        round: usize,
193    },
194    #[error("split_ext_poly_to_base_col_major_matrix [whir_round={whir_round}]: {error}")]
195    SplitExtPoly { error: CudaError, whir_round: usize },
196    #[error("batch_expand_pad [whir_round={whir_round}]: {error}")]
197    BatchExpandPad { error: CudaError, whir_round: usize },
198    #[error("eval_poly_ext_at_point_from_base [whir_round={whir_round}]: {error}")]
199    EvalPolyAtPoint {
200        error: KernelError,
201        whir_round: usize,
202    },
203    #[error("w_moments_accumulate [whir_round={whir_round}]: {error}")]
204    WMomentsAccumulate { error: CudaError, whir_round: usize },
205    #[error("Mu grind error: {0}")]
206    MuGrind(GrindError),
207    #[error("Folding grind error: {0}")]
208    FoldingGrind(GrindError),
209    #[error("Query phase grind error: {0}")]
210    QueryPhaseGrind(GrindError),
211}
212
213/// Error type for functions that call CUDA kernels and involve some memcpy operations.
214#[derive(Error, Debug)]
215pub enum KernelError {
216    #[error("CUDA error: {0}")]
217    Kernel(#[from] CudaError),
218    #[error("Memory copy error: {0}")]
219    MemCopy(#[from] MemCopyError),
220}