1#![warn(missing_docs)]
49#![warn(clippy::all)]
50
51pub mod backend;
52pub mod bridge;
53pub mod device;
54pub mod discovery;
55pub mod error;
56pub mod memory;
57pub mod scheduler;
58
59pub use backend::{CommandEncoder, ComputeBackend, Fence};
61pub use device::{
62 ComputeDevice, DeviceCapabilities, DeviceFeature, DeviceId, DevicePool, DeviceType,
63 SelectionStrategy, SimdLevel,
64};
65pub use discovery::{get_device_pool, get_discovery_time_us, refresh_device_pool, HardwareDiscovery};
66pub use error::{ComputeError, ComputeResult};
67pub use memory::{Buffer, BufferUsage, MemoryPool};
68pub use scheduler::{Priority, RoundRobinScheduler, Scheduler, SimpleScheduler, Workload, WorkloadScheduler};
69
70pub use backend::cpu::{CpuBackend, CpuBuffer, CpuDevice};
72
73#[cfg(target_os = "macos")]
74pub use backend::metal::{MetalBackend, MetalBuffer, MetalDevice};
75
76#[cfg(feature = "cuda")]
77pub use backend::cuda::{CudaBackend, CudaBuffer, CudaDevice};
78
79#[cfg(feature = "vulkan")]
80pub use backend::vulkan::{VulkanBackend, VulkanBuffer, VulkanDevice};
81
82#[cfg(feature = "opencl")]
83pub use backend::opencl::{OpenClBackend, OpenClBuffer, OpenClDevice};
84
85#[cfg(feature = "rocm")]
86pub use backend::rocm::{RocmBackend, RocmBuffer, RocmDevice};
87
88pub mod prelude {
90 pub use crate::backend::{CommandEncoder, ComputeBackend, Fence};
91 pub use crate::device::{
92 ComputeDevice, DeviceCapabilities, DeviceFeature, DeviceId, DevicePool, DeviceType,
93 };
94 pub use crate::discovery::{get_device_pool, HardwareDiscovery};
95 pub use crate::error::{ComputeError, ComputeResult};
96 pub use crate::memory::{Buffer, BufferUsage};
97 pub use crate::scheduler::{Scheduler, Workload};
98}
99
100#[cfg(test)]
101mod tests {
102 use super::*;
103
104 #[test]
105 fn test_hardware_discovery() {
106 let pool = HardwareDiscovery::discover_all().unwrap();
107 assert!(pool.has_devices());
108
109 println!("\n=== tsai_compute Device Discovery ===\n");
110 pool.print_summary();
111 }
112
113 #[test]
114 fn test_cpu_backend() {
115 let devices = CpuBackend::enumerate_devices().unwrap();
116 assert!(!devices.is_empty());
117
118 let backend = CpuBackend::new(&devices[0]).unwrap();
119 let buffer = backend.allocate_buffer(1024, BufferUsage::HOST_VISIBLE).unwrap();
120 assert_eq!(buffer.size(), 1024);
121 }
122
123 #[test]
124 fn test_device_selection() {
125 let pool = HardwareDiscovery::discover_all().unwrap();
126
127 let best = pool.best_device();
129 assert!(best.is_some());
130
131 let cpus = pool.cpu_devices();
133 assert!(!cpus.is_empty());
134 }
135
136 #[test]
137 fn test_scheduler() {
138 let pool = HardwareDiscovery::discover_all().unwrap();
139 let scheduler = WorkloadScheduler::new();
140
141 let workload = Workload::new()
142 .with_flops(1_000_000)
143 .with_memory(1024 * 1024);
144
145 let device = scheduler.select_device(&pool, &workload).unwrap();
146 println!("Selected device: {:?}", device);
147 }
148}