tenferro-cpu 0.9.0

CPU backend, kernels, provider selection, and CPU resource pools for tenferro.
Documentation
use super::*;

#[test]
fn pooled_engine_runs_operations() {
    let mut engine = crate::test_support::cpu_engine(2).unwrap();
    let result = engine
        .add_read(
            TensorRead::from_tensor(&Tensor::from_typed::<f64>(
                TypedTensor::from_vec_col_major(vec![2], vec![1.0, 2.0]).unwrap(),
            )),
            TensorRead::from_tensor(&Tensor::from_typed::<f64>(
                TypedTensor::from_vec_col_major(vec![2], vec![3.0, 4.0]).unwrap(),
            )),
        )
        .unwrap();
    assert_eq!(get_f64(&result, &[0]), 4.0);
    assert_eq!(get_f64(&result, &[1]), 6.0);
}

#[test]
fn operations_are_called_from_the_caller_thread() {
    let mut engine = crate::test_support::cpu_engine(2).unwrap();
    let lhs = Tensor::from_typed::<f64>(
        TypedTensor::from_vec_col_major(vec![2], vec![1.0_f64, 2.0]).unwrap(),
    );
    let rhs = Tensor::from_typed::<f64>(
        TypedTensor::from_vec_col_major(vec![2], vec![3.0_f64, 4.0]).unwrap(),
    );
    let caller = std::thread::current().id();
    engine
        .add_read(TensorRead::from_tensor(&lhs), TensorRead::from_tensor(&rhs))
        .unwrap();
    engine.neg_read(TensorRead::from_tensor(&lhs)).unwrap();
    engine
        .mul_read(TensorRead::from_tensor(&lhs), TensorRead::from_tensor(&rhs))
        .unwrap();
    engine
        .dot_general_read(
            TensorRead::from_tensor(&lhs),
            TensorRead::from_tensor(&rhs),
            &DotGeneralConfig {
                lhs_contracting_dims: [0].as_slice().into(),
                rhs_contracting_dims: [0].as_slice().into(),
                lhs_batch_dims: [].as_slice().into(),
                rhs_batch_dims: [].as_slice().into(),
            },
        )
        .unwrap();
    assert_eq!(std::thread::current().id(), caller);
}