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}