Skip to main content

singe_cusparse/
spvv.rs

1use singe_cuda::data_type::DataTypeLike;
2
3use singe_cusparse_sys as sys;
4
5use crate::{
6    context::Context,
7    error::Result,
8    scalar::ScalarMut,
9    try_ffi,
10    types::Operation,
11    utility::to_usize,
12    vector::{DenseVectorDescriptor, SparseVectorDescriptor},
13};
14
15pub fn spvv_buffer_size<Compute: DataTypeLike>(
16    ctx: &Context,
17    operation_x: Operation,
18    x: &SparseVectorDescriptor,
19    y: &DenseVectorDescriptor,
20    result: &mut ScalarMut<'_, Compute>,
21) -> Result<usize> {
22    ctx.bind()?;
23    if ctx.scalar_pointer_mode()? != result.pointer_mode() {
24        ctx.set_scalar_pointer_mode(result.pointer_mode())?;
25    }
26
27    let mut size = 0;
28    unsafe {
29        try_ffi!(sys::cusparseSpVV_bufferSize(
30            ctx.as_raw(),
31            operation_x.into(),
32            x.as_raw_const(),
33            y.as_raw_const(),
34            result.as_mut_ptr().cast(),
35            Compute::data_type().into(),
36            &raw mut size,
37        ))?;
38    }
39    to_usize(size, "spvv buffer size")
40}