pub struct GpuBackend { /* private fields */ }Expand description
GPU backend holding a device, queue, and the pre-built compute pipelines.
Implementations§
Source§impl GpuBackend
impl GpuBackend
Sourcepub fn try_init() -> Result<Self, GpuError>
pub fn try_init() -> Result<Self, GpuError>
Probe for a GPU and build the pipelines. Blocks on async init.
Sourcepub fn adapter_name(&self) -> &str
pub fn adapter_name(&self) -> &str
Human-readable adapter name (e.g. “NVIDIA GeForce RTX 4080”).
Examples found in repository?
examples/benchmark_backends.rs (line 31)
22fn main() {
23 let exec = executor();
24 let ch = Channels::standard(32);
25 let has_gpu = exec.gpu().is_some();
26
27 println!("== adele-ring :: backend benchmark (32 channels) ==");
28 println!(
29 "GPU available: {}\n",
30 if has_gpu {
31 exec.gpu().map(|g| g.adapter_name().to_string()).unwrap_or_default()
32 } else {
33 "no (CPU-only)".to_string()
34 }
35 );
36
37 println!("{:>10} | {:>14} | {:>12} | winner", "batch_size", "cpu_rayon_us", "gpu_us");
38 println!("{}", "-".repeat(56));
39
40 for &size in &[1usize, 16, 128, 1024, 16_384, 65_536] {
41 let a = RnsBatch::from_rns_ints(&vec![RnsInt::from_i64(123, ch.clone()); size]);
42 let b = RnsBatch::from_rns_ints(&vec![RnsInt::from_i64(456, ch.clone()); size]);
43
44 let iters = if size <= 128 { 2000 } else { 100 };
45 let cpu_us = time_backend(|| exec.cpu().batch_rns_add(&a, &b), iters);
46
47 let (gpu_str, winner) = if let Some(gpu) = exec.gpu() {
48 let gpu_us = time_backend(|| gpu.batch_rns_add(&a, &b), iters);
49 let w = if cpu_us <= gpu_us { "CPU" } else { "GPU" };
50 (format!("{gpu_us:>12.2}"), w)
51 } else {
52 (" n/a".to_string(), "CPU")
53 };
54
55 println!("{size:>10} | {cpu_us:>14.2} | {gpu_str} | {winner}");
56 }
57
58 println!(
59 "\nNote: CPU wins for small batches (GPU upload/dispatch overhead ~100us);\n\
60 GPU pulls ahead once the batch is large enough to amortize that fixed cost."
61 );
62}Trait Implementations§
Source§impl ArithmeticBackend for GpuBackend
impl ArithmeticBackend for GpuBackend
Source§fn batch_rns_add(&self, a: &RnsBatch, b: &RnsBatch) -> RnsBatch
fn batch_rns_add(&self, a: &RnsBatch, b: &RnsBatch) -> RnsBatch
Elementwise add:
result[b][c] = (a[b][c] + b[b][c]) % m[c].Source§fn batch_rns_mul(&self, a: &RnsBatch, b: &RnsBatch) -> RnsBatch
fn batch_rns_mul(&self, a: &RnsBatch, b: &RnsBatch) -> RnsBatch
Elementwise multiply:
result[b][c] = (a[b][c] * b[b][c]) % m[c].Auto Trait Implementations§
impl !RefUnwindSafe for GpuBackend
impl !UnwindSafe for GpuBackend
impl Freeze for GpuBackend
impl Send for GpuBackend
impl Sync for GpuBackend
impl Unpin for GpuBackend
impl UnsafeUnpin for GpuBackend
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more