Skip to content

Commit 771d520

Browse files
committed
feat: give access to cycle count when using CudaProver
1 parent 53d780f commit 771d520

File tree

1 file changed

+38
-21
lines changed

1 file changed

+38
-21
lines changed

crates/sdk/src/cuda/mod.rs

+38-21
Original file line numberDiff line numberDiff line change
@@ -77,32 +77,26 @@ impl CudaProver {
7777
pub fn prove<'a>(&'a self, pk: &'a SP1ProvingKey, stdin: &'a SP1Stdin) -> CudaProveBuilder<'a> {
7878
CudaProveBuilder { prover: self, mode: SP1ProofMode::Core, pk, stdin: stdin.clone() }
7979
}
80-
}
8180

82-
impl Prover<CpuProverComponents> for CudaProver {
83-
fn setup(&self, elf: &[u8]) -> (SP1ProvingKey, SP1VerifyingKey) {
84-
let (pk, vk) = self.cuda_prover.setup(elf).unwrap();
85-
(pk, vk)
86-
}
87-
88-
fn inner(&self) -> &SP1Prover<CpuProverComponents> {
89-
&self.cpu_prover
90-
}
91-
92-
fn prove(
81+
/// Proves the given program on the given input in the given proof mode.
82+
///
83+
/// Returns the cycle count in addition to the proof.
84+
pub fn prove_with_report(
9385
&self,
9486
pk: &SP1ProvingKey,
9587
stdin: &SP1Stdin,
9688
kind: SP1ProofMode,
97-
) -> Result<SP1ProofWithPublicValues> {
89+
) -> Result<(SP1ProofWithPublicValues, u64)> {
9890
// Generate the core proof.
9991
let proof = self.cuda_prover.prove_core(stdin)?;
92+
let cycles = proof.cycles;
10093
if kind == SP1ProofMode::Core {
101-
return Ok(SP1ProofWithPublicValues::new(
94+
let proof_with_pv = SP1ProofWithPublicValues::new(
10295
SP1Proof::Core(proof.proof.0),
10396
proof.public_values,
10497
self.version().to_string(),
105-
));
98+
);
99+
return Ok((proof_with_pv, cycles));
106100
}
107101

108102
// Generate the compressed proof.
@@ -111,11 +105,12 @@ impl Prover<CpuProverComponents> for CudaProver {
111105
let public_values = proof.public_values.clone();
112106
let reduce_proof = self.cuda_prover.compress(&pk.vk, proof, deferred_proofs)?;
113107
if kind == SP1ProofMode::Compressed {
114-
return Ok(SP1ProofWithPublicValues::new(
108+
let proof_with_pv = SP1ProofWithPublicValues::new(
115109
SP1Proof::Compressed(Box::new(reduce_proof)),
116110
public_values,
117111
self.version().to_string(),
118-
));
112+
);
113+
return Ok((proof_with_pv, cycles));
119114
}
120115

121116
// Generate the shrink proof.
@@ -134,11 +129,12 @@ impl Prover<CpuProverComponents> for CudaProver {
134129
try_install_circuit_artifacts("plonk")
135130
};
136131
let proof = self.cpu_prover.wrap_plonk_bn254(outer_proof, &plonk_bn254_artifacts);
137-
return Ok(SP1ProofWithPublicValues::new(
132+
let proof_with_pv = SP1ProofWithPublicValues::new(
138133
SP1Proof::Plonk(proof),
139134
public_values,
140135
self.version().to_string(),
141-
));
136+
);
137+
return Ok((proof_with_pv, cycles));
142138
} else if kind == SP1ProofMode::Groth16 {
143139
let groth16_bn254_artifacts = if sp1_prover::build::sp1_dev_mode() {
144140
sp1_prover::build::try_build_groth16_bn254_artifacts_dev(
@@ -150,17 +146,38 @@ impl Prover<CpuProverComponents> for CudaProver {
150146
};
151147

152148
let proof = self.cpu_prover.wrap_groth16_bn254(outer_proof, &groth16_bn254_artifacts);
153-
return Ok(SP1ProofWithPublicValues::new(
149+
let proof_with_pv = SP1ProofWithPublicValues::new(
154150
SP1Proof::Groth16(proof),
155151
public_values,
156152
self.version().to_string(),
157-
));
153+
);
154+
return Ok((proof_with_pv, cycles));
158155
}
159156

160157
unreachable!()
161158
}
162159
}
163160

161+
impl Prover<CpuProverComponents> for CudaProver {
162+
fn setup(&self, elf: &[u8]) -> (SP1ProvingKey, SP1VerifyingKey) {
163+
let (pk, vk) = self.cuda_prover.setup(elf).unwrap();
164+
(pk, vk)
165+
}
166+
167+
fn inner(&self) -> &SP1Prover<CpuProverComponents> {
168+
&self.cpu_prover
169+
}
170+
171+
fn prove(
172+
&self,
173+
pk: &SP1ProvingKey,
174+
stdin: &SP1Stdin,
175+
kind: SP1ProofMode,
176+
) -> Result<SP1ProofWithPublicValues> {
177+
self.prove_with_report(pk, stdin, kind).map(|(p, _)| p)
178+
}
179+
}
180+
164181
impl Default for CudaProver {
165182
fn default() -> Self {
166183
Self::new(SP1Prover::new(), None)

0 commit comments

Comments
 (0)