tritonserver_rs/macros.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
#[cfg(feature = "gpu")]
/// Run cuda method and get the Result<(), tritonserver_rs::Error> instead of cuda_driver_sys::CUresult.
macro_rules! cuda_call {
($expr: expr) => {{
#[allow(clippy::macro_metavars_in_unsafe)]
let res = unsafe { $expr };
if res != cuda_driver_sys::CUresult::CUDA_SUCCESS {
Err($crate::error::Error::new(
$crate::error::ErrorCode::Internal,
format!("Cuda result: {:?}", res),
))
} else {
std::result::Result::<_, $crate::error::Error>::Ok(())
}
}};
}
/// Run triton method and get the Result<(), tritonserver_rs::Error> instead of cuda_driver_sys::CUresult.
macro_rules! triton_call {
($expr: expr) => {{
#[allow(clippy::macro_metavars_in_unsafe)]
let res = unsafe { $expr };
if res.is_null() {
std::result::Result::<(), $crate::error::Error>::Ok(())
} else {
std::result::Result::<(), $crate::error::Error>::Err(res.into())
}
}};
($expr: expr, $val: expr) => {{
#[allow(clippy::macro_metavars_in_unsafe)]
let res = unsafe { $expr };
if res.is_null() {
std::result::Result::<_, $crate::error::Error>::Ok($val)
} else {
std::result::Result::<_, $crate::error::Error>::Err(res.into())
}
}};
}
/// Run cuda code (which should be run in sync + cuda context pinned) in asynchronous context.
///
/// First argument is an id of device to run function on; second is the code to run. All the variables will be moved.
///
/// If "gpu" feature is off just runs a code without context/blocking.
#[macro_export]
macro_rules! run_in_context {
($val: expr, $expr: expr) => {{
#[cfg(feature = "gpu")]
{
tokio::task::spawn_blocking(move || {
let ctx = $crate::get_context($val)?;
let _handle = ctx.make_current()?;
$expr
})
.await
.expect("tokio failed to join thread")
}
#[cfg(not(feature = "gpu"))]
$expr
}};
}
/// Run cuda code (which should be run in sync + cuda context pinned).
///
/// First argument is an id of device to run function on; second is the code to run.
///
/// If "gpu" feature is off just runs a code without context/blocking.
#[macro_export]
macro_rules! run_in_context_sync {
($val: expr, $expr: expr) => {{
#[cfg(feature = "gpu")]
{
let ctx = $crate::get_context($val)?;
let _handle = ctx.make_current()?;
$expr
}
#[cfg(not(feature = "gpu"))]
$expr
}};
}