* ok wgpu runs hello world * toy hasher * separate wgsl file * kinda poseidon2 * test vectors * closer * a bit of debug * closer * sort of almost * fixed gf_mul * merge gf_mul back into mining, clean up tests * fix bytes_to_field_elements * linear layer fixed * maybe better? * mds tests * cleanup debug output * found gf_mul bug * fixed gf_mul bug * efficient sbox again * mds matches * cleanup * test internal layer * cleaner * external linear passes * external layer tests * fixed the constants * moar tests * more cleaning * actually test just internal * fairly clean tests now * removed another pointless test * more cleanup * gf_from_const tests * testing * fixed permutations * double hash tests, but they fail * moar tests! * hash-twice works, thanks Gemini 3 Pro! * gpu runs but doesn't mine * better logging * lock workers to gpu * send target to gpu not difficulty * fix verify_nonce * double hash failures * double hash matches * tests pass and it mines now * fix benches * a bit faster now * improved logging * fix benches * simplified gpu code * further simplification * a bit simpler * slight simplification * a bit faster * dynamic thread allocation and work coarsening * more benching * faster * faster * faster * clean up documentation * a bit faster * simplify * simplify * optimized mds * almost par with cpu now * fmt * clippy * support multiple gpus * clippy * unused * fixed some logs --------- Co-authored-by: Nikolaus Heger <nheger@gmail.com>
57 lines
1.8 KiB
Rust
57 lines
1.8 KiB
Rust
use criterion::{black_box, criterion_group, criterion_main, Criterion};
|
|
use engine_cpu::{FastCpuEngine, MinerEngine, Range};
|
|
use pow_core::{hash_from_nonce, JobContext};
|
|
use primitive_types::U512;
|
|
use rand::RngCore;
|
|
use std::sync::atomic::AtomicBool;
|
|
|
|
fn bench_cpu_fast_engine(c: &mut Criterion) {
|
|
// Create the engine
|
|
let engine = FastCpuEngine::new();
|
|
let cancel_flag = AtomicBool::new(false);
|
|
|
|
let large_range = Range {
|
|
start: U512::from(0u64),
|
|
end: U512::from(100000u64), // 100,000 nonces
|
|
};
|
|
|
|
c.bench_function("cpu_fast_large_range", |b| {
|
|
b.iter(|| {
|
|
let mut header = [0u8; 32];
|
|
rand::thread_rng().fill_bytes(&mut header);
|
|
let difficulty = U512::from(10_000_000u64);
|
|
let ctx = JobContext::new(header, difficulty);
|
|
|
|
let result = engine.search_range(
|
|
black_box(&ctx),
|
|
black_box(large_range.clone()),
|
|
black_box(&cancel_flag),
|
|
);
|
|
black_box(result)
|
|
})
|
|
});
|
|
}
|
|
|
|
fn bench_hash_from_nonce(c: &mut Criterion) {
|
|
// Create a test job context
|
|
let mut header = [0u8; 32];
|
|
rand::thread_rng().fill_bytes(&mut header);
|
|
let difficulty = U512::from(1000u64);
|
|
let ctx = JobContext::new(header, difficulty);
|
|
|
|
// Create some test nonce values
|
|
let test_nonce_values: Vec<U512> = (0..100).map(|i| U512::from(1000u64 + i)).collect();
|
|
|
|
c.bench_function("hash_from_nonce_single", |b| {
|
|
let mut i = 0;
|
|
b.iter(|| {
|
|
let nonce = test_nonce_values[i % test_nonce_values.len()];
|
|
i += 1;
|
|
let hash = hash_from_nonce(black_box(&ctx), black_box(nonce));
|
|
black_box(hash)
|
|
})
|
|
});
|
|
}
|
|
criterion_group!(benches, bench_cpu_fast_engine, bench_hash_from_nonce);
|
|
criterion_main!(benches);
|