pub struct ThreadPool { /* private fields */ }parallel only.Expand description
A bounded Rayon pool that PRISM-Q runs inside, leaving the process-wide pool untouched.
Simulation entry points size the global Rayon pool on first use, which an
embedding application may not want. Work run through ThreadPool::install
uses this pool instead, and the global pool is neither built nor resized, so
an application that installed its own keeps it.
Pool width is part of what a result depends on. Dense unitary evolution, seeded terminal sampling, and the stabilizer tableau are bitwise at any width, parallel reductions move by about 1e-12, and compiled (BTS) shot payloads differ between widths because the batched sampler splits shots by pool width. A narrower pool is therefore not a slower route to the same bytes for every result; the per-path contract is the determinism section of the threading architecture page.
§Examples
use prism_q::{ThreadPool, run_qasm};
let qasm = r#"
OPENQASM 3.0;
include "stdgates.inc";
qubit[2] q;
h q[0];
cx q[0], q[1];
"#;
let pool = ThreadPool::with_threads(2).expect("build pool");
let result = pool.install(|| run_qasm(qasm, 42)).expect("simulation");
let probs = result.probabilities.expect("no probabilities").to_vec();
assert!((probs[0] - 0.5).abs() < 1e-10);Implementations§
Source§impl ThreadPool
impl ThreadPool
Sourcepub fn with_threads(threads: usize) -> Result<Self>
pub fn with_threads(threads: usize) -> Result<Self>
Build a pool of threads workers, or of the Rayon default width when
threads is 0.
§Errors
Returns PrismError::InvalidParameter when the operating system
refuses to spawn the workers.
Sourcepub fn install<T: Send>(&self, op: impl FnOnce() -> T + Send) -> T
pub fn install<T: Send>(&self, op: impl FnOnce() -> T + Send) -> T
Run op on this pool, blocking the calling thread until it returns.
Every Rayon kernel PRISM-Q reaches from op runs on these workers. Work
that escapes op, such as a simulation handed to another thread, falls
back to the global pool.
Sourcepub fn num_threads(&self) -> usize
pub fn num_threads(&self) -> usize
Worker count, which is what rayon::current_num_threads reports inside
install. Resolves the default width taken by
with_threads(0).
Auto Trait Implementations§
impl !RefUnwindSafe for ThreadPool
impl !UnwindSafe for ThreadPool
impl Freeze for ThreadPool
impl Send for ThreadPool
impl Sync for ThreadPool
impl Unpin for ThreadPool
impl UnsafeUnpin for ThreadPool
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
impl<T, U> Imply<T> for U
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> ⓘ
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> ⓘ
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