singe-npp 0.1.0-alpha.8

Safe Rust wrappers for NVIDIA Performance Primitives library (NPP).
Documentation
use singe_cuda::types::{Complex32, Complex64};
use singe_npp_sys as sys;

use crate::{
    context::StreamContext,
    error::Result,
    signal::view::{SignalView, SignalViewMut},
    try_ffi,
    types::{ComplexI16, ComplexI32, ComplexI64, DataTypeLike, ZeroCrossingType},
    utility::{to_u64, to_usize, validate_same_len},
    workspace::ScratchBuffer,
};

pub use crate::signal::statistics_dispatch::*;

#[macro_use]
#[path = "statistics_macros.rs"]
mod statistics_macros;

#[path = "statistics_scalar_ops.rs"]
mod scalar_ops;
pub use scalar_ops::*;

#[path = "statistics_metric_ops.rs"]
mod metric_ops;
pub use metric_ops::*;

pub trait CountInRange: DataTypeLike {
    fn count_in_range_buffer_size(
        stream_context: &StreamContext,
        source: &SignalView<'_, Self>,
    ) -> Result<usize>;

    fn count_in_range_to_device_with_scratch(
        stream_context: &StreamContext,
        source: &SignalView<'_, Self>,
        count: &mut SignalViewMut<'_, i32>,
        lower_bound: Self,
        upper_bound: Self,
        scratch: &mut ScratchBuffer,
    ) -> Result<()>;
}

impl CountInRange for i32 {
    fn count_in_range_buffer_size(
        stream_context: &StreamContext,
        source: &SignalView<'_, Self>,
    ) -> Result<usize> {
        count_in_range_i32_buffer_size(stream_context, source)
    }

    fn count_in_range_to_device_with_scratch(
        stream_context: &StreamContext,
        source: &SignalView<'_, Self>,
        count: &mut SignalViewMut<'_, i32>,
        lower_bound: Self,
        upper_bound: Self,
        scratch: &mut ScratchBuffer,
    ) -> Result<()> {
        count_in_range_i32_to_device_with_scratch(
            stream_context,
            source,
            count,
            lower_bound,
            upper_bound,
            scratch,
        )
    }
}

pub fn count_in_range_buffer_size<T: CountInRange>(
    stream_context: &StreamContext,
    source: &SignalView<'_, T>,
) -> Result<usize> {
    T::count_in_range_buffer_size(stream_context, source)
}

pub fn count_in_range_to_device_with_scratch<T: CountInRange>(
    stream_context: &StreamContext,
    source: &SignalView<'_, T>,
    count: &mut SignalViewMut<'_, i32>,
    lower_bound: T,
    upper_bound: T,
    scratch: &mut ScratchBuffer,
) -> Result<()> {
    T::count_in_range_to_device_with_scratch(
        stream_context,
        source,
        count,
        lower_bound,
        upper_bound,
        scratch,
    )
}

