mirror of
https://github.com/codex-storage/constantine.git
synced 2025-01-19 15:23:06 +00:00
b7687ddc4a
* Accelerate eth_evm_modexp by 25x by dividing input size by 8 (scales quadratically) * instant exponentiation by power of 2 depending on trailing zeroes * improve bench report * rename * rewrite the pow2k even/trailingZero accel * eth_evm_modexp: remove leftover TimeEffect
69 lines
2.7 KiB
Nim
69 lines
2.7 KiB
Nim
import
|
|
../constantine/ethereum_evm_precompiles,
|
|
./platforms, ./bench_blueprint,
|
|
|
|
../constantine/platforms/codecs
|
|
|
|
proc report(op: string, elapsedNs: int64, elapsedCycles: int64, iters: int) =
|
|
let ns = elapsedNs div iters
|
|
let cycles = elapsedCycles div iters
|
|
let throughput = 1e9 / float64(ns)
|
|
when SupportsGetTicks:
|
|
echo &"{op:<45} {throughput:>15.3f} ops/s {ns:>16} ns/op {cycles:>12} CPU cycles (approx)"
|
|
else:
|
|
echo &"{op:<45} {throughput:>15.3f} ops/s {ns:>16} ns/op"
|
|
|
|
template bench(fnCall: untyped, ticks, ns: var int64): untyped =
|
|
block:
|
|
let startTime = getMonotime()
|
|
let startClock = getTicks()
|
|
fnCall
|
|
let stopClock = getTicks()
|
|
let stopTime = getMonotime()
|
|
|
|
ticks += stopClock - startClock
|
|
ns += inNanoseconds(stopTime-startTime)
|
|
|
|
proc main() =
|
|
|
|
let input = [
|
|
# Length of base (32)
|
|
(uint8)0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
|
|
|
|
# Length of exponent (32)
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
|
|
|
|
# Length of modulus (32)
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
|
|
|
|
# Base (96064778440517843452771003943013638877275214272712651271554889917016327417616)
|
|
0xd4, 0x62, 0xbc, 0xde, 0x8f, 0x57, 0xb0, 0x4a, 0x3f, 0xe1, 0x16, 0xc8, 0x12, 0x8c, 0x44, 0x34,
|
|
0xcf, 0x10, 0x25, 0x2e, 0x48, 0xa3, 0xcc, 0x0d, 0x28, 0xdf, 0x2b, 0xac, 0x4a, 0x8d, 0x6f, 0x10,
|
|
|
|
# Exponent (96064778440517843452771003943013638877275214272712651271554889917016327417616)
|
|
0xd4, 0x62, 0xbc, 0xde, 0x8f, 0x57, 0xb0, 0x4a, 0x3f, 0xe1, 0x16, 0xc8, 0x12, 0x8c, 0x44, 0x34,
|
|
0xcf, 0x10, 0x25, 0x2e, 0x48, 0xa3, 0xcc, 0x0d, 0x28, 0xdf, 0x2b, 0xac, 0x4a, 0x8d, 0x6f, 0x10,
|
|
|
|
# Modulus (57896044618658097711785492504343953926634992332820282019728792003956564819968)
|
|
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
]
|
|
|
|
var r = newSeq[byte](32)
|
|
var ticks, nanoseconds: int64
|
|
|
|
const Iters = 22058
|
|
|
|
for i in 0 ..< Iters:
|
|
bench(
|
|
(let _ = r.eth_evm_modexp(input)),
|
|
ticks, nanoseconds)
|
|
|
|
report("EVM Modexp", nanoseconds, ticks, Iters)
|
|
echo "Total time: ", nanoseconds.float64 / 1e6, " ms"
|
|
|
|
main() |