use crate::error::{DriverError, IntoResult};
use crate::simt::context::CudaContext;
use std::mem::MaybeUninit;
use std::sync::Arc;
pub fn can_access_peer(from: &CudaContext, to: &CudaContext) -> Result<bool, DriverError> {
let mut can_access = MaybeUninit::uninit();
unsafe {
cuda_bindings::cuDeviceCanAccessPeer(
can_access.as_mut_ptr(),
from.cu_device(),
to.cu_device(),
)
.result()?;
Ok(can_access.assume_init() != 0)
}
}
pub fn enable_peer_access(
from: &Arc<CudaContext>,
to: &Arc<CudaContext>,
) -> Result<(), DriverError> {
from.bind_to_thread()?;
let result = unsafe { cuda_bindings::cuCtxEnablePeerAccess(to.cu_ctx(), 0) };
match result {
cuda_bindings::cudaError_enum_CUDA_SUCCESS => Ok(()),
cuda_bindings::cudaError_enum_CUDA_ERROR_PEER_ACCESS_ALREADY_ENABLED => Ok(()),
_ => result.result(),
}
}
pub fn disable_peer_access(
from: &Arc<CudaContext>,
to: &Arc<CudaContext>,
) -> Result<(), DriverError> {
from.bind_to_thread()?;
let result = unsafe { cuda_bindings::cuCtxDisablePeerAccess(to.cu_ctx()) };
match result {
cuda_bindings::cudaError_enum_CUDA_SUCCESS => Ok(()),
cuda_bindings::cudaError_enum_CUDA_ERROR_PEER_ACCESS_NOT_ENABLED => Ok(()),
_ => result.result(),
}
}