pub struct RnsBatch {
pub data: Vec<u64>,
pub batch_size: usize,
pub channels: Channels,
}Expand description
A batch of RNS values in a flat, backend-agnostic buffer.
Fields§
§data: Vec<u64>Flat row-major residues: length batch_size * channels.len().
batch_size: usizeNumber of items B.
channels: ChannelsThe K channels shared by every item.
Implementations§
Source§impl RnsBatch
impl RnsBatch
Sourcepub fn new(batch_size: usize, channels: Channels) -> Self
pub fn new(batch_size: usize, channels: Channels) -> Self
Allocate a zeroed batch (alias of RnsBatch::zeros).
Sourcepub fn zeros(batch_size: usize, channels: Channels) -> Self
pub fn zeros(batch_size: usize, channels: Channels) -> Self
Allocate a batch with all residues set to zero.
Sourcepub fn channels_len(&self) -> usize
pub fn channels_len(&self) -> usize
Number of channels K.
Sourcepub fn from_rns_ints(items: &[RnsInt]) -> Self
pub fn from_rns_ints(items: &[RnsInt]) -> Self
Pack a slice of RnsInt values into a batch.
Panics if items is empty (no channels to infer) or if the items do not
all share the same channels.
Examples found in repository?
examples/benchmark_backends.rs (line 41)
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}Sourcepub fn to_rns_ints(&self) -> Vec<RnsInt>
pub fn to_rns_ints(&self) -> Vec<RnsInt>
Unpack the batch back into individual RnsInt values.
Sourcepub fn as_u32_bytes(&self) -> Vec<u8> ⓘ
pub fn as_u32_bytes(&self) -> Vec<u8> ⓘ
Pack for GPU upload: residues as little-endian u32 bytes.
Moduli are chosen <= 2^31 so every residue fits in a u32. The cast to
bytes is zero-copy via bytemuck.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for RnsBatch
impl RefUnwindSafe for RnsBatch
impl Send for RnsBatch
impl Sync for RnsBatch
impl Unpin for RnsBatch
impl UnsafeUnpin for RnsBatch
impl UnwindSafe for RnsBatch
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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