redstone-ml 0.0.0

High-performance Machine Learning, Auto-Differentiation and Tensor Algebra crate for Rust
Documentation
use crate::define_binary_op_trait;
use crate::flat_index_generator::FlatIndexGenerator;
use crate::ndarray::collapse_contiguous::collapse_to_uniform_stride;
use crate::{impl_default_trait_for_dtypes, simd_binary_op_specializations};
use paste::paste;
use std::ops::Mul;
use std::ptr::addr_of;

define_binary_op_trait!(BinaryOpMul, Mul, mul, *;
                        i8, i16, i32, i64, i128, isize,
                        u8, u16, u32, u64, u128, usize);

impl BinaryOpMul for f32 {
    #[cfg(all(apple_vdsp, not(neon_simd)))]
    unsafe fn mul_stride_n_0(lhs: *const Self, lhs_stride: usize,
                             rhs: *const Self, dst: *mut Self, count: usize) {
        use crate::acceleration::vdsp::vDSP_vsmul;
        vDSP_vsmul(lhs, lhs_stride as isize, rhs, dst, 1, count);
    }

    #[cfg(all(apple_vdsp, not(neon_simd)))]
    unsafe fn mul_stride_0_n(lhs: *const Self,
                             rhs: *const Self, rhs_stride: usize,
                             dst: *mut Self, count: usize) {
        use crate::acceleration::vdsp::vDSP_vsmul;
        vDSP_vsmul(rhs, rhs_stride as isize, lhs, dst, 1, count);
    }

    simd_binary_op_specializations!(mul);

    #[cfg(all(apple_vdsp, not(neon_simd)))]
    unsafe fn mul_stride_n_n(lhs: *const Self, lhs_stride: usize,
                             rhs: *const Self, rhs_stride: usize,
                             dst: *mut Self, count: usize) {
        use crate::acceleration::vdsp::vDSP_vmul;
        vDSP_vmul(lhs, lhs_stride as isize, rhs, rhs_stride as isize, dst, 1, count);
    }
}

impl BinaryOpMul for f64 {
    #[cfg(all(apple_vdsp, not(neon_simd)))]
    unsafe fn mul_stride_n_0(lhs: *const Self, lhs_stride: usize,
                             rhs: *const Self, dst: *mut Self, count: usize) {
        use crate::acceleration::vdsp::vDSP_vsmulD;
        vDSP_vsmulD(lhs, lhs_stride as isize, rhs, dst, 1, count);
    }

    #[cfg(all(apple_vdsp, not(neon_simd)))]
    unsafe fn mul_stride_0_n(lhs: *const Self,
                             rhs: *const Self, rhs_stride: usize,
                             dst: *mut Self, count: usize) {
        use crate::acceleration::vdsp::vDSP_vsmulD;
        vDSP_vsmulD(rhs, rhs_stride as isize, lhs, dst, 1, count);
    }

    simd_binary_op_specializations!(mul);

    #[cfg(all(apple_vdsp, not(neon_simd)))]
    unsafe fn mul_stride_n_n(lhs: *const Self, lhs_stride: usize,
                             rhs: *const Self, rhs_stride: usize,
                             dst: *mut Self, count: usize) {
        use crate::acceleration::vdsp::vDSP_vmulD;
        vDSP_vmulD(lhs, lhs_stride as isize, rhs, rhs_stride as isize, dst, 1, count);
    }
}