Skip to content

Commit 5e406fd

Browse files
authored
Optimize shared memory operations (#1167)
* Benchmark for sharedmemory operations Signed-off-by: Ludvig Liljenberg <4257730+ludfjig@users.noreply.github.com> * Optimize shared memory operations Signed-off-by: Ludvig Liljenberg <4257730+ludfjig@users.noreply.github.com> * PR review comments Signed-off-by: Ludvig Liljenberg <4257730+ludfjig@users.noreply.github.com> --------- Signed-off-by: Ludvig Liljenberg <4257730+ludfjig@users.noreply.github.com>
1 parent 6497f12 commit 5e406fd

File tree

2 files changed

+383
-11
lines changed

2 files changed

+383
-11
lines changed

src/hyperlight_host/benches/benchmarks.rs

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,13 @@ use std::sync::{Arc, Barrier, Mutex};
2323
use std::thread;
2424
use std::time::{Duration, Instant};
2525

26-
use criterion::{Criterion, criterion_group, criterion_main};
26+
use criterion::{BenchmarkId, Criterion, Throughput, criterion_group, criterion_main};
2727
use flatbuffers::FlatBufferBuilder;
2828
use hyperlight_common::flatbuffer_wrappers::function_call::{FunctionCall, FunctionCallType};
2929
use hyperlight_common::flatbuffer_wrappers::function_types::{ParameterValue, ReturnType};
3030
use hyperlight_common::flatbuffer_wrappers::util::estimate_flatbuffer_capacity;
3131
use hyperlight_host::GuestBinary;
32+
use hyperlight_host::mem::shared_mem::ExclusiveSharedMemory;
3233
use hyperlight_host::sandbox::{MultiUseSandbox, SandboxConfiguration, UninitializedSandbox};
3334
use hyperlight_testing::sandbox_sizes::{LARGE_HEAP_SIZE, MEDIUM_HEAP_SIZE, SMALL_HEAP_SIZE};
3435
use hyperlight_testing::{c_simple_guest_as_string, simple_guest_as_string};
@@ -492,6 +493,64 @@ fn sample_workloads_benchmark(c: &mut Criterion) {
492493
group.finish();
493494
}
494495

496+
// ============================================================================
497+
// Benchmark Category: Shared Memory Operations
498+
// ============================================================================
499+
500+
fn shared_memory_benchmark(c: &mut Criterion) {
501+
let mut group = c.benchmark_group("shared_memory");
502+
503+
let sizes: &[(usize, &str)] = &[(1024 * 1024, "1MB"), (64 * 1024 * 1024, "64MB")];
504+
505+
// Benchmark fill
506+
for &(size, name) in sizes {
507+
group.throughput(Throughput::Bytes(size as u64));
508+
group.bench_with_input(BenchmarkId::new("fill", name), &size, |b, &size| {
509+
let eshm = ExclusiveSharedMemory::new(size).unwrap();
510+
let (mut hshm, _) = eshm.build();
511+
b.iter(|| {
512+
hshm.fill(0xAB, 0, size).unwrap();
513+
});
514+
});
515+
}
516+
517+
// Benchmark copy_to_slice (read from shared memory)
518+
for &(size, name) in sizes {
519+
group.throughput(Throughput::Bytes(size as u64));
520+
group.bench_with_input(
521+
BenchmarkId::new("copy_to_slice", name),
522+
&size,
523+
|b, &size| {
524+
let eshm = ExclusiveSharedMemory::new(size).unwrap();
525+
let (hshm, _) = eshm.build();
526+
let mut dst = vec![0u8; size];
527+
b.iter(|| {
528+
hshm.copy_to_slice(&mut dst, 0).unwrap();
529+
});
530+
},
531+
);
532+
}
533+
534+
// Benchmark copy_from_slice (write to shared memory)
535+
for &(size, name) in sizes {
536+
group.throughput(Throughput::Bytes(size as u64));
537+
group.bench_with_input(
538+
BenchmarkId::new("copy_from_slice", name),
539+
&size,
540+
|b, &size| {
541+
let eshm = ExclusiveSharedMemory::new(size).unwrap();
542+
let (hshm, _) = eshm.build();
543+
let src = vec![0xCDu8; size];
544+
b.iter(|| {
545+
hshm.copy_from_slice(&src, 0).unwrap();
546+
});
547+
},
548+
);
549+
}
550+
551+
group.finish();
552+
}
553+
495554
criterion_group! {
496555
name = benches;
497556
config = Criterion::default();
@@ -501,6 +560,7 @@ criterion_group! {
501560
snapshots_benchmark,
502561
guest_call_benchmark_large_param,
503562
function_call_serialization_benchmark,
504-
sample_workloads_benchmark
563+
sample_workloads_benchmark,
564+
shared_memory_benchmark
505565
}
506566
criterion_main!(benches);

0 commit comments

Comments
 (0)