scatter_read/
scatter_read.rs

1use dma_rs::Dma;
2use std::time::Instant;
3
4fn main() -> Result<(), Box<dyn std::error::Error>> {
5    let dma = Dma::new("fpga://algo=0")?;
6    let process = dma.attach("explorer.exe")?;
7
8    let modules = process.list_modules()?;
9    let kernel32 = modules.iter()
10        .find(|m| m.name.eq_ignore_ascii_case("kernel32.dll"))
11        .ok_or("kernel32.dll not found")?;
12
13    let base = kernel32.base;
14    let num_reads = 1000;
15
16    let start = Instant::now();
17    for i in 0..num_reads {
18        let _: u32 = process.read(base + i * 0x1000)?;
19    }
20    let normal_time = start.elapsed();
21
22    let start = Instant::now();
23    let mut scatter = process.scatter()?;
24
25    for i in 0..num_reads {
26        scatter.prepare_read(base + i * 0x1000, 4);
27    }
28
29    scatter.execute()?;
30
31    for i in 0..num_reads {
32        let _: u32 = scatter.read_as(base + i * 0x1000)?;
33    }
34    let scatter_time = start.elapsed();
35
36    println!("Normal reads ({} iterations): {:?}", num_reads, normal_time);
37    println!("Scatter reads ({} iterations): {:?}", num_reads, scatter_time);
38    println!("Speedup: {:.2}x", normal_time.as_secs_f64() / scatter_time.as_secs_f64());
39
40    Ok(())
41}