pub fn count_in_range_to_device<T: CountInRange>(
    stream_context: &StreamContext,
    source: &SignalView<'_, T>,
    count: &mut SignalViewMut<'_, i32>,
    lower_bound: T,
    upper_bound: T,
) -> Result<()> {
    let required_bytes = count_in_range_buffer_size(stream_context, source)?;
    let mut scratch = ScratchBuffer::create(required_bytes)?;
    count_in_range_to_device_with_scratch(
        stream_context,
        source,
        count,
        lower_bound,
        upper_bound,
        &mut scratch,
    )
}
impl_pair_statistic!(
    min_max_u8_buffer_size,
    min_max_u8_to_device_with_scratch,
    min_max_u8_to_device,
    u8,
    nppsMinMaxGetBufferSize_8u_Ctx,
    nppsMinMax_8u_Ctx
);
impl_pair_statistic!(
    min_max_u16_buffer_size,
    min_max_u16_to_device_with_scratch,
    min_max_u16_to_device,
    u16,
    nppsMinMaxGetBufferSize_16u_Ctx,
    nppsMinMax_16u_Ctx
);
impl_pair_statistic!(
    min_max_i16_buffer_size,
    min_max_i16_to_device_with_scratch,
    min_max_i16_to_device,
    i16,
    nppsMinMaxGetBufferSize_16s_Ctx,
    nppsMinMax_16s_Ctx
);
impl_pair_statistic!(
    min_max_u32_buffer_size,
    min_max_u32_to_device_with_scratch,
    min_max_u32_to_device,
    u32,
    nppsMinMaxGetBufferSize_32u_Ctx,
    nppsMinMax_32u_Ctx
);
impl_pair_statistic!(
    min_max_i32_buffer_size,
    min_max_i32_to_device_with_scratch,
    min_max_i32_to_device,
    i32,
    nppsMinMaxGetBufferSize_32s_Ctx,
    nppsMinMax_32s_Ctx
);
impl_pair_statistic!(
    min_max_f32_buffer_size,
    min_max_f32_to_device_with_scratch,
    min_max_f32_to_device,
    f32,
    nppsMinMaxGetBufferSize_32f_Ctx,
    nppsMinMax_32f_Ctx
);
impl_pair_statistic!(
    min_max_f64_buffer_size,
    min_max_f64_to_device_with_scratch,
    min_max_f64_to_device,
    f64,
    nppsMinMaxGetBufferSize_64f_Ctx,
    nppsMinMax_64f_Ctx
);
impl_indexed_pair_statistic!(
    min_max_index_u8_buffer_size,
    min_max_index_u8_to_device_with_scratch,
    min_max_index_u8_to_device,
    u8,
    nppsMinMaxIndxGetBufferSize_8u_Ctx,
    nppsMinMaxIndx_8u_Ctx
);
impl_indexed_pair_statistic!(
    min_max_index_u16_buffer_size,
    min_max_index_u16_to_device_with_scratch,
    min_max_index_u16_to_device,
    u16,
    nppsMinMaxIndxGetBufferSize_16u_Ctx,
    nppsMinMaxIndx_16u_Ctx
);
impl_indexed_pair_statistic!(
    min_max_index_i16_buffer_size,
    min_max_index_i16_to_device_with_scratch,
    min_max_index_i16_to_device,
    i16,
    nppsMinMaxIndxGetBufferSize_16s_Ctx,
    nppsMinMaxIndx_16s_Ctx
);
impl_indexed_pair_statistic!(
    min_max_index_u32_buffer_size,
    min_max_index_u32_to_device_with_scratch,
    min_max_index_u32_to_device,
    u32,
    nppsMinMaxIndxGetBufferSize_32u_Ctx,
    nppsMinMaxIndx_32u_Ctx
);
impl_indexed_pair_statistic!(
    min_max_index_i32_buffer_size,
    min_max_index_i32_to_device_with_scratch,
    min_max_index_i32_to_device,
    i32,
    nppsMinMaxIndxGetBufferSize_32s_Ctx,
    nppsMinMaxIndx_32s_Ctx
);
impl_indexed_pair_statistic!(
    min_max_index_f32_buffer_size,
    min_max_index_f32_to_device_with_scratch,
    min_max_index_f32_to_device,
    f32,
    nppsMinMaxIndxGetBufferSize_32f_Ctx,
    nppsMinMaxIndx_32f_Ctx
);
impl_indexed_pair_statistic!(
    min_max_index_f64_buffer_size,
    min_max_index_f64_to_device_with_scratch,
    min_max_index_f64_to_device,
    f64,
    nppsMinMaxIndxGetBufferSize_64f_Ctx,
    nppsMinMaxIndx_64f_Ctx
);
impl_mean_stddev!(
    mean_standard_deviation_f32_buffer_size,
    mean_standard_deviation_f32_to_device_with_scratch,
    mean_standard_deviation_f32_to_device,
    f32,
    nppsMeanStdDevGetBufferSize_32f_Ctx,
    nppsMeanStdDev_32f_Ctx
);
impl_mean_stddev!(
    mean_standard_deviation_f64_buffer_size,
    mean_standard_deviation_f64_to_device_with_scratch,
    mean_standard_deviation_f64_to_device,
    f64,
    nppsMeanStdDevGetBufferSize_64f_Ctx,
    nppsMeanStdDev_64f_Ctx
);
impl_scaled_mean_stddev!(
    mean_standard_deviation_i16_scaled_buffer_size,
    mean_standard_deviation_i16_scaled_to_device_with_scratch,
    mean_standard_deviation_i16_scaled_to_device,
    i16,
    i16,
    nppsMeanStdDevGetBufferSize_16s_Sfs_Ctx,
    nppsMeanStdDev_16s_Sfs_Ctx
);
impl_scaled_mean_stddev!(
    mean_standard_deviation_i16_to_i32_scaled_buffer_size,
    mean_standard_deviation_i16_to_i32_scaled_to_device_with_scratch,
    mean_standard_deviation_i16_to_i32_scaled_to_device,
    i16,
    i32,
    nppsMeanStdDevGetBufferSize_16s32s_Sfs_Ctx,
    nppsMeanStdDev_16s32s_Sfs_Ctx
);
impl_every_statistic_in_place!(min_every_u8_in_place, u8, nppsMinEvery_8u_I_Ctx);
impl_every_statistic_in_place!(min_every_u16_in_place, u16, nppsMinEvery_16u_I_Ctx);
impl_every_statistic_in_place!(min_every_i16_in_place, i16, nppsMinEvery_16s_I_Ctx);
impl_every_statistic_in_place!(min_every_i32_in_place, i32, nppsMinEvery_32s_I_Ctx);
impl_every_statistic_in_place!(min_every_f32_in_place, f32, nppsMinEvery_32f_I_Ctx);
impl_every_statistic_in_place!(min_every_f64_in_place, f64, nppsMinEvery_64f_I_Ctx);
impl_every_statistic_in_place!(max_every_u8_in_place, u8, nppsMaxEvery_8u_I_Ctx);
impl_every_statistic_in_place!(max_every_u16_in_place, u16, nppsMaxEvery_16u_I_Ctx);
impl_every_statistic_in_place!(max_every_i16_in_place, i16, nppsMaxEvery_16s_I_Ctx);
impl_every_statistic_in_place!(max_every_i32_in_place, i32, nppsMaxEvery_32s_I_Ctx);
impl_every_statistic_in_place!(max_every_f32_in_place, f32, nppsMaxEvery_32f_I_Ctx);

fn validate_scalar_output<T>(destination: &SignalViewMut<'_, T>, name: &str) -> Result<()> {
    validate_same_len(1, destination.len(), name)
}