use crate::hip::Stream;
use crate::rocblas::bindings::hipEvent_t;
use crate::rocblas::error::{Error, Result};
use crate::rocblas::ffi;
use crate::rocblas::handle::Handle;
use std::mem;
pub fn set_vector_async<T: Copy>(
n: i32,
x: &[T],
incx: i32,
y: *mut T,
incy: i32,
stream: &Stream,
) -> Result<()> {
let elem_size = mem::size_of::<T>() as i32;
let status = unsafe {
ffi::rocblas_set_vector_async(
n,
elem_size,
x.as_ptr() as *const std::os::raw::c_void,
incx,
y as *mut std::os::raw::c_void,
incy,
stream.as_raw() as crate::rocblas::bindings::hipStream_t,
)
};
if status != ffi::rocblas_status__rocblas_status_success {
return Err(Error::new(status));
}
Ok(())
}
pub fn set_vector_async_64<T: Copy>(
n: i64,
x: &[T],
incx: i64,
y: *mut T,
incy: i64,
stream: &Stream,
) -> Result<()> {
let elem_size = mem::size_of::<T>() as i64;
let status = unsafe {
ffi::rocblas_set_vector_async_64(
n,
elem_size,
x.as_ptr() as *const std::os::raw::c_void,
incx,
y as *mut std::os::raw::c_void,
incy,
stream.as_raw() as crate::rocblas::bindings::hipStream_t,
)
};
if status != ffi::rocblas_status__rocblas_status_success {
return Err(Error::new(status));
}
Ok(())
}
pub fn get_vector_async<T: Copy>(
n: i32,
x: *const T,
incx: i32,
y: &mut [T],
incy: i32,
stream: &Stream,
) -> Result<()> {
let elem_size = mem::size_of::<T>() as i32;
let status = unsafe {
ffi::rocblas_get_vector_async(
n,
elem_size,
x as *const std::os::raw::c_void,
incx,
y.as_mut_ptr() as *mut std::os::raw::c_void,
incy,
stream.as_raw() as crate::rocblas::bindings::hipStream_t,
)
};
if status != ffi::rocblas_status__rocblas_status_success {
return Err(Error::new(status));
}
Ok(())
}
pub fn get_vector_async_64<T: Copy>(
n: i64,
x: *const T,
incx: i64,
y: &mut [T],
incy: i64,
stream: &Stream,
) -> Result<()> {
let elem_size = mem::size_of::<T>() as i64;
let status = unsafe {
ffi::rocblas_get_vector_async_64(
n,
elem_size,
x as *const std::os::raw::c_void,
incx,
y.as_mut_ptr() as *mut std::os::raw::c_void,
incy,
stream.as_raw() as crate::rocblas::bindings::hipStream_t,
)
};
if status != ffi::rocblas_status__rocblas_status_success {
return Err(Error::new(status));
}
Ok(())
}
pub fn set_matrix_async<T: Copy>(
rows: i32,
cols: i32,
a: &[T],
lda: i32,
b: *mut T,
ldb: i32,
stream: &Stream,
) -> Result<()> {
let elem_size = mem::size_of::<T>() as i32;
let status = unsafe {
ffi::rocblas_set_matrix_async(
rows,
cols,
elem_size,
a.as_ptr() as *const std::os::raw::c_void,
lda,
b as *mut std::os::raw::c_void,
ldb,
stream.as_raw() as crate::rocblas::bindings::hipStream_t,
)
};
if status != ffi::rocblas_status__rocblas_status_success {
return Err(Error::new(status));
}
Ok(())
}
pub fn set_matrix_async_64<T: Copy>(
rows: i64,
cols: i64,
a: &[T],
lda: i64,
b: *mut T,
ldb: i64,
stream: &Stream,
) -> Result<()> {
let elem_size = mem::size_of::<T>() as i64;
let status = unsafe {
ffi::rocblas_set_matrix_async_64(
rows,
cols,
elem_size,
a.as_ptr() as *const std::os::raw::c_void,
lda,
b as *mut std::os::raw::c_void,
ldb,
stream.as_raw() as crate::rocblas::bindings::hipStream_t,
)
};
if status != ffi::rocblas_status__rocblas_status_success {
return Err(Error::new(status));
}
Ok(())
}
pub fn get_matrix_async<T: Copy>(
rows: i32,
cols: i32,
a: *const T,
lda: i32,
b: &mut [T],
ldb: i32,
stream: &Stream,
) -> Result<()> {
let elem_size = mem::size_of::<T>() as i32;
let status = unsafe {
ffi::rocblas_get_matrix_async(
rows,
cols,
elem_size,
a as *const std::os::raw::c_void,
lda,
b.as_mut_ptr() as *mut std::os::raw::c_void,
ldb,
stream.as_raw() as crate::rocblas::bindings::hipStream_t,
)
};
if status != ffi::rocblas_status__rocblas_status_success {
return Err(Error::new(status));
}
Ok(())
}
pub fn get_matrix_async_64<T: Copy>(
rows: i64,
cols: i64,
a: *const T,
lda: i64,
b: &mut [T],
ldb: i64,
stream: &Stream,
) -> Result<()> {
let elem_size = mem::size_of::<T>() as i64;
let status = unsafe {
ffi::rocblas_get_matrix_async_64(
rows,
cols,
elem_size,
a as *const std::os::raw::c_void,
lda,
b.as_mut_ptr() as *mut std::os::raw::c_void,
ldb,
stream.as_raw() as crate::rocblas::bindings::hipStream_t,
)
};
if status != ffi::rocblas_status__rocblas_status_success {
return Err(Error::new(status));
}
Ok(())
}
pub fn set_start_stop_events(
handle: &Handle,
start_event: hipEvent_t,
stop_event: hipEvent_t,
) -> Result<()> {
let status =
unsafe { ffi::rocblas_set_start_stop_events(handle.as_raw(), start_event, stop_event) };
if status != ffi::rocblas_status__rocblas_status_success {
return Err(Error::new(status));
}
Ok(())
}