From e4f45bfd3b25058ac2c489d0d5e94ee9b1d3d346 Mon Sep 17 00:00:00 2001 From: sakridge Date: Tue, 13 Oct 2020 12:16:27 -0700 Subject: [PATCH] Bpf speed debug and tuner program (#12845) --- programs/bpf/benches/bpf_loader.rs | 21 ++++++++++++++++++++- programs/bpf/c/src/tuner/tuner.c | 15 +++++++++++---- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/programs/bpf/benches/bpf_loader.rs b/programs/bpf/benches/bpf_loader.rs index 6d99366208..dfe3e8ba0a 100644 --- a/programs/bpf/benches/bpf_loader.rs +++ b/programs/bpf/benches/bpf_loader.rs @@ -210,7 +210,26 @@ fn bench_instruction_count_tuner(_bencher: &mut Bencher) { let instruction_meter = MockInstructionMeter { compute_meter }; let mut measure = Measure::start("tune"); - let _ = vm.execute_program_metered(&mut [0], &[], &[], instruction_meter.clone()); + + let accounts = [RefCell::new(Account::new(1, 10000001, &Pubkey::new_rand()))]; + let keys = [Pubkey::new_rand()]; + let keyed_accounts: Vec<_> = keys + .iter() + .zip(&accounts) + .map(|(key, account)| solana_sdk::account::KeyedAccount::new(&key, false, &account)) + .collect(); + let instruction_data = vec![0u8]; + + // Serialize account data + let mut serialized = solana_bpf_loader_program::serialization::serialize_parameters( + &bpf_loader::id(), + &Pubkey::new_rand(), + &keyed_accounts, + &instruction_data, + ) + .unwrap(); + + let r = vm.execute_program_metered(&mut serialized, &[], &[], instruction_meter.clone()); measure.stop(); assert_eq!( 0, diff --git a/programs/bpf/c/src/tuner/tuner.c b/programs/bpf/c/src/tuner/tuner.c index 2a82f30741..d5975cc33d 100644 --- a/programs/bpf/c/src/tuner/tuner.c +++ b/programs/bpf/c/src/tuner/tuner.c @@ -8,15 +8,22 @@ #include +#define NUM_KA 1 + extern uint64_t entrypoint(const uint8_t *input) { - uint8_t *val = (uint8_t *)input; + SolAccountInfo ka[NUM_KA]; + SolParameters params = (SolParameters) { .ka = ka }; + if (!sol_deserialize(input, ¶ms, SOL_ARRAY_SIZE(ka))) { + return ERROR_INVALID_ARGUMENT; + } + uint8_t *val = (uint8_t *)ka[0].data; + size_t current = 1; for (uint64_t i = 0; i < UINT64_MAX; i++) { // Uncomment for raw compute { - if (*val != 0) { - *val = *val + 1; - } + *val ^= val[current % 10000001] + 13181312; + current *= 12345678; } // // Uncomment for SHA256 syscall