pub mod capabilities;
pub mod core;
pub mod discovery;
pub mod implementations;
pub mod management;
pub mod phantom;
pub mod sync;
pub mod transfer;
pub mod typed;
pub mod types;
pub use self::core::{
global_device_registry, initialize_global_registry, Device, DeviceContext,
DeviceFactory as CoreDeviceFactory, DeviceLifecycle, DeviceMemoryInfo, DeviceRegistry,
DeviceState, RegistryStatistics,
};
pub use self::types::{parse_device_string, DeviceType};
pub use self::capabilities::{DeviceCapabilities, PciInfo, SimdFeatures, ThermalInfo};
pub use self::sync::{
DeviceAsync, DeviceBarrier, DeviceEvent, DeviceMutex, DeviceStream, DeviceSyncManager,
StreamPriority, SyncStatistics,
};
pub use self::phantom::{
AllToAllTopology, CrossDeviceOp, DeviceCompatible, DeviceGroup, DeviceHandle, DeviceOperation,
DeviceRequirements, DeviceTopology, NoRequirements, PeerToPeerOps, PhantomCpu, PhantomCuda,
PhantomDevice, PhantomDeviceManager, PhantomMetal, PhantomWgpu, RequiresCpu, RequiresCuda,
RequiresGpu, RingTopology, SameDevice, TransferCompatible, TreeTopology, TypedDeviceAffinity,
};
pub use self::typed::{
CudaKernel, DeviceRequirements as TypedDeviceRequirements, GpuKernel, GpuMemoryInfo,
MetalShader, TypedCpuDevice, TypedCudaDevice, TypedDevice, TypedDeviceBuilder,
TypedDeviceFactory, TypedDeviceInstance, TypedDeviceOperation, TypedDeviceSelector,
TypedGpuDevice, TypedMetalDevice, TypedOperationValidator,
};
pub use self::implementations::{CpuDevice, DeviceFactory, SimdLevel};
#[cfg(feature = "cuda")]
pub use self::implementations::CudaDevice;
#[cfg(target_os = "macos")]
pub use self::implementations::MetalDevice;
#[cfg(feature = "wgpu")]
pub use self::implementations::WgpuDevice;
pub use self::management::{
global_device_manager, initialize_global_manager, AllocationStrategy, DeviceHealth,
DeviceManager, DiscoveryConfig as ManagementDiscoveryConfig, HealthConfig, HealthMonitor,
ManagerConfig, ManagerStatistics,
};
pub use self::transfer::{
BandwidthConfig, BandwidthManager, P2PManager, TransferConfig, TransferHandle, TransferId,
TransferManager, TransferMethod, TransferPriority, TransferRequest, TransferResult,
TransferStatistics, TransferStatus,
};
pub use self::discovery::{
CapabilityRequirements, DeviceDiscovery, DeviceOption, DevicePreference, DeviceRecommendation,
DiscoveredDevice, DiscoveryConfig, DiscoveryStatistics, PerformanceEstimate, PlatformInfo,
UseCase, WorkloadProfile, WorkloadType,
};
pub use self::capabilities::utils as capability_utils;
pub use self::core::utils as device_utils;
pub use self::discovery::utils as discovery_utils;
pub use self::implementations::utils as implementation_utils;
pub use self::management::utils as management_utils;
pub use self::phantom::utils as phantom_utils;
pub use self::sync::utils as sync_utils;
pub use self::transfer::utils as transfer_utils;
pub use self::typed::utils as typed_utils;
pub use self::types::utils as device_type_utils;
pub type DeviceId = String;
pub type DeviceIndex = usize;
pub mod prelude {
pub use super::{Device, DeviceCapabilities, DeviceType};
pub use super::CpuDevice;
#[cfg(feature = "cuda")]
pub use super::CudaDevice;
#[cfg(target_os = "macos")]
pub use super::MetalDevice;
#[cfg(feature = "wgpu")]
pub use super::WgpuDevice;
pub use super::{DeviceDiscovery, DeviceFactory, DeviceManager};
pub use super::{DeviceBarrier, DeviceEvent, DeviceStream};
pub use super::{TransferHandle, TransferManager, TransferRequest};
pub use super::{DeviceHandle, PhantomCpu, PhantomCuda, PhantomMetal, PhantomWgpu};
pub use super::{TypedDevice, TypedDeviceFactory};
pub use super::{global_device_manager, parse_device_string};
}
pub mod advanced {
pub use super::core::{DeviceContext, DeviceLifecycle, DeviceRegistry};
pub use super::sync::{DeviceAsync, DeviceMutex, DeviceSyncManager};
pub use super::phantom::{
compile_time, AllToAllTopology, CrossDeviceOp, DeviceCompatible, DeviceGroup,
DeviceOperation, DeviceTopology, PeerToPeerOps, PhantomDeviceManager, RingTopology,
SameDevice, TransferCompatible, TreeTopology, TypedDeviceAffinity,
};
pub use super::typed::{
CudaKernel, GpuKernel, MetalShader, TypedDeviceBuilder, TypedDeviceOperation,
TypedDeviceSelector, TypedOperationValidator,
};
pub use super::transfer::{BandwidthManager, P2PManager, TransferConfig};
pub use super::discovery::{CapabilityRequirements, DeviceRecommendation, WorkloadProfile};
pub use super::capabilities::{PciInfo, SimdFeatures, ThermalInfo};
pub use super::discovery::PlatformInfo;
}
pub mod platform {
pub use super::capabilities::SimdFeatures;
pub use super::implementations::SimdLevel;
#[cfg(feature = "cuda")]
pub mod cuda {
pub use crate::device::implementations::CudaDevice;
pub use crate::device::phantom::PhantomCuda;
pub use crate::device::typed::{CudaKernel, TypedCudaDevice};
}
#[cfg(target_os = "macos")]
pub mod metal {
pub use crate::device::implementations::MetalDevice;
pub use crate::device::phantom::PhantomMetal;
pub use crate::device::typed::{MetalShader, TypedMetalDevice};
}
#[cfg(feature = "wgpu")]
pub mod wgpu {
pub use crate::device::implementations::WgpuDevice;
pub use crate::device::phantom::PhantomWgpu;
}
}
pub mod convenience {
use super::*;
use crate::error::Result;
pub fn get_best_training_device() -> Result<Option<std::sync::Arc<dyn Device>>> {
discovery_utils::quick_select_for_training()
}
pub fn get_best_inference_device() -> Result<Option<std::sync::Arc<dyn Device>>> {
discovery_utils::quick_select_for_inference()
}
pub fn get_best_gpu_device() -> Result<Option<std::sync::Arc<dyn Device>>> {
discovery_utils::get_best_gpu()
}
pub fn create_cpu_device() -> CpuDevice {
CpuDevice::new()
}
#[cfg(feature = "cuda")]
pub fn create_cuda_device(index: usize) -> Result<CudaDevice> {
CudaDevice::new(index)
}
#[cfg(target_os = "macos")]
pub fn create_metal_device(index: usize) -> Result<MetalDevice> {
MetalDevice::new(index)
}
#[cfg(feature = "wgpu")]
pub fn create_wgpu_device(index: usize) -> Result<WgpuDevice> {
WgpuDevice::new(index)
}
pub fn parse_device_type(s: &str) -> Result<DeviceType> {
parse_device_string(s)
}
pub fn get_device_capabilities(device_type: DeviceType) -> Result<DeviceCapabilities> {
DeviceCapabilities::detect(device_type)
}
pub fn is_device_available(device_type: DeviceType) -> bool {
DeviceFactory::is_device_type_available(device_type)
}
pub fn get_available_device_types() -> Vec<DeviceType> {
DeviceFactory::available_device_types()
}
pub fn create_device_manager() -> Result<DeviceManager> {
management_utils::create_manager_with_all_devices()
}
pub fn create_transfer_manager() -> TransferManager {
transfer_utils::create_optimized_manager()
}
pub fn create_device_discovery() -> Result<DeviceDiscovery> {
discovery_utils::create_and_scan()
}
pub fn get_device_summary() -> Result<Vec<String>> {
discovery_utils::create_device_summary()
}
pub fn has_high_performance_devices() -> Result<bool> {
discovery_utils::has_high_performance_devices()
}
}
pub mod error {
pub use crate::error::TorshError::*;
}
pub fn initialize_device_system() -> Result<(), crate::error::TorshError> {
let manager_config = management::ManagerConfig::default();
management::initialize_global_manager(manager_config)?;
let _registry = core::global_device_registry();
Ok(())
}
pub fn get_system_info() -> SystemInfo {
let manager = global_device_manager();
let stats = manager.statistics();
let available_types = DeviceFactory::available_device_types();
SystemInfo {
total_devices: stats.total_devices,
available_devices: stats.available_devices,
device_types: available_types,
has_cuda: cfg!(feature = "cuda"),
has_metal: cfg!(target_os = "macos"),
has_wgpu: cfg!(feature = "wgpu"),
}
}
#[derive(Debug, Clone)]
pub struct SystemInfo {
pub total_devices: usize,
pub available_devices: usize,
pub device_types: Vec<DeviceType>,
pub has_cuda: bool,
pub has_metal: bool,
pub has_wgpu: bool,
}
impl std::fmt::Display for SystemInfo {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"Device System: {} devices ({} available), CUDA: {}, Metal: {}, WebGPU: {}",
self.total_devices,
self.available_devices,
self.has_cuda,
self.has_metal,
self.has_wgpu
)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_module_integration() {
let device_type = DeviceType::Cpu;
assert_eq!(device_type.to_string(), "cpu");
let cpu_device = CpuDevice::new();
assert_eq!(cpu_device.device_type(), DeviceType::Cpu);
let manager = DeviceManager::new();
assert_eq!(manager.device_count(), 0);
let discovery = DeviceDiscovery::new();
let _count = discovery
.scan_devices()
.expect("scan_devices should succeed");
}
#[test]
fn test_prelude_imports() {
use super::prelude::*;
let device_type = DeviceType::Cpu;
let cpu_device = CpuDevice::new();
let manager = DeviceManager::new();
let discovery = DeviceDiscovery::new();
assert_eq!(device_type, cpu_device.device_type());
assert_eq!(manager.device_count(), 0);
assert!(
!discovery.get_discovered_devices().is_empty()
|| discovery
.scan_devices()
.expect("scan_devices should succeed")
> 0
);
}
#[test]
fn test_convenience_functions() {
let cpu_device = convenience::create_cpu_device();
assert_eq!(cpu_device.device_type(), DeviceType::Cpu);
let device_type =
convenience::parse_device_type("cpu").expect("parse_device_type should succeed");
assert_eq!(device_type, DeviceType::Cpu);
let available_types = convenience::get_available_device_types();
assert!(available_types.contains(&DeviceType::Cpu));
assert!(convenience::is_device_available(DeviceType::Cpu));
}
#[test]
fn test_system_info() {
let info = get_system_info();
assert!(!info.device_types.is_empty());
assert_eq!(info.has_cuda, cfg!(feature = "cuda"));
assert_eq!(info.has_metal, cfg!(target_os = "macos"));
assert_eq!(info.has_wgpu, cfg!(feature = "wgpu"));
}
#[test]
fn test_device_system_initialization() {
let result = initialize_device_system();
assert!(result.is_ok());
let global_manager = global_device_manager();
let _stats = global_manager.statistics();
}
#[test]
fn test_backward_compatibility() {
let device_type = DeviceType::Cpu;
let capabilities = DeviceCapabilities::detect(device_type).expect("detect should succeed");
let cpu_device = CpuDevice::new();
assert_eq!(device_type, DeviceType::Cpu);
assert!(capabilities.total_memory() > 0);
assert_eq!(cpu_device.name(), "CPU");
let parsed = parse_device_string("cpu").expect("parse_device_string should succeed");
assert_eq!(parsed, DeviceType::Cpu);
}
#[test]
fn test_phantom_types() {
use super::phantom::*;
assert_eq!(PhantomCpu::device_type(), DeviceType::Cpu);
assert_eq!(PhantomCuda::<0>::device_type(), DeviceType::Cuda(0));
assert!(PhantomCpu::is_compatible::<PhantomCpu>());
assert!(!PhantomCpu::is_compatible::<PhantomCuda<0>>());
}
#[test]
fn test_advanced_features() {
use super::advanced::*;
let lifecycle = DeviceLifecycle::new();
assert!(!lifecycle.is_ready());
let sync_manager = DeviceSyncManager::new();
let stats = sync_manager.statistics();
assert_eq!(stats.total_streams, 0);
}
}