Repository navigation
Add new gas metering method: mutable global + local gas function - #34
Conversation
… the gas_left global to its value at their very start
08fd288 to
4389779
Compare
|
new benches is WIP (coming soon) |
gas functiongas function
e7b35c0 to
1290935
Compare
|
With new This problem:
will be addressed in a follow-up PR. |
gas functiongas function
Benchesversion tested: 6f43fbc with
|
| fixture | host func | mut global | perf |
|---|---|---|---|
| coremark | 20.81 s | 20.20 s | +3% |
| recursive_ok | 367 µs | 585 µs | -37% |
| fibonacci_recursive | 9.15 µs | 13.56 µs | -33% |
| factorial_recursive | 1.50 µs | 1.98 µs | -24% |
| count_until | 5.03 ms | 8.13 ms | -38% |
| memory_vec_add | 6.21 ms | 8.45 ms | -27% |
| tiny_keccak | 925 µs | 1080 µs | -14% |
| global_bump | 3.79 ms | 7.03 ms | -46% |
db2d4e5 to
5084aa4
Compare
5084aa4 to
66e8833
Compare
…aritytech#34) * fix misprints in doc comments * added global gas tracker variable and local gas fn * all exported functions of the module to accept a new param and to set the gas_left global to its value at their very start * make module support both gas metering methods * tests fixed for the old metering method * better naming * MutableGlobal metering method implemented, tests for the old method pass * gas_metering::tests updated and pass * all tests udpdated and pass * emacs backup files to .gitignore * docs updated * clippy fix * iff = if and only if * more clippy * docs misprints fixes * refactored to have Backend trait and two implementations in separate sub-modules * docs updated * fixed old benches (updating them is coming next) * added bench for an instrumented wasm-coremark * updated benches: added them for both gas_metering instrumentations * benches contest first ver * added debug prints to the bench * refactored to better fit frontend-backend pattern * docs update * updated benches * design updated on feedback * re-structured sub-modules re-structured sub-modules & updated docs * docs improved * addressed latest feedback comments * re-writed the local gas function * coremark benches show ~20% performance improvement * fix ci: test + clippy * save before re-factoring prepare_in_wasm() * bare_call_16 shows 16% worse perf * + fibonacci recursive bench * refactored benchmarks * + factorial recursive bench * benches on wasmi fixtures show no perf improvement, coremark runs ~20% faster being instrumented with mutable_global gas metering * charge gas for local gas func isntructions execution * replaced benchmark which requires multi_value feature * save: optimized gas func a bit (benches work, fixture tests fail) * 1033% overhead on many_blocks.wasm when mut_global gas_metering together with stack_height * size overhead test for both gas metering methods + stack limiter * added more benches * improved print_size_overhead test * test for comparing size overheads of two gas_metering injectors * before optimization: benches + size overhead * optimization try-1: inline part of gas func instructions: +benches +size overheads * optimization try-2: inline hot path of gas fn: +benches +size overheads * opt try-3: count for gas fn cost on the caller side: +benches +size overhead * revert to initial version but with static gas fn cost on the caller side: +benches +sizes * tests fixed * use newest wasmi 0.20: +benches +docs updated * use if-else block instead of Return: +benches * fix tests * clippy fix * addressed review comments * Update changelog Co-authored-by: Alexander Theißen <alex.theissen@me.com>
Solves #11
In addition to method used beforehand (i.e. injection of calls to an imported
gasfunction into metering blocks), this new method now available too, which:gasfunction which subtracts the gas spent from the global, and dropsunreachableif out of gas.This new method should make the resulting module more efficient in terms of execution time, as invoking an imported
gashost function every metering block adds an overhead. Synchronization between the global and the runtime should be implemented on the execution engine side.