#![cfg(feature = "parallel")]
use std::mem::MaybeUninit;
use strided_basic::execution::parallel_map_reduce;
use strided_basic::{copy_into_uninit, Exec, Pool, StridedArray, StridedViewMut};
const ROWS: usize = 257;
const COLS: usize = 257;
const _: () = assert!(ROWS * COLS > (1 << 15));
#[test]
fn serial_exec_never_initializes_the_global_pool() {
let source = StridedArray::<f64>::from_fn_col_major(&[ROWS, COLS], |index| {
(index[0] * COLS + index[1]) as f64
});
let transposed = source.view().permute(&[1, 0]).unwrap();
let mut storage = vec![MaybeUninit::<f64>::uninit(); ROWS * COLS];
let mut dest =
StridedViewMut::new(&mut storage, &[COLS, ROWS], &[1, COLS as isize], 0).unwrap();
copy_into_uninit(&mut dest, &transposed, Exec::serial()).unwrap();
let sum = parallel_map_reduce(
0..10_000usize,
Exec::serial(),
&|range| range.sum::<usize>(),
&|a, b| a + b,
);
assert_eq!(sum, (0..10_000usize).sum::<usize>());
let pool = Pool::builder().threads(4).build().unwrap();
let pooled_sum = parallel_map_reduce(
0..10_000usize,
Exec::new(&pool, 4).unwrap(),
&|range| range.sum::<usize>(),
&|a, b| a + b,
);
assert_eq!(pooled_sum, sum);
for i in 0..COLS {
for j in 0..ROWS {
let got = unsafe { storage[i + j * COLS].assume_init() };
assert_eq!(got, source.get(&[j, i]), "mismatch at [{i}, {j}]");
}
}
assert!(
threadteam::ledger::global_pool_unstarted(),
"the serial token started the process-global pool"
);
}