1#![cfg_attr(docsrs, feature(doc_cfg))]
2
3extern crate alloc;
4
5#[cfg(feature = "template")]
6pub use ruda_kernel::{
7 dsl::prelude::KernelMetadata,
8 tensor::contiguous::into_contiguous,
9 kernel_source,
10 template::{KernelSource, SourceKernel, SourceTemplate},
11};
12#[cfg(feature = "template")]
13mod template;
14#[cfg(feature = "template")]
15pub use template::build_info;
16
17pub use ruda_tensor_device::{BoolElement, FloatElement, IntElement};
18pub use ruda_tensor_device::{DeviceBackend, RudaTensor};
19pub use ruda_kernel::dsl::RudaDim;
20pub use ruda_core::flex32;
21
22pub use ruda_driver_wgpu::{
23 AutoCompiler, MemoryConfiguration, RuntimeOptions, WgpuDevice, WgpuResource, WgpuRuntime,
24 WgpuSetup, WgpuStorage, init_device, init_setup, init_setup_async,
25};
26pub mod graphics {
28 pub use ruda_driver_wgpu::{AutoGraphicsApi, Dx12, GraphicsApi, Metal, OpenGl, Vulkan, WebGpu};
29}
30
31#[cfg(feature = "wgsl")]
32pub use ruda_driver_wgpu::WgslCompiler;
33#[cfg(feature = "spirv")]
34pub use ruda_driver_wgpu::vulkan::VkSpirvCompiler;
35
36#[cfg(feature = "fusion")]
37pub type Wgpu<F = f32, I = i32, B = u32> =
69 ruda_fusion::Fusion<DeviceBackend<ruda_driver_wgpu::WgpuRuntime, F, I, B>>;
70
71#[cfg(not(feature = "fusion"))]
72pub type Wgpu<F = f32, I = i32, B = u32> = DeviceBackend<ruda_driver_wgpu::WgpuRuntime, F, I, B>;
104
105#[cfg(feature = "vulkan")]
106pub type Vulkan<F = f32, I = i32, B = u8> = Wgpu<F, I, B>;
108
109#[cfg(feature = "webgpu")]
110pub type WebGpu<F = f32, I = i32, B = u32> = Wgpu<F, I, B>;
112
113#[cfg(feature = "metal")]
114pub type Metal<F = f32, I = i32, B = u8> = Wgpu<F, I, B>;
116
117#[cfg(test)]
118mod tests {
119 use super::*;
120 use ruda_tensor::{Backend, BoolStore, DType, QTensorPrimitive};
121
122 #[test]
123 fn should_support_dtypes() {
124 type B = Wgpu;
125 let device = Default::default();
126
127 assert!(B::supports_dtype(&device, DType::F32));
128 assert!(B::supports_dtype(&device, DType::I64));
129 assert!(B::supports_dtype(&device, DType::I32));
130 assert!(B::supports_dtype(&device, DType::U64));
131 assert!(B::supports_dtype(&device, DType::U32));
132 assert!(B::supports_dtype(
133 &device,
134 DType::QFloat(RudaTensor::<WgpuRuntime>::default_scheme())
135 ));
136 assert!(B::supports_dtype(&device, DType::Bool(BoolStore::Native)));
138
139 #[cfg(feature = "vulkan")]
140 {
141 assert!(B::supports_dtype(&device, DType::F16));
142 assert!(B::supports_dtype(&device, DType::I16));
143 assert!(B::supports_dtype(&device, DType::I8));
144 assert!(B::supports_dtype(&device, DType::U16));
145 assert!(B::supports_dtype(&device, DType::U8));
146
147 assert!(!B::supports_dtype(&device, DType::F64));
148 assert!(!B::supports_dtype(&device, DType::Flex32));
149 assert!(!B::supports_dtype(&device, DType::BF16));
151 }
152
153 #[cfg(feature = "metal")]
154 {
155 assert!(B::supports_dtype(&device, DType::F16));
156 assert!(B::supports_dtype(&device, DType::I16));
157 assert!(B::supports_dtype(&device, DType::I8));
158 assert!(B::supports_dtype(&device, DType::U16));
159 assert!(B::supports_dtype(&device, DType::U8));
160
161 assert!(!B::supports_dtype(&device, DType::F64));
162 assert!(!B::supports_dtype(&device, DType::BF16));
163 assert!(!B::supports_dtype(&device, DType::Flex32));
164 }
165
166 #[cfg(all(not(any(feature = "vulkan", feature = "metal")), target_os = "macos"))]
169 {
170 assert!(B::supports_dtype(&device, DType::Flex32));
171 assert!(B::supports_dtype(&device, DType::F16));
172
173 assert!(!B::supports_dtype(&device, DType::F64));
174 assert!(!B::supports_dtype(&device, DType::BF16));
175 assert!(!B::supports_dtype(&device, DType::I16));
176 assert!(!B::supports_dtype(&device, DType::I8));
177 assert!(!B::supports_dtype(&device, DType::U16));
178 assert!(!B::supports_dtype(&device, DType::U8));
179 }
180
181 #[cfg(not(any(feature = "vulkan", feature = "metal", target_os = "macos")))]
182 {
183 assert!(B::supports_dtype(&device, DType::F64));
184 assert!(B::supports_dtype(&device, DType::Flex32));
185 assert!(B::supports_dtype(&device, DType::F16));
186
187 assert!(!B::supports_dtype(&device, DType::BF16));
188 assert!(!B::supports_dtype(&device, DType::I16));
189 assert!(!B::supports_dtype(&device, DType::I8));
190 assert!(!B::supports_dtype(&device, DType::U16));
191 assert!(!B::supports_dtype(&device, DType::U8));
192 }
193 }
194}