@@ -77,32 +77,26 @@ impl CudaProver {
77
77
pub fn prove < ' a > ( & ' a self , pk : & ' a SP1ProvingKey , stdin : & ' a SP1Stdin ) -> CudaProveBuilder < ' a > {
78
78
CudaProveBuilder { prover : self , mode : SP1ProofMode :: Core , pk, stdin : stdin. clone ( ) }
79
79
}
80
- }
81
80
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 (
93
85
& self ,
94
86
pk : & SP1ProvingKey ,
95
87
stdin : & SP1Stdin ,
96
88
kind : SP1ProofMode ,
97
- ) -> Result < SP1ProofWithPublicValues > {
89
+ ) -> Result < ( SP1ProofWithPublicValues , u64 ) > {
98
90
// Generate the core proof.
99
91
let proof = self . cuda_prover . prove_core ( stdin) ?;
92
+ let cycles = proof. cycles ;
100
93
if kind == SP1ProofMode :: Core {
101
- return Ok ( SP1ProofWithPublicValues :: new (
94
+ let proof_with_pv = SP1ProofWithPublicValues :: new (
102
95
SP1Proof :: Core ( proof. proof . 0 ) ,
103
96
proof. public_values ,
104
97
self . version ( ) . to_string ( ) ,
105
- ) ) ;
98
+ ) ;
99
+ return Ok ( ( proof_with_pv, cycles) ) ;
106
100
}
107
101
108
102
// Generate the compressed proof.
@@ -111,11 +105,12 @@ impl Prover<CpuProverComponents> for CudaProver {
111
105
let public_values = proof. public_values . clone ( ) ;
112
106
let reduce_proof = self . cuda_prover . compress ( & pk. vk , proof, deferred_proofs) ?;
113
107
if kind == SP1ProofMode :: Compressed {
114
- return Ok ( SP1ProofWithPublicValues :: new (
108
+ let proof_with_pv = SP1ProofWithPublicValues :: new (
115
109
SP1Proof :: Compressed ( Box :: new ( reduce_proof) ) ,
116
110
public_values,
117
111
self . version ( ) . to_string ( ) ,
118
- ) ) ;
112
+ ) ;
113
+ return Ok ( ( proof_with_pv, cycles) ) ;
119
114
}
120
115
121
116
// Generate the shrink proof.
@@ -134,11 +129,12 @@ impl Prover<CpuProverComponents> for CudaProver {
134
129
try_install_circuit_artifacts ( "plonk" )
135
130
} ;
136
131
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 (
138
133
SP1Proof :: Plonk ( proof) ,
139
134
public_values,
140
135
self . version ( ) . to_string ( ) ,
141
- ) ) ;
136
+ ) ;
137
+ return Ok ( ( proof_with_pv, cycles) ) ;
142
138
} else if kind == SP1ProofMode :: Groth16 {
143
139
let groth16_bn254_artifacts = if sp1_prover:: build:: sp1_dev_mode ( ) {
144
140
sp1_prover:: build:: try_build_groth16_bn254_artifacts_dev (
@@ -150,17 +146,38 @@ impl Prover<CpuProverComponents> for CudaProver {
150
146
} ;
151
147
152
148
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 (
154
150
SP1Proof :: Groth16 ( proof) ,
155
151
public_values,
156
152
self . version ( ) . to_string ( ) ,
157
- ) ) ;
153
+ ) ;
154
+ return Ok ( ( proof_with_pv, cycles) ) ;
158
155
}
159
156
160
157
unreachable ! ( )
161
158
}
162
159
}
163
160
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
+
164
181
impl Default for CudaProver {
165
182
fn default ( ) -> Self {
166
183
Self :: new ( SP1Prover :: new ( ) , None )
0 commit comments