#![cfg_attr(docsrs, feature(doc_cfg))]
extern crate alloc;
#[cfg(feature = "template")]
pub use ruda_kernel::{
dsl::prelude::KernelMetadata,
tensor::contiguous::into_contiguous,
kernel_source,
template::{KernelSource, SourceKernel, SourceTemplate},
};
#[cfg(feature = "template")]
mod template;
#[cfg(feature = "template")]
pub use template::build_info;
pub use ruda_tensor_device::{BoolElement, FloatElement, IntElement};
pub use ruda_tensor_device::{DeviceBackend, RudaTensor};
pub use ruda_kernel::dsl::RudaDim;
pub use ruda_core::flex32;
pub use ruda_driver_wgpu::{
AutoCompiler, MemoryConfiguration, RuntimeOptions, WgpuDevice, WgpuResource, WgpuRuntime,
WgpuSetup, WgpuStorage, init_device, init_setup, init_setup_async,
};
pub mod graphics {
pub use ruda_driver_wgpu::{AutoGraphicsApi, Dx12, GraphicsApi, Metal, OpenGl, Vulkan, WebGpu};
}
#[cfg(feature = "wgsl")]
pub use ruda_driver_wgpu::WgslCompiler;
#[cfg(feature = "spirv")]
pub use ruda_driver_wgpu::vulkan::VkSpirvCompiler;
#[cfg(feature = "fusion")]
pub type Wgpu<F = f32, I = i32, B = u32> =
ruda_fusion::Fusion<DeviceBackend<ruda_driver_wgpu::WgpuRuntime, F, I, B>>;
#[cfg(not(feature = "fusion"))]
pub type Wgpu<F = f32, I = i32, B = u32> = DeviceBackend<ruda_driver_wgpu::WgpuRuntime, F, I, B>;
#[cfg(feature = "vulkan")]
pub type Vulkan<F = f32, I = i32, B = u8> = Wgpu<F, I, B>;
#[cfg(feature = "webgpu")]
pub type WebGpu<F = f32, I = i32, B = u32> = Wgpu<F, I, B>;
#[cfg(feature = "metal")]
pub type Metal<F = f32, I = i32, B = u8> = Wgpu<F, I, B>;
#[cfg(test)]
mod tests {
use super::*;
use ruda_tensor::{Backend, BoolStore, DType, QTensorPrimitive};
#[test]
fn should_support_dtypes() {
type B = Wgpu;
let device = Default::default();
assert!(B::supports_dtype(&device, DType::F32));
assert!(B::supports_dtype(&device, DType::I64));
assert!(B::supports_dtype(&device, DType::I32));
assert!(B::supports_dtype(&device, DType::U64));
assert!(B::supports_dtype(&device, DType::U32));
assert!(B::supports_dtype(
&device,
DType::QFloat(RudaTensor::<WgpuRuntime>::default_scheme())
));
assert!(B::supports_dtype(&device, DType::Bool(BoolStore::Native)));
#[cfg(feature = "vulkan")]
{
assert!(B::supports_dtype(&device, DType::F16));
assert!(B::supports_dtype(&device, DType::I16));
assert!(B::supports_dtype(&device, DType::I8));
assert!(B::supports_dtype(&device, DType::U16));
assert!(B::supports_dtype(&device, DType::U8));
assert!(!B::supports_dtype(&device, DType::F64));
assert!(!B::supports_dtype(&device, DType::Flex32));
assert!(!B::supports_dtype(&device, DType::BF16));
}
#[cfg(feature = "metal")]
{
assert!(B::supports_dtype(&device, DType::F16));
assert!(B::supports_dtype(&device, DType::I16));
assert!(B::supports_dtype(&device, DType::I8));
assert!(B::supports_dtype(&device, DType::U16));
assert!(B::supports_dtype(&device, DType::U8));
assert!(!B::supports_dtype(&device, DType::F64));
assert!(!B::supports_dtype(&device, DType::BF16));
assert!(!B::supports_dtype(&device, DType::Flex32));
}
#[cfg(all(not(any(feature = "vulkan", feature = "metal")), target_os = "macos"))]
{
assert!(B::supports_dtype(&device, DType::Flex32));
assert!(B::supports_dtype(&device, DType::F16));
assert!(!B::supports_dtype(&device, DType::F64));
assert!(!B::supports_dtype(&device, DType::BF16));
assert!(!B::supports_dtype(&device, DType::I16));
assert!(!B::supports_dtype(&device, DType::I8));
assert!(!B::supports_dtype(&device, DType::U16));
assert!(!B::supports_dtype(&device, DType::U8));
}
#[cfg(not(any(feature = "vulkan", feature = "metal", target_os = "macos")))]
{
assert!(B::supports_dtype(&device, DType::F64));
assert!(B::supports_dtype(&device, DType::Flex32));
assert!(B::supports_dtype(&device, DType::F16));
assert!(!B::supports_dtype(&device, DType::BF16));
assert!(!B::supports_dtype(&device, DType::I16));
assert!(!B::supports_dtype(&device, DType::I8));
assert!(!B::supports_dtype(&device, DType::U16));
assert!(!B::supports_dtype(&device, DType::U8));
}
}
}