Skip to content

Commit 594177f

Browse files
committed
Call execution_stats from customize
1 parent 06b6528 commit 594177f

File tree

4 files changed

+92
-59
lines changed

4 files changed

+92
-59
lines changed

cli-openvm/src/main.rs

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,14 @@ fn run_command(command: Commands) {
146146
stdin_from(input),
147147
);
148148
let pgo_config = pgo_config(pgo, max_columns, execution_profile);
149-
let program =
150-
powdr_openvm::compile_guest(&guest, guest_opts, powdr_config, pgo_config).unwrap();
149+
let program = powdr_openvm::compile_guest(
150+
&guest,
151+
guest_opts,
152+
powdr_config,
153+
pgo_config,
154+
stdin_from(input),
155+
)
156+
.unwrap();
151157
write_program_to_file(program, &format!("{guest}_compiled.cbor")).unwrap();
152158
}
153159

@@ -172,9 +178,14 @@ fn run_command(command: Commands) {
172178
);
173179
let pgo_config = pgo_config(pgo, max_columns, execution_profile);
174180
let compile_and_exec = || {
175-
let program =
176-
powdr_openvm::compile_guest(&guest, guest_opts, powdr_config, pgo_config)
177-
.unwrap();
181+
let program = powdr_openvm::compile_guest(
182+
&guest,
183+
guest_opts,
184+
powdr_config,
185+
pgo_config,
186+
stdin_from(input),
187+
)
188+
.unwrap();
178189
powdr_openvm::execute(program, stdin_from(input)).unwrap();
179190
};
180191
if let Some(metrics_path) = metrics {
@@ -203,17 +214,31 @@ fn run_command(command: Commands) {
203214
if let Some(apc_candidates_dir) = &apc_candidates_dir {
204215
powdr_config = powdr_config.with_apc_candidates_dir(apc_candidates_dir);
205216
}
217+
let inputs = stdin_from(input);
206218
let execution_profile = powdr_openvm::execution_profile_from_guest(
207219
&guest,
208220
guest_opts.clone(),
209-
stdin_from(input),
221+
inputs.clone(),
210222
);
211223
let pgo_config = pgo_config(pgo, max_columns, execution_profile);
212224
let compile_and_prove = || {
213-
let program =
214-
powdr_openvm::compile_guest(&guest, guest_opts, powdr_config, pgo_config)
215-
.unwrap();
216-
powdr_openvm::prove(&program, mock, recursion, stdin_from(input), None, apc_candidates_dir).unwrap()
225+
let program = powdr_openvm::compile_guest(
226+
&guest,
227+
guest_opts,
228+
powdr_config,
229+
pgo_config,
230+
inputs.clone(),
231+
)
232+
.unwrap();
233+
powdr_openvm::prove(
234+
&program,
235+
mock,
236+
recursion,
237+
inputs.clone(),
238+
None,
239+
apc_candidates_dir,
240+
)
241+
.unwrap()
217242
};
218243
if let Some(metrics_path) = metrics {
219244
run_with_metric_collection_to_file(

openvm/src/customize_exe.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,13 @@ use crate::memory_bus_interaction::OpenVmMemoryBusInteraction;
1313
use crate::opcode::branch_opcodes_bigint_set;
1414
use crate::powdr_extension::chip::PowdrAir;
1515
use crate::utils::UnsupportedOpenVmReferenceError;
16-
use crate::OriginalCompiledProgram;
16+
use crate::{execution_stats, OriginalCompiledProgram};
1717
use crate::{CompiledProgram, SpecializedConfig};
1818
use itertools::Itertools;
1919
use openvm_instructions::instruction::Instruction as OpenVmInstruction;
2020
use openvm_instructions::program::{Program as OpenVmProgram, DEFAULT_PC_STEP};
2121
use openvm_instructions::VmOpcode;
22+
use openvm_sdk::StdIn;
2223
use openvm_stark_backend::{
2324
interaction::SymbolicInteraction,
2425
p3_field::{FieldAlgebra, PrimeField32},
@@ -147,6 +148,7 @@ pub fn customize<'a, P: PgoAdapter<Adapter = BabyBearOpenVmApcAdapter<'a>>>(
147148
}: OriginalCompiledProgram,
148149
config: PowdrConfig,
149150
pgo: P,
151+
inputs: StdIn,
150152
) -> CompiledProgram {
151153
let labels = elf.text_labels();
152154
let debug_info = elf.debug_info();
@@ -217,6 +219,18 @@ pub fn customize<'a, P: PgoAdapter<Adapter = BabyBearOpenVmApcAdapter<'a>>>(
217219
})
218220
.collect();
219221

222+
execution_stats(
223+
exe.clone(),
224+
SpecializedConfig::new(
225+
original_config.clone(),
226+
vec![],
227+
config.degree_bound.identities,
228+
),
229+
inputs,
230+
&blocks,
231+
)
232+
.unwrap();
233+
220234
let start = std::time::Instant::now();
221235
let apcs = pgo.filter_blocks_and_create_apcs_with_pgo(blocks, &config, vm_config, labels);
222236
metrics::gauge!("total_apc_gen_time_ms").set(start.elapsed().as_millis() as f64);

openvm/src/execution_stats.rs

Lines changed: 9 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55

66
use eyre::Result;
77
use itertools::Itertools;
8-
use openvm_circuit::arch::execution_mode::metered::segment_ctx::SegmentationLimits;
98
use openvm_circuit::arch::execution_mode::Segment;
109
use openvm_circuit::arch::{PreflightExecutionOutput, VirtualMachine, VmCircuitConfig, VmInstance};
10+
use openvm_instructions::exe::VmExe;
1111
use openvm_sdk::prover::vm::new_local_prover;
1212
use openvm_sdk::{
1313
config::{AppConfig, DEFAULT_APP_LOG_BLOWUP},
@@ -18,14 +18,15 @@ use openvm_stark_sdk::config::baby_bear_poseidon2::BabyBearPermutationEngine;
1818
use openvm_stark_sdk::config::FriParameters;
1919
use openvm_stark_sdk::openvm_stark_backend::p3_field::PrimeField32;
2020
use openvm_stark_sdk::p3_baby_bear::BabyBear;
21+
use powdr_autoprecompiles::blocks::BasicBlock;
2122
use powdr_autoprecompiles::JsonExport;
2223
use std::collections::hash_map::Entry;
2324
use std::collections::BTreeMap;
24-
use std::{collections::HashMap, path::PathBuf, sync::Arc};
25+
use std::{collections::HashMap, sync::Arc};
2526

2627
#[cfg(not(feature = "cuda"))]
2728
use crate::PowdrSdkCpu;
28-
use crate::{CompiledProgram, SpecializedConfigCpuBuilder};
29+
use crate::{Instr, SpecializedConfig, SpecializedConfigCpuBuilder};
2930
use tracing::info_span;
3031

3132
use std::collections::HashSet;
@@ -80,27 +81,11 @@ where
8081
}
8182

8283
pub fn execution_stats(
83-
program: &CompiledProgram,
84+
exe: Arc<VmExe<BabyBear>>,
85+
vm_config: SpecializedConfig,
8486
inputs: StdIn,
85-
segment_height: Option<usize>, // uses the default height if None
86-
apc_candidates_dir: Option<PathBuf>,
87+
blocks: &[BasicBlock<Instr<BabyBear>>],
8788
) -> Result<(), Box<dyn std::error::Error>> {
88-
let exe = &program.exe;
89-
let mut vm_config = program.vm_config.clone();
90-
91-
// DefaultSegmentationStrategy { max_segment_len: 4194204, max_cells_per_chip_in_segment: 503304480 }
92-
if let Some(segment_height) = segment_height {
93-
vm_config
94-
.sdk
95-
.config_mut()
96-
.sdk
97-
.system
98-
.config
99-
.segmentation_limits =
100-
SegmentationLimits::default().with_max_trace_height(segment_height as u32);
101-
tracing::debug!("Setting max segment len to {}", segment_height);
102-
}
103-
10489
// Set app configuration
10590
let app_fri_params =
10691
FriParameters::standard_with_100_bits_conjectured_security(DEFAULT_APP_LOG_BLOWUP);
@@ -226,23 +211,10 @@ pub fn execution_stats(
226211
}
227212
}
228213

229-
let apc_candidates_dir = apc_candidates_dir.unwrap();
230-
let apc_candiates: powdr_autoprecompiles::pgo::JsonExport = {
231-
let json_str =
232-
std::fs::read_to_string(apc_candidates_dir.join("apc_candidates.json")).unwrap();
233-
serde_json::from_str(&json_str).unwrap()
234-
};
235-
let apcs = apc_candiates.apcs;
236-
237214
// Block ID -> instruction count mapping
238-
let instruction_counts = apcs
215+
let instruction_counts = blocks
239216
.iter()
240-
.map(|apc| {
241-
(
242-
apc.original_block.start_pc,
243-
apc.original_block.statements.len(),
244-
)
245-
})
217+
.map(|block| (block.start_pc, block.statements.len()))
246218
.collect::<HashMap<_, _>>();
247219

248220
// Block ID -> Vec<Vec<Row>>

openvm/src/lib.rs

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,7 @@ pub fn compile_guest(
534534
guest_opts: GuestOptions,
535535
config: PowdrConfig,
536536
pgo_config: PgoConfig,
537+
inputs: StdIn,
537538
) -> Result<CompiledProgram, Box<dyn std::error::Error>> {
538539
let original_program = compile_openvm(guest, guest_opts.clone())?;
539540

@@ -542,7 +543,7 @@ pub fn compile_guest(
542543
tally_opcode_frequency(&pgo_config, &original_program.exe);
543544
}
544545

545-
compile_exe(original_program, config, pgo_config)
546+
compile_exe(original_program, config, pgo_config, inputs)
546547
}
547548

548549
fn instruction_index_to_pc(program: &Program<BabyBear>, idx: usize) -> u64 {
@@ -590,6 +591,7 @@ pub fn compile_exe(
590591
original_program: OriginalCompiledProgram,
591592
config: PowdrConfig,
592593
pgo_config: PgoConfig,
594+
inputs: StdIn,
593595
) -> Result<CompiledProgram, Box<dyn std::error::Error>> {
594596
let compiled = match pgo_config {
595597
PgoConfig::Cell(pgo_data, max_total_columns) => {
@@ -611,14 +613,16 @@ pub fn compile_exe(
611613
pgo_data,
612614
max_total_apc_columns,
613615
),
616+
inputs,
614617
)
615618
}
616619
PgoConfig::Instruction(pgo_data) => customize(
617620
original_program,
618621
config,
619622
InstructionPgo::with_pgo_data(pgo_data),
623+
inputs,
620624
),
621-
PgoConfig::None => customize(original_program, config, NonePgo::default()),
625+
PgoConfig::None => customize(original_program, config, NonePgo::default(), inputs),
622626
};
623627
// Export the compiled program to a PIL file for debugging purposes.
624628
export_pil(
@@ -848,10 +852,8 @@ pub fn prove(
848852
recursion: bool,
849853
inputs: StdIn,
850854
segment_height: Option<usize>, // uses the default height if None
851-
apc_candidates_dir: Option<PathBuf>,
855+
_apc_candidates_dir: Option<PathBuf>,
852856
) -> Result<(), Box<dyn std::error::Error>> {
853-
execution_stats(program, inputs.clone(), segment_height, apc_candidates_dir)?;
854-
855857
let exe = &program.exe;
856858
let mut vm_config = program.vm_config.clone();
857859

@@ -1001,7 +1003,14 @@ mod tests {
10011003
pgo_config: PgoConfig,
10021004
segment_height: Option<usize>,
10031005
) -> Result<(), Box<dyn std::error::Error>> {
1004-
let program = compile_guest(guest, GuestOptions::default(), config, pgo_config).unwrap();
1006+
let program = compile_guest(
1007+
guest,
1008+
GuestOptions::default(),
1009+
config,
1010+
pgo_config,
1011+
stdin.clone(),
1012+
)
1013+
.unwrap();
10051014
prove(&program, mock, recursion, stdin, segment_height, None)
10061015
}
10071016

@@ -1120,8 +1129,14 @@ mod tests {
11201129
let pgo_data = execution_profile_from_guest(GUEST, GuestOptions::default(), stdin.clone());
11211130

11221131
let config = default_powdr_openvm_config(GUEST_APC, GUEST_SKIP_NO_APC_EXECUTED);
1123-
let program =
1124-
compile_guest(GUEST, GuestOptions::default(), config, PgoConfig::None).unwrap();
1132+
let program = compile_guest(
1133+
GUEST,
1134+
GuestOptions::default(),
1135+
config,
1136+
PgoConfig::None,
1137+
stdin.clone(),
1138+
)
1139+
.unwrap();
11251140

11261141
// Assert that all APCs aren't executed
11271142
program
@@ -1170,9 +1185,14 @@ mod tests {
11701185
fn matmul_compile() {
11711186
let guest = "guest-matmul";
11721187
let config = default_powdr_openvm_config(1, 0);
1173-
assert!(
1174-
compile_guest(guest, GuestOptions::default(), config, PgoConfig::default()).is_ok()
1175-
);
1188+
assert!(compile_guest(
1189+
guest,
1190+
GuestOptions::default(),
1191+
config,
1192+
PgoConfig::default(),
1193+
StdIn::default()
1194+
)
1195+
.is_ok());
11761196
}
11771197

11781198
#[test]
@@ -1654,6 +1674,8 @@ mod tests {
16541674
GuestOptions::default(),
16551675
config,
16561676
guest.pgo_config,
1677+
// TODO
1678+
StdIn::default(),
16571679
)
16581680
.unwrap();
16591681

0 commit comments

Comments
 (0)