use crate::Result;
use async_trait::async_trait;
#[derive(Debug, Clone)]
pub struct BackendCapabilities {
pub name: String,
pub supports_cuda: bool,
pub supports_opencl: bool,
pub supports_vulkan: bool,
pub supports_webgpu: bool,
pub max_threads: u32,
pub max_threads_per_block: u32,
pub max_blocks_per_grid: u32,
pub max_shared_memory: usize,
pub supports_dynamic_parallelism: bool,
pub supports_unified_memory: bool,
pub max_grid_dim: [u32; 3],
pub max_block_dim: [u32; 3],
pub warp_size: u32,
}
#[async_trait(?Send)]
pub trait BackendTrait: Send + Sync {
fn name(&self) -> &str;
fn capabilities(&self) -> &BackendCapabilities;
async fn initialize(&mut self) -> Result<()>;
async fn compile_kernel(&self, source: &str) -> Result<Vec<u8>>;
async fn launch_kernel(
&self,
kernel: &[u8],
grid: (u32, u32, u32),
block: (u32, u32, u32),
args: &[*const u8],
) -> Result<()>;
fn allocate_memory(&self, size: usize) -> Result<*mut u8>;
fn free_memory(&self, ptr: *mut u8) -> Result<()>;
fn copy_memory(
&self,
dst: *mut u8,
src: *const u8,
size: usize,
kind: MemcpyKind,
) -> Result<()>;
fn synchronize(&self) -> Result<()>;
}
#[derive(Debug, Clone, Copy)]
pub enum MemcpyKind {
HostToDevice,
DeviceToHost,
DeviceToDevice,
HostToHost,
